一些有用的用于 OpenWrt 的 Netfilter iptables 规则。
主要适用于 OpenWrt 路由器作为家庭网关。
OpenWrt Web UI firewall 配置
OpenWrt Web UI - Firewall - Zone Settings - General Settings :
- 取消 Enable SYN-flood protection
- 将 INPUT, OUTPUT, Forward 默认策略均设为 ACCEPT
共通:定义几个 ipset
创建的 ipset 说明:
- trust : 信任的 IP。此 set 里面的IP可以从Internet访问路由器 WAN IP。
- servers : 自己的服务器 / VPS IP。此 set 里面的 IP访问时直连,不走代理。
- cn : 中国 IP。访问时直连。使用这里这里的脚本批量添加。
- nplan : 此 set 存放“不走路由器透明代理/VPN”的局域网设备 IP
- blnet : 此 set 存放“禁止访问 Internet” 的局域网设备 IP
- macblnet : 此 set 存放禁止访问 Internet 的局域网设备 MAC 地址名单
ipset create trust hash:net
ipset add trust 1.2.3.4
ipset create servers hash:net
ipset add servers 1.2.3.4
ipset create cn hash:net
ipset add cn 114.114.114.114
# more...
ipset create nplan hash:net
ipset add nplan 192.168.1.20
ipset create blnet hash:net
ipset create macblnet hash:mac
ip rule add fwmark 0x1/0x1 lookup main prio 1
ip rule add fwmark 0x2/0x2 lookup 10 prio 1
ip rule add fwmark 0x4/0x4 lookup main prio 2
ip rule add to 192.168.0.0/16 lookup main prio 1
ip rule add to 127.0.0.1/8 lookup main prio 1
ip rule add to 10.0.0.1/8 lookup main prio 1
ip rule add lookup 3 prio 3
ip rule add lookup 4 prio 4
ip rule add lookup 10 prio 10
ip rule add lookup 11 prio 11
路由器上配置的 VPN 把默认路由添加到 table 10 里:
ip route add default dev tun0 table 10
fwmark :
- 0x1 : 直连
- 0x2 : 强制走代理
- 0x4 : 路由器上 WAN 做的端口转发流量。直连。
路由器上 VPN 相关 iptables 规则
iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -t nat -A POSTROUTING -o tun+ -s 192.168.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun+ -s 10.0.0.0/8 -j MASQUERADE
禁止局域网里某些 IP 的设备访问 Internet
可以用于禁止破解后的 PS4 自动更新(但能够通过局域网远程安装 pkg)
IP 黑名单需要设备需要配置静态 IP (或路由器 DHCP 里设定静态分配)
iptables -t mangle -I PREROUTING -m set --match-set blnet src ! -d 192.168.0.0/16 -j DROP
iptables -t mangle -A PREROUTING -m set --match-set macblnet src,src ! -d 192.168.0.0/16 -j DROP
完整规则:策略路由 + 直连 + 外网访问安全限制 + shadowsocks 中转 + 禁止某些设备联网
注意: iptables -j CONNMARK 需要 OpenWrt 安装 iptables-mod-conntrack-extra 和 kmod-ipt-conntrack-extra 这两个包。
以下流量直连(不通过路由器的VPN/透明代理)
- 访问中国 IP
- nplan ipset 里的局域网IP访问外网
- 任何Internet IP 主动访问路由器 wan (包括通过路由器端口映射访问 LAN)
- 以上流量的所有反向流量和相关流量。
允许以下流量访问路由器WAN IP 和 / 或 内网
- Internet 访问路由器 WAN IP ssh (tcp/22)
- trust ipset里的 ip 访问路由器 WAN IP
- 显式配置的端口映射规则
对流量打的 mark 说明
- 0x1 : 访问 cn ipset 里的 IP;访问 servers ipset 里的 IP;Internet IP 访问路由器 wan
- 0x2 : (未使用) 强制走路由器VPN/透明代理标记
- 0x4 : 路由器上配置的 shadowsocks relay 等中转的流量标记,需要直连并且不通过 PREROUTING 链上的 REDIRECT 代理。
局域网设备 DNS 劫持规则:
- nplan ipset 里的局域网设备DNS一律直连。
- DNS 设置为国内 IP(如 114.114.114.114) 的直连。
- DNS 设置为国外 IP(如 1.1.1.1, 8.8.8.8)的劫持到路由器自身DNS服务器。
- 推荐路由器 DHCP 直接分配 DNS 服务器地址为自身。
详细规则:(注意各规则有顺序。添加新规则比如新的端口映射需要插入到对应的位置)(旧版)
/etc/firewall.user
LAN_IP=192.168.1.1
ip6tables -A input_lan_rule -p udp --dport 53 -j REJECT
iptables -A input_wan_rule -m set --match-set trust src -j ACCEPT
iptables -A input_wan_rule -p tcp --dport 22 -j ACCEPT
iptables -A forwarding_wan_rule -m set --match-set trust src -j ACCEPT
iptables -A forwarding_wan_rule -m mark --mark 0x4/0x4 -j ACCEPT
iptables -t mangle -A PREROUTING -m set --match-set blnet src ! -d 192.168.0.0/16 -j DROP
iptables -t mangle -A PREROUTING -m set --match-set macblnet src,src ! -d 192.168.0.0/16 -j DROP
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i pppoe-wan -m conntrack --ctstate NEW -j MARK --set-mark 0x1/0x1
iptables -t mangle -A PREROUTING -m set --match-set cn dst -j MARK --set-mark 0x1/0x1
iptables -t mangle -A PREROUTING -m set --match-set servers dst -j MARK --set-mark 0x1/0x1
iptables -t mangle -A PREROUTING ! -d 10.100.0.0/16 -m set --match-set nplan src -j MARK --set-mark 0x1/0x1 # clash fake-ip range
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
iptables -t mangle -A PREROUTING -m mark --mark 0x4/0x4 -j ACCEPT
iptables -t mangle -A PREROUTING -m mark --mark 0x1/0x1 -j ACCEPT
iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -m set --match-set cn dst -j MARK --set-mark 0x1/0x1
iptables -t mangle -A OUTPUT -m set --match-set servers dst -j MARK --set-mark 0x1/0x1
iptables -t nat -A POSTROUTING -o tun+ -s 192.168.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun+ -s 10.0.0.0/8 -j MASQUERADE
iptables -t nat -A OUTPUT -m mark --mark 0x1/0x1 -j ACCEPT
iptables -t nat -A OUTPUT -m mark --mark 0x4/0x4 -j ACCEPT
iptables -t nat -A prerouting_lan_rule -p tcp --dport 53 -m set ! --match-set nplan src -j REDIRECT --to-port 53
iptables -t nat -A prerouting_lan_rule -p udp --dport 53 -m set ! --match-set nplan src -j REDIRECT --to-port 53
iptables -t nat -A prerouting_lan_rule -m mark --mark 0x4/0x4 -j ACCEPT
iptables -t nat -A prerouting_lan_rule -m mark --mark 0x1/0x1 -j ACCEPT
iptables -t nat -A prerouting_wan_rule -p tcp --dport 8081 -j REDIRECT --to-port 80
iptables -t nat -A prerouting_wan_rule -p tcp --dport 3389 -j DNAT --to 192.168.1.20:3389
iptables -t nat -A prerouting_wan_rule -p tcp --dport 8554 -j DNAT --to 192.168.1.20:8554
iptables -t nat -A prerouting_wan_rule -p udp --dport 8554 -j DNAT --to 192.168.1.20:8554
iptables -t nat -A prerouting_wan_rule -p tcp --dport 20001 -j DNAT --to 192.168.1.20:8080
iptables -t nat -A prerouting_wan_rule -m mark --mark 0x4/0x4 -j ACCEPT
iptables -t nat -A postrouting_wan_rule -m mark --mark 0x4/0x4 -j MASQUERADE
SS_IP=1.2.3.4
SS_PORT=443
LOCAL_PORT=21
iptables -t mangle -I PREROUTING -i pppoe-wan -p tcp --dport $LOCAL_PORT -j MARK --set-mark 0x4/0x4
iptables -t mangle -I PREROUTING -i pppoe-wan -p udp --dport $LOCAL_PORT -j MARK --set-mark 0x4/0x4
iptables -t nat -I prerouting_wan_rule -p tcp --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT
iptables -t nat -I prerouting_wan_rule -p udp --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT
iptables -t mangle -I PREROUTING -i br-lan -p tcp -d $LAN_IP --dport $LOCAL_PORT -j MARK --set-mark 0x4/0x4
iptables -t mangle -I PREROUTING -i br-lan -p udp -d $LAN_IP --dport $LOCAL_PORT -j MARK --set-mark 0x4/0x4
iptables -t nat -I prerouting_lan_rule -p tcp -d $LAN_IP --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT
iptables -t nat -I prerouting_lan_rule -p udp -d $LAN_IP --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT
SS_IP=2.3.4.5
SS_PORT=80
LOCAL_PORT=25
iptables -t mangle -I PREROUTING -i pppoe-wan -p tcp --dport $LOCAL_PORT -j MARK --set-mark 0x4/0x4
iptables -t mangle -I PREROUTING -i pppoe-wan -p udp --dport $LOCAL_PORT -j MARK --set-mark 0x4/0x4
iptables -t nat -I prerouting_wan_rule -p tcp --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT
iptables -t nat -I prerouting_wan_rule -p udp --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT
iptables -t mangle -I PREROUTING -i br-lan -p tcp -d $LAN_IP --dport $LOCAL_PORT -j MARK --set-mark 0x4/0x4
iptables -t mangle -I PREROUTING -i br-lan -p udp -d $LAN_IP --dport $LOCAL_PORT -j MARK --set-mark 0x4/0x4
iptables -t nat -I prerouting_lan_rule -p tcp -d $LAN_IP --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT
iptables -t nat -I prerouting_lan_rule -p udp -d $LAN_IP --dport $LOCAL_PORT -j DNAT --to $SS_IP:$SS_PORT