一组 iptables 规则,懂的都懂
挂几个关键词:
- iptables的TPROXY模块
- 解决某些软件不走 PROXY
- 真正的 “全局”
- 代理 Docker Hub
先开启 /etc/sysctl.conf
的 net.ipv4.ip_forward = 1
以下命令假设使用 root 权限,否则自行加上 sudo
# 设置策略路由
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
# DL局域网设备
iptables -t mangle -N V2R
iptables -t mangle -A V2R -d 127.0.0.1/32 -j RETURN
iptables -t mangle -A V2R -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A V2R -d 255.255.255.255/32 -j RETURN
# 直连局域网, 避免 XXXXX 无法启动时无法连网关的 SSH
# 如果你配置的是其他网段(如 10.x.x.x 等), 则修改成自己的
iptables -t mangle -A V2R -d 192.168.0.0/16 -p tcp -j RETURN
# 直连局域网, 53 端口除外(因为要使用 XXX 的 DNS)
iptables -t mangle -A V2R -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
# 直连 SO_MARK 为 0xff 的流量, 此规则目的是解决占用大量CPU
iptables -t mangle -A V2R -j RETURN -m mark --mark 0xff
# 给 UDP 打标记 1, 转发至 10801 端口
iptables -t mangle -A V2R -p udp -j TPROXY --on-ip 127.0.0.1 --on-port 10801 --tproxy-mark 1
# 给 TCP 打标记 1, 转发至 10801 端口
iptables -t mangle -A V2R -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 10801 --tproxy-mark 1
iptables -t mangle -A PREROUTING -j V2R
# DL网关本机
iptables -t mangle -N V2R_MASK
iptables -t mangle -A V2R_MASK -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A V2R_MASK -d 255.255.255.255/32 -j RETURN
# 直连局域网
iptables -t mangle -A V2R_MASK -d 192.168.0.0/16 -p tcp -j RETURN
# 直连局域网, 53 端口除外
iptables -t mangle -A V2R_MASK -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
# 直连 SO_MARK 为 0xff 的流量, 此规则目的是避免代理本机(网关)流量出现回环问题
iptables -t mangle -A V2R_MASK -j RETURN -m mark --mark 0xff
iptables -t mangle -A V2R_MASK -p udp -j MARK --set-mark 1
iptables -t mangle -A V2R_MASK -p tcp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -j V2R_MASK
# 新建 DIVERT 规则, 避免已有连接的包二次通过 TPROXY, 理论上有一定的性能提升
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -I PREROUTING -p tcp -m socket -j DIVERT
记得设置开机自启
mkdir -p /etc/iptables
iptables-save > /etc/iptables/rules.v4
创建文件 /etc/systemd/system/tproxy.service
[Unit]
Description=TPROXY rules
After=network.target
Wants=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
# 注意分号前后要有空格
ExecStart=/sbin/ip rule add fwmark 1 table 100 ; /sbin/ip route add local 0.0.0.0/0 dev lo table 100 ; /sbin/iptables-restore /etc/iptables/rules.v4
ExecStop=/sbin/ip rule del fwmark 1 table 100 ; /sbin/ip route del local 0.0.0.0/0 dev lo table 100 ; /sbin/iptables -t mangle -F
[Install]
WantedBy=multi-user.target