OpenWrt/Firewall

OpenWrt/Firewall

一些有用的用于 OpenWrt 的 Netfilter iptables 规则。

主要适用于 OpenWrt 路由器作为家庭网关。

脚本

  • 重启防火墙: fw3 restart ( /etc/init.d/firewall restart 亦可,但后者有时执行时会卡住,原因不明)
    • 会执行 /etc/firewall.user 用户自定义防火墙脚本。

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

Last update: 2023-12-15 01:32:29 UTC