设置openwrt路由器的防火墙_允许从外网访问_ipv6服务_ipv4端口映射(图文)
转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-02.
参考文章:
以下的操作/描述/图片,没有特别说明的,都是基于OpenWRT-18.06版本。
现在家庭宽带的运营商,都已经提供 ipv6 了。
当你拨号上网后,运营商给你的路由器分配一个 ipv6 的同时,还会给你分配一个 ipv6 的前缀。
这样,你路由器后面的所有设备都会得到一个公网的 ipv6 地址。
但是,你会发现,内网的设备,虽然有公网ipv6地址,但无法从外网访问它们。仅能从外网ping通它们。
这是因为路由器的缺省设置。为了保护内网设备,缺省没有把内网设备暴露到公网上,仅仅允许从公网ping它们。
如果你内网有一台机器,提供了https或别的什么的服务,需要允许从公网访问它。
就需要修改路由器防火墙的设置,允许从公网访问这台机器的指定端口。
内网机器需要使用 eui64 的 ipv6地址,才能安全的开放 指定的内网机器。
OpenWRT
OpenWRT 的防火墙设置:
在Traffic rules(流量规则)中:
添加一个forward规则:
ipv6已经是公网地址,无需nat转换/端口映射,只需转发即可。这样不会增加路由器的负荷。
Openwrt-18.06,
返回后,可以看到有一个"未命名的规则",编辑它:
Openwrt-21.02,直接在 Traffic rules 页面的最下面,"添加"即可。
按需设置Destination address(目标地址):
- 使用无状态的eui64地址, 它的后缀是不变的。
- 内网设备的ipv6地址,
前半部分是ipv6前缀,是运营商分配的。重拨后会变化。
后半部分,如果不是eui64,就是随机生成的,也会变。
如果是eui64,则与mac地址相关,不会变化,除非换网卡。 - 如果整个ipv6都会变,防火墙规则就没办法写了。除非全网放行(内网目标地址掩码填
::/0
或any
)。或关闭防火墙。 - 所以配置内网设备的ipv6地址为eui64,防火墙的内网目标地址掩码填
::xxxx:xxxx:xxxx:xxxx/::FFFF:FFFF:FFFF:FFFF
, 这样就比较安全了。
(ipv6地址掩码比v4灵活,v6可以掩前面,也可以掩后面。v4就只能掩前面) - 还有一个ipv6地址可以使用(有状态地址),即dhcpdv6分配的地址。每台客户机都会自己提供一个DUID,且不会变,分配的ipv6后缀也就不变,相对固定。
- (结论:openwrt不能指定) 在openwrt中
Network
->DHCP and DNS
->Static Leases(静态地址)
中,
(openwrt不支持直接指定新的ipv6后缀/或指定DUID。除非客户机自己没有提供DUID)- 添加一条记录,指定
MAC-Address
,指定IPv6-Suffix
(格式为四个hex数,如 AABB),这个办法不能指定ipv6后缀。 - 添加一条记录,指定
MAC-Address
,指定DUID
,重启客户机。看看拿到什么IP。这个办法也不能指定DUID,不能得到新ipv6后缀。
- 添加一条记录,指定
- 修改客户机的 DUID ,看 【Linux ipv6 无状态 设置为 eui64】 中 “有状态ipv6”部分。指定新的DUID,就有一个新的固定的IPv6后缀。
- (结论:openwrt不能指定) 在openwrt中
- 确定客户机的ipv6后缀之后。比如
2408:ebcd:ebcd:ebcd::789
, 那么防火墙规则中的目标地址写::789/::ffff:ffff:ffff:ffff
IPv6 的双冒号简写。
比如: 你的ipv6地址为,2408:ebcd:ebcd:ebcd:5678:5678:5678:5678
则目标地址掩码填, 0:0:0:0:5678:5678:5678:5678/0:0:0:0:FFFF:FFFF:FFFF:FFFF
连续的 0 简写为两个冒号,即,::5678:5678:5678:5678/::FFFF:FFFF:FFFF:FFFF
- 设置Linux的ipv6为eui64模式, 请参考:【Linux ipv6 无状态 设置为 eui64】
- 获取本机ipv4/ipv6,更新ddns, 请参考:【Linux中获取本机的最新IPv6地址_更新ddns的脚本】
其他选项框
- 协议族 必须选择
ipv6 only
, 因为整条规则只针对ipv6协议。 - 协议按需
TCP
,UDP
,TCP/UDP
... - Source zone 选 WAN(包含wan6)
- Destination Zone(目标区域),选择
Any zone(forward)
或者lan
都可以。 - 目标端口,按需填写。多个端口用 空格隔开。
- 开放ipv6的端口访问,数据包是直达内网机器。所以不存在外网端口的概念。
不存在内外网端口不相同的情况。所以只有这一个地方填写端口。
- 开放ipv6的端口访问,数据包是直达内网机器。所以不存在外网端口的概念。
openwrt-18.06
openwrt-R9.12
openwrt-21.02
openwrt-22.03
-
这个图片中的设置,本质上就是添加了多条forward规则(tcp/udp/一个端口,各一条)(openwrt-18.06)。
- 如果选
Any zone(forward)
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
- 如果选
lan
ip6tables -A FORWARD -i pppoe-wan -o br-lan -d ::5678:5678:5678/::ffff:ffff:ffff:ffff -p tcp -m tcp --dport 443 -j ACCEPT
Device (input)
不是用来开放内网机器访问的。是用来开放路由器本身的端口访问, 这时候Destination address(目标地址)要留空,或写路由器自己的IP。
ip6tables -A INPUT -i pppoe-wan -p tcp -m tcp --dport 443 -j ACCEPT
- 如果选
-
对于openwrt-22.03,使用的是fw4,即nftables。实际在 chain forward 中加了条规则。
- 如果选
Any zone(forward)
或lan
。
其中 eth1 是 wan 口网卡。选择ipv6 only
。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 } }
Device (input)
不是用来开放内网机器访问的。是用来开放路由器本身的端口访问。table inet fw4 { chain input { type filter hook input priority filter; policy accept; iifname "eth1" meta nfproto ipv6 tcp dport 443 counter accept #如果选"ipv6 only" iifname "eth1" tcp dport 443 counter accept #如果选"ipv4 & ipv6" } }
- 如果选
-
另外,现在的运营商已经封禁80,443两个端口(ipv4和ipv6)。所以这两个端口开放了也用不了。其他端口可以用。
华硕路由器/梅林固件 的ipv6防火墙设置方法类似
梅林是基于华硕的改版,原本是基于博通的CPU。
以下,是借用了官方的图片,加了些字。
-
这样设置,同时限制了ipv6后缀/端口/协议,更安全。
-
开放ipv6的端口访问,数据包是直达内网机器。所以不存在外网端口的概念。
-
通过 ssh 登录华硕路由器/梅林,你会发现,本质也是加了条规则(梅林/3.0.0.4.384_81049)。
ip6tables -A FORWARD -d ::5678:5678:5678:5678/::ffff:ffff:ffff:ffff -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
规则和openwrt的稍有差异。效果基本一样。 -
华硕的的规则没有指定进/出的网口,只是匹配了初始连接。openwrt的规则指定的进/出的网口,匹配的不仅是初始连接。
-
[路由器梅林固件如何设置IPV6端口转发]
有文章说,梅林固件,不支持双冒号的缩写。
要写全0:0:0:0:5678:5678:5678:5678/0:0:0:0:ffff:ffff:ffff:ffff
其他固件的IPv6防火墙设置
- 老毛子Padavan
也是基于华硕的改版,原本是基于MTK的CPU。
开放 内网 IPv6 服务,需要写 ip6tables 的 forward 规则。
我没用过。请自行上网搜索相关文章。 - 潘多拉PandoraBox
是openwrt的衍生版
如果web页没地方设置,可以试试用 uci 命令行设置。
我没用过。请自行搜索相关文章。 - 高格
是openwrt的衍生版
我没用过,好像不支持ipv6。请自行搜索相关文章。 - iKuai爱快
爱快路由3.7.0及以上版本开始支持 IPV6 协议的 ACL 规则。
我没用过。请自行搜索相关文章。
防火墙中的默认规则 drop/reject
- Network -> Firewall -> General Settings 中:
- General Settings 的 Forward 默认规则改为 drop, 影响从外网访问内网lan,不开放的ipv6地址和端口。
修改的是iptables/ip6tables
的 filter->FORWARD 的最后一条
-A FORWARD -j DROP
- Zones 的 WAN => [--] 的 Input 默认规则改为 drop,影响从外网访问路由器本身的wan(ipv4/6),lan(ipv6)地址,不开放的端口。不影响端口映射。
修改的是iptables/ip6tables
的 filter->INPUT 的最后一条
-A INPUT -i pppoe-wan -j DROP
,
-A INPUT -i vwan1 -j DROP
- Zones 的 WAN => [--] 的 Forward 默认规则改为 drop,影响从外网访问非lan(包括wan,未设置为lan的其他接口),不开放的地址和端口。
修改的是iptables/ip6tables
的 filter->FORWARD 的倒数第二条
-A FORWARD -i pppoe-wan -j zone_wan_dest_DROP
,
-A FORWARD -i vwan1 -j zone_wan_dest_DROP
,
-A zone_wan_dest_DROP -o pppoe-wan -j DROP
,
-A zone_wan_dest_DROP -o vwan1 -j DROP
- General Settings 的 Forward 默认规则改为 drop, 影响从外网访问内网lan,不开放的ipv6地址和端口。
如果你有公网IPv4,映射端口
-
公网 ipv4 映射端口的设置,只解决ipv4的访问。与ipv6无关。
-
ipv4的端口映射,外网端口和内网端口,可以相同,也可以不同。
-
因为内网服务器的ipv4不是公网,只有路由器的wan是公网ipv4,所以就不能用转发。要用端口映射。
"端口映射",有的路由器叫"Port Forwards",有的叫"Port Mapping"。 -
OpenWRT: Network -> Firewall -> Port Forwards , 添加一个新的端口映射。
填写"名称","协议","外网端口","内网地址","内网地址的端口",点击"添加"。最后别忘了"保存&提交"。 -
图中的例子就是,假如你的公网IP是123.123.123.123,
你可以用浏览器访问,https://123.123.123.123:999/
,就是内网的https://192.168.2.123:443/
-
openwrt-18.06 的 iptables 规则。
外网进来的的数据包,走的这条规则(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
内网机器通过路由器wan IP访问映射端口。是由另外一对SNAT
,DNAT
规则解决的。
iptables -t nat -A PREROUTING -i br-lan -s 192.168.2.0/24 -d 123.123.123.123/32 -p tcp -m tcp --dport 999 -j DNAT --to-destination 192.168.2.123:443
iptables -t nat -A POSTROUTING -o br-lan -s 192.168.2.0/24 -d 192.168.2.123/32 -p tcp -m tcp --dport 443 -j SNAT --to-source 192.168.2.1
-
对于使用 fw4 的 openwrt-22.03,是这三条规则,和一条伪装规则。
## 其中 eth1 是 wan,123.123.123.123 是 wan IP,192.168.2.1 是 lan IP。 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" } }
-
梅林/3.0.0.4.384_82072_koolshare 的 iptables 规则。
外网/内网进来的的数据包,走的这条规则(梅林/3.0.0.4.384_82072_koolshare)。
iptables -t nat -A PREROUTING -d 123.123.123.123/32 -p tcp -m tcp --dport 999 -j DNAT --to-destination 192.168.2.123:443
外网访问时,内网服务器的返回数据包,走的这条规则。(内网所有的设备通过路由器上网,也是走的这条规则)
iptables -t nat -A POSTROUTING ! -d 123.123.123.123/32 -o ppp0 -j MASQUERADE--mode fullcone
内网机器访问映射端口时, 返回数据包。
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.0/24 -o br0 -j MASQUERADE
-
如果你是多拨的话。
- 映射到路由器自己的端口,所有公网IPv4的端口映射都有效。
- 映射到内网其他机器的端口,只有第一个公网IPv4的端口映射有效。
因为,虽然其他公网ipv4来的数据包能成功到达内网服务,但内网服务的返回数据包经过 MASQUERADE 时,总是使用第一个ipv4。
如果你还做了多拨的负载均衡,那这个端口映射的表现,就看均衡策略了。 - 有个叫"源进源出"的配置(我不会),可以解决多WAN口访问的问题。你可以上网搜搜。
-
如果你还有个旁路由,要做IPv4端口映射。
参考【主路由拨号_openwrt做旁路由_ipv4端口映射的设置】
其他
- 有公网 ipv6,就设ipv6的转发规则,开放 ipv6 的访问。
有公网 ipv4,就做ipv4的端口映射,开放 ipv4 的访问。
ipv4 和 ipv6 的设置,互不干扰。
- 【OpenWRT 在 fw4 中使用 ipset 匹配来源 IP】
- 【ProxmoxVE_PVE防火墙_本机静态路由_本机端口转发_修改默认8006端口_旁路由VM】
- 用nftables 设置防火墙规则,保护 sshd服务。
【Debian10_Centos8_fail2ban_sshd算法_限制连接数】
---end---
转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/11781359.html 来自osnosn的博客