人类精神必须置于技术之上。
阿尔伯特•爱因斯坦(Albert Einstein),科学家
在上一篇中,我们分享了软路由的动态域名应用的功能,让你在世界各地都可以通过自己的动态域名来访问家庭网络服务,不过大家有没有发现,光是有域名,我还是访问不了家庭网络,什么 FTP 啊,影视页面啊什么的都进不去。
这就对了,因为动态域名只是让互联网知道这个域名对应的 IP 地址,但你的软路由自带的防火墙功能把外面所有连入的主动请求都挡住了,不让他们进门,所以你在家里设置好的服务和应用,从公网根本无法进入,就好比别人来你们单位,但没有预约和授权,保安把无关人员都挡在单位大门外了。
那如何将我的服务让公网可以连接呢?
看到刚才我提到的防火墙了吗?对,这篇要分享的就是防火墙。而让相关的服务通过防火墙这个功能在一般的路由器中被称作“端口映射”,在 Openwrt 中被称为“端口转发”。当然,我们不必纠结如何称呼,你只要知道这是干什么的就行。
这里插一嘴,由于之前使用的 HomeLede 在实际应用中感觉不够稳定,存在 CPU 软中断会随着使用时间增长而增长,因此,考虑到稳定性,本人已更换为官方 Openwrt 最新的稳定版。同时发现官方版的界面也挺清爽舒适的,就没有更换界面,今后的截图大概率是官方版的界面了,Openwrt 各种设置大同小异,可能点击的位置会有一些不一样。
如图,点击“网络”→“防火墙”→“端口转发”,大家应该可以看到我这里已经有几个映射好的端口,这个界面左下角会有个“新增”,需要添加端口就点这个按钮。
这些都设置好记得按右下角的“保存”,我们可以看到“常规设置”旁边还有个“高级设置”,那一般不用管,默认就行,如果你对公网连入的 IP 有限制,就可以在“高级设置”中设置。“保存”后,你新建的“端口转发”就会出现列表了,但此时该“端口转发”并不会起作用,我们需要再按一下页面右下的“保存并应用”,不知道你有没有发现,我们任何的设置,都要“保存并应用”后才会生效。
我们知道一般的路由器会有“DMZ”这个功能,就是把某个设备暴露在公网中,也是通过端口转发来实现的,请看图:
如果之后还有端口需要转发的,那要这个DMZ的顺序调节到最后,不然,排在DMZ之后的转发都会失效。
端口转发,或者说端口映射的设置就介绍完了,我们可以看到它旁边还有个“通信规则”,这个我们一般不需要去设置,除非你需要设置特殊的传输策略。如果你的 ISP 给你 IPv6 的地址,那就需要用到这里默认的配置。说到这里,笔者又要挥泪了😭,前几天不知道怎么回事,默认配置突然少了(关于 IPv6),所以拨号上网后,IPv6 地址死活获取不了,我还梳理了一遍软件包,没发现有问题,反复重启也没用,最后偶然间发现通信规则干净了很多,然后从备份文件里把默认配置找回来,重启防火墙后马上就能获取 IPv6地址了,在此,既是给大伙儿提个醒,也是为自己记录备查。
就是这些“Allow”,千万别干没了,如果不幸误删,可以把以下内容复制到“/etc/config/firewall”文件中:
config rule
option name 'Allow-DHCP-Renew'
option src 'wan'
option proto 'udp'
option dest_port '68'
option target 'ACCEPT'
option family 'ipv4'
config rule
option name 'Allow-Ping'
option src 'wan'
option proto 'icmp'
option icmp_type 'echo-request'
option family 'ipv4'
option target 'ACCEPT'
config rule
option name 'Allow-IGMP'
option src 'wan'
option proto 'igmp'
option family 'ipv4'
option target 'ACCEPT'
config rule
option name 'Allow-DHCPv6'
option src 'wan'
option proto 'udp'
option dest_port '546'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-MLD'
option src 'wan'
option proto 'icmp'
option family 'ipv6'
option target 'ACCEPT'
#src_ip 改为你自己在“网络”→“接口”→“全局网络选项”中“IPv6 ULA 前缀”的配置。
list src_ip 'fe80::/10'
list icmp_type '130/0'
list icmp_type '131/0'
list icmp_type '132/0'
list icmp_type '143/0'
config rule
option name 'Allow-ICMPv6-Input'
option src 'wan'
option proto 'icmp'
list icmp_type 'echo-request'
list icmp_type 'echo-reply'
list icmp_type 'destination-unreachable'
list icmp_type 'packet-too-big'
list icmp_type 'time-exceeded'
list icmp_type 'bad-header'
list icmp_type 'unknown-header-type'
list icmp_type 'router-solicitation'
list icmp_type 'neighbour-solicitation'
list icmp_type 'router-advertisement'
list icmp_type 'neighbour-advertisement'
option limit '1000/sec'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-ICMPv6-Forward'
option src 'wan'
option dest '*'
option proto 'icmp'
list icmp_type 'echo-request'
list icmp_type 'echo-reply'
list icmp_type 'destination-unreachable'
list icmp_type 'packet-too-big'
list icmp_type 'time-exceeded'
list icmp_type 'bad-header'
list icmp_type 'unknown-header-type'
option limit '1000/sec'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-IPSec-ESP'
option src 'wan'
option dest 'lan'
option proto 'esp'
option target 'ACCEPT'
config rule
option name 'Allow-ISAKMP'
option src 'wan'
option dest 'lan'
option dest_port '500'
option proto 'udp'
option target 'ACCEPT'
config rule
option target 'ACCEPT'
option src 'wan'
option dest 'lan'
option family 'ipv6'
option proto 'tcp'
option dest_port '18080'
option name 'Allow-HTTPv6'
在 Openwrt 中,使用 vi 命令可以编辑文件:
vi /etc/config/firewall
最后介绍一下“NAT 规则”,如果你使用的防火墙是新版的 nftables,那不用看下去了,我试了好多次,这个MS没用,如果你知道 nftables 下的使用方式,请务必要回复留言告诉我,在此先行表示感谢!👏👏👏
如果你使用的防火墙是iptables,那么这是等效于 DMZ 的 NAT1 方式,好处是不需要与端口转发放在一起,那就不用调整顺序了,比 DMZ 更优的是还可以设置多个主机的 NAT等级为NAT1(多个我没试过,理论上应该可以,如有错误,也请回复留言告诉我)。至于什么是 NAT1,玩网络游戏的、挂网心云等的都懂的;不懂的可以自行度娘,这里不作进一步解释了。
软路由可以干什么之三介绍完了,感谢耐心阅读。这篇防火墙这块功能其实非常深奥,也很有玩头,想玩好,要靠自己不断深入理解和学习,这里,笔者只是分享一些基础的东西,算是抛个砖,大家的玉都扔过来吧。如果还有什么疑问,可以在评论区留言交流哦。敬请期待下一篇《安装和使用软路由【进阶篇】——软路由可以干什么?(四)》。