33# # Reference: https://github.com/scenery/mihomo-tproxy-docker
44
55# configs
6+ ENFORCE_LAN_SRC_IP4=${ENFORCE_LAN_SRC_IP4:- " " }
7+ ENFORCE_LAN_SRC_IP6=${ENFORCE_LAN_SRC_IP6:- " " }
68ALLOW_QUIC=${ALLOW_QUIC:- " false" }
79LOCAL_DNS=${LOCAL_DNS:- " 114.114.114.114" }
810REMOTE_DNS=${REMOTE_DNS:- " 1.1.1.1 8.8.8.8" }
911XRAY_INBOUND_PORT=${XRAY_INBOUND_PORT:- " 12345" }
1012XRAY_INBOUND_MARK=${XRAY_INBOUND_MARK:- " 0x1" }
1113ROUTE_TABLE=${ROUTE_TABLE:- " 100" }
12- RESERVED_IPS=${RESERVED_IPS:- " 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4" }
13- NFT_RESERVED_IPS=" { $( echo $RESERVED_IPS | sed ' s/ /, /g' ) }"
14+
15+ # reserved ip ranges
16+ RESERVED_IP4=${RESERVED_IP4:- " 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4" }
17+ RESERVED_IP6=${RESERVED_IP6:- " ::1/128 fc00::/7 fe80::/10" }
18+ NFT_RESERVED_IP4=" { $( echo $RESERVED_IP4 | sed ' s/ /, /g' ) }"
19+ NFT_RESERVED_IP6=" { $( echo $RESERVED_IP6 | sed ' s/ /, /g' ) }"
1420
1521# paths
1622MAIN_NFT=" /tmp/main.nft"
@@ -22,24 +28,37 @@ setup_nftables() {
2228
2329 # Start of main.nft
2430 cat > " $MAIN_NFT " << EOF
25- # 1. 创建表
26- table ip xray {
31+ table inet xray {
2732
28- # 2. PRE_XRAY 链 (用于 NOTRACK)
33+ # PRE_XRAY 链 (用于 NOTRACK)
2934 # 确保在连接跟踪之前处理 (priority raw = -300)
3035 chain PRE_XRAY {
3136 type filter hook prerouting priority raw; policy accept;
3237
33- # 忽略代理的连接跟踪( 对应 iptables -t raw -A PREROUTING -m mark --mark 1 -j NOTRACK)
38+ # 忽略代理的连接跟踪 ( 对应 iptables -t raw -A PREROUTING -m mark --mark 1 -j NOTRACK)
3439 meta mark == $XRAY_INBOUND_MARK notrack
3540 }
3641
37- # 3. XRAY 链 (用于 TPROXY 规则)
42+ # XRAY 链 (用于 TPROXY 规则)
3843 # priority mangle = -150
3944 chain XRAY {
4045 type filter hook prerouting priority mangle; policy accept;
4146EOF
4247
48+ # Enforce src ip (ipv4) must be in LAN
49+ if [ " $ENFORCE_LAN_SRC_IP4 " != " " ]; then
50+ cat >> " $MAIN_NFT " << EOF
51+ ip saddr != $ENFORCE_LAN_SRC_IP4 return
52+ EOF
53+ fi
54+
55+ # Enforce src ip (ipv6) must be in LAN
56+ if [ " $ENFORCE_LAN_SRC_IP6 " != " " ]; then
57+ cat >> " $MAIN_NFT " << EOF
58+ ip6 saddr != $ENFORCE_LAN_SRC_IP6 return
59+ EOF
60+ fi
61+
4362 # Add QUIC rule if needed
4463 if [ " $ALLOW_QUIC " = " false" ]; then
4564 cat >> " $MAIN_NFT " << EOF
5574 tcp dport 22 return
5675
5776 # 不处理目标地址是局域网的流量 (私有网络)
58- ip daddr $NFT_RESERVED_IPS return
77+ ip daddr $NFT_RESERVED_IP4 return
78+ ip6 daddr $NFT_RESERVED_IP6 return
5979
6080 # --- TPROXY 转发规则 ---
6181
62- # TCP UDP 流量: 标记 1 并重定向到 XRAY_INBOUND_PORT
63- ip protocol tcp tproxy to 127.0.0.1:$XRAY_INBOUND_PORT meta mark set $XRAY_INBOUND_MARK
64- ip protocol udp tproxy to 127.0.0.1:$XRAY_INBOUND_PORT meta mark set $XRAY_INBOUND_MARK
82+ # 对 IPv4 的 TCP/UDP 流量进行 TPROXY (使用 meta nfproto)
83+ meta nfproto ipv4 meta l4proto { tcp, udp } tproxy ip to 127.0.0.1:12345 meta mark set $XRAY_INBOUND_MARK
84+
85+ # 对 IPv6 的 TCP/UDP 流量进行 TPROXY (使用 meta nfproto)
86+ meta nfproto ipv6 meta l4proto { tcp, udp } tproxy ip6 to [::1]:12345 meta mark set $XRAY_INBOUND_MARK
87+
6588 }
6689
6790 # 4. OUTPUT 链
0 commit comments