路由器防火墙配置:允许从外网访问IPv6服务及IPv4端口映射
路由器防火墙配置:允许从外网访问IPv6服务及IPv4端口映射
随着家庭宽带运营商普遍提供IPv6服务,如何正确配置路由器防火墙以允许从外网访问内网设备的IPv6服务成为了一个重要话题。本文将详细介绍在OpenWRT路由器上配置防火墙,允许从外网访问内网的IPv6服务,并进行IPv4端口映射的具体步骤。
OpenWRT防火墙设置
基本概念
当你通过家庭宽带拨号上网后,运营商会分配给你一个IPv6地址和一个IPv6前缀。这意味着你路由器后面的设备都会获得一个公网IPv6地址。但是,默认情况下,内网设备虽然有公网IPv6地址,却无法从外网直接访问,仅能被外网ping通。这是因为路由器的缺省设置为了保护内网设备,没有将它们暴露到公网上。
如果你需要从公网访问内网设备提供的HTTPS或其他服务,就需要修改路由器防火墙的设置,允许从公网访问指定设备的指定端口。内网设备需要使用EUI-64格式的IPv6地址,才能安全地开放指定的内网机器。
配置步骤
OpenWRT的防火墙设置界面
添加Forward规则
IPv6已经是公网地址,无需NAT转换或端口映射,只需转发即可。这样不会增加路由器的负荷。
对于OpenWRT-18.06版本,返回后可以看到一个"未命名的规则",编辑它;对于OpenWRT-21.02版本,可以直接在Traffic rules页面的最下面添加。
设置目标地址
- 使用无状态的EUI-64地址:它的后缀是不变的。
- 内网设备的IPv6地址前半部分是IPv6前缀,是运营商分配的,重拨后会变化;后半部分如果是随机生成的也会变,但如果是EUI-64格式则与MAC地址相关,不会变化(除非更换网卡)。
- 如果整个IPv6地址都会变,防火墙规则就无法固定。因此需要配置内网设备的IPv6地址为EUI-64格式,防火墙的内网目标地址掩码填写
::xxxx:xxxx:xxxx:xxxx/::FFFF:FFFF:FFFF:FFFF
。
其他选项设置
- 协议族必须选择"IPv6 only",因为整条规则只针对IPv6协议。
- 协议按需选择TCP、UDP或TCP/UDP。
- Source zone选择WAN(包含WAN6)。
- Destination Zone选择"Any zone(forward)"或"lan"都可以。
- 目标端口按需填写,多个端口用空格隔开。
- 开放IPv6的端口访问,数据包是直达内网机器,不存在外网端口的概念。
实际规则示例
对于OpenWRT-18.06版本:
ip6tables -A FORWARD -i pppoe-wan -d ::5678:5678:5678/::ffff:ffff:ffff:ffff -p tcp -m tcp --dport 443 -j ACCEPT
ip6tables -A FORWARD -i pppoe-wan -d ::5678:5678:5678/::ffff:ffff:ffff:ffff -p udp -m udp --dport 443 -j ACCEPT
对于OpenWRT-22.03版本(使用nftables):
table inet fw4 {
chain forward {
type filter hook forward priority filter; policy drop;
iifname "eth1" ip6 daddr & ::ffff:ffff:ffff:ffff == ::5678:5678:5678:5678 tcp dport 443 counter accept
}
}
其他固件的IPv6防火墙设置
- 华硕路由器/梅林固件:设置方法类似,通过SSH登录后发现本质也是添加iptables规则。
- 老毛子Padavan:基于华硕的改版,需要手动添加ip6tables的forward规则。
- 潘多拉PandoraBox:是OpenWRT的衍生版,可以通过uci命令行设置。
- 高格:是OpenWRT的衍生版,据说不支持IPv6。
- iKuai爱快:3.7.0及以上版本开始支持IPv6的ACL规则。
防火墙中的默认规则
在网络防火墙的通用设置中,可以将Forward的默认规则改为drop,影响从外网访问内网LAN,不开放的IPv6地址和端口。这会修改iptables/ip6tables的filter->FORWARD的最后一条规则。
公网IPv4端口映射
如果你有公网IPv4地址,还需要进行IPv4端口映射。这与IPv6无关,但可以同时配置以支持IPv4访问。
配置步骤
- 在OpenWRT中,通过Network -> Firewall -> Port Forwards添加一个新的端口映射。
- 填写名称、协议、外网端口、内网地址和内网端口,最后保存并提交。
实际规则示例
对于OpenWRT-18.06版本:
iptables -t nat -A PREROUTING -i pppoe-wan -p tcp -m tcp --dport 999 -j DNAT --to-destination 192.168.2.123:443
iptables -t nat -A POSTROUTING -o pppoe-wan -j MASQUERADE
对于OpenWRT-22.03版本(使用nftables):
table inet fw4 {
chain dstnat {
type nat hook prerouting priority dstnat;
iifname "br-lan" ip saddr 192.168.2.0/24 ip daddr 123.123.123.123 tcp dport 999 dnat ip to 192.168.2.123:443 comment "(reflection)"
iifname "eth1" meta nfproto ipv4 tcp dport 999 counter dnat ip to 192.168.2.123:443
}
chain srcnat {
type nat hook postrouting priority srcnat;
oifname "br-lan" ip saddr 192.168.2.0/24 ip daddr 192.168.2.123 tcp dport 443 snat ip to 192.168.2.1 comment "(reflection)"
oifname "eth1" meta nfproto ipv4 masquerade comment "Masquerade IPv4 wan traffic"
}
}
多拨和旁路由情况
- 映射到路由器自己的端口,所有公网IPv4的端口映射都有效。
- 映射到内网其他机器的端口,只有第一个公网IPv4的端口映射有效。
- 如果有旁路由,参考相关设置方法。
总结
- 有公网IPv6就设IPv6的转发规则,开放IPv6的访问。
- 有公网IPv4就做IPv4的端口映射,开放IPv4的访问。
- IPv4和IPv6的设置互不干扰。
