要解决的问题
在服务器搭建了nacos环境后,想通过防火墙策略限制网络访问,保证安全。因为是暴露在公网环境中,所以只想让1xx.1xx.1xx.1xx这个IP能访问到8848这个端口。其它IP的访问不可用。
背景环境
[root@owxwoldsev23pa~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
[root@owxwoldsev23pa~]# firewall-cmd --version
0.6.3
[root@owxwoldsev23pa ~]#
过程分析
1、在防火墙公共域中开放了8848端口,所有网络均可访问到8848端口。
2、以1xx.1xx.1xx.1xx、2xx.2xx.2xx.2xx为实验增加策略:
允许1xx.1xx.1xx.1xx访问:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="1xx.1xx.1xx.1xx" port protocol="tcp" port="8848" accept"
拒绝2xx.2xx.2xx.2xx访问
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="2xx.2xx.2xx.2xx" port protocol="tcp" port="8848" drop"
测试结果:正确,符合预期。
但上面的测试不全面:使用另外一个ip(如:3xx.3xx.3xx.3xx)访问,依然能访问到,这样的策略可不行。
为什么不行呢?因为没有对3xx.3xx.3xx.3xx作出限制策略。但不能一一列举出全网IP。
接着继续改进:
查阅资料后得知大意是这样的:firewall先执行log、再执行reject、drop策略、再执行accept策略。同时配合使用priority属性,调整策略执行顺序的优先级,并增加一条0.0.0.0/0的拒绝策略。
允许1xx.1xx.1xx.1xx访问:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" priority=-3 source address="1xx.1xx.1xx.1xx" port protocol="tcp" port="8848" accept"
拒绝其它访问:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" priority=3 source address="0.0.0.0/0" port protocol="tcp" port="8848" drop"
在大脑中一片欢喜,因为先提高了accept优先级,先执行了1xx的accept 再执行 0.0.0.0的drop策略。心想此举必成。
结果:Error: INVALID_RULE: bad attribute ‘priority’
不应该啊,一百万个XXX!
好,继续查资料,该过程省略…1000字…
有2个点,大家注意不要踩了。
1、怀疑firewall版本过低,这也是为什么在上文背景环境中特别说明。事实上确实是版本过低,那就找一个能支持priority属性的版本,找阿找没找到明确的资料,只是在github中wiki找到最低版本的0.7.5中提到了priority属性,所以我的理解应该是在0.7.5之后的版本中增加了该属性。于是想着那就升级了再说,不行就升级到最新的1.1.0版本。
2、升级失败,为什么呢,因为yum源中没有找到firewall新版本,难道要源码编译安装吗?不要啊,放弃吧。
yum源没有新版本,可能是跟OS版本有关,确实应该是这个问题,那要升级os吗?不可能的,别多想了。
centos8以上应该是支持了。
至此,灰心丧气的结束了一天。
如何解决
第二天,咨询了一位网络朋友,直接肯定的说:放弃firewall,换iptables,并且分分钟就把命令脚本发来给我了。
要不就按他说的去执行吧,反正结果是预期的就行了。
再继续纠结了好一会儿,还是继续了解firewall,它应该是有这种场景的解决方案的,是我没弄清楚罢了。
继续补知识吧,网上一大堆资料,比如在trust信任域做等等。
过程太痛苦,就不多废话了,我是这样处理的:
1、public公共域中关闭8848端口开放。也就是说本地服务启动后谁也别想来访问,我不接受。
2、增加白名单策略:一条就行
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="1xx.1xx.1xx.1xx" port protocol="tcp" port="8848" accept"
好了,就这样解决了问题,恍然大悟,原来如此简单哦,是自己把自己绕死了。也请大家看到后批评指正~
如有更好方法请赐教,感谢!
PS:
1、记一哈public.xml内容
<!--
<port protocol="tcp" port="8848"/>
-->
<rule family="ipv4">
<source address="1xx.1xx.1xx.1xx"/>
<port protocol="tcp" port="8848"/>
<accept/>
</rule>
firewall-cmd --reload
firewall-cmd --list-all
2、nacos端口,
7848 <–(8848)–> 9848、9849