我有 centos7 在 2 个虚拟机中运行。两台虚拟机上都运行防火墙。假设某个应用程序正在使用 5044 端口的计算机 A 上运行。我有另一台名为机器 B 的机器,它试图在 5044 端口上远程登录这台机器。那时telnet是通过异常说
Trying 192.168.115.141...
telnet: connect to address 192.168.115.141: No route to host
但关闭防火墙后通信工作正常。但我不想禁用防火墙。那么,我如何允许另一台机器 B 与机器 A 进行通信。您知道我需要在 IP 表或防火墙规则列表中定义什么类型的策略吗?
任何帮助将不胜感激。
答案1
Centos 7正在使用firewalld
默认情况下。目前它是内核提供的防火墙的更高级别接口iptables
。虽然不需要真正了解iptables
如何使用firewalld
,但充分理解它肯定会有所帮助。控制的主要界面firewalld
是firewall-cmd
命令。当此命令与它一起使用时,--permanent
它将仅影响配置并且没有可见的效果(直到重新加载、服务重新启动或重新引导)。当此选项不存在时,它只会立即产生可见的效果,而不会更改已保存的配置。存在其他界面,例如 GUIfirewall-config
。
firewalld
有很多抽象概念,比如区域。默认情况下,公共区域正在使用中,但许多区域是预定义的(受信任的、工作的、dmz ...),每个区域都有一个使用角色并包括一些预定义的设置(例如:公共区域中默认允许 ssh)。对于仅限制特定源的服务访问,应优先使用备用区域(而不是公共区域)。也许应该选择一个预定义区域,但无论如何,让我们创建一个新区域,将其与源(MachineB 的 IP)绑定并允许 TCP 端口 5044。假设 MachineB 的 IP 是10.0.3.66
(其他有效源例如是所有LAN 作为源,在此示例中将改为 LAN 10.0.3.0/24
):
# firewall-cmd --permanent --new-zone peervm
# firewall-cmd --permanent --zone peervm --add-source 10.0.3.66
# firewall-cmd --permanent --zone peervm --add-port 5044/tcp
配置中的效果是可见的,例如:
# egrep -r '10.0.3.66|5044' /etc/firewalld
/etc/firewalld/zones/peervm.xml.old: <source address="10.0.3.66"/>
/etc/firewalld/zones/peervm.xml: <source address="10.0.3.66"/>
/etc/firewalld/zones/peervm.xml: <port protocol="tcp" port="5044"/>
使用以下命令激活更改:
# firewall-cmd --reload
success
这将重建基本iptables
规则,其效果可见,例如:
# iptables-save |egrep '10.0.3.66|5044'
-A POSTROUTING_ZONES_SOURCE -d 10.0.3.66/32 -g POST_peervm
-A PREROUTING_ZONES_SOURCE -s 10.0.3.66/32 -g PRE_peervm
-A PREROUTING_ZONES_SOURCE -s 10.0.3.66/32 -g PRE_peervm
-A PREROUTING_ZONES_SOURCE -s 10.0.3.66/32 -g PRE_peervm
-A FORWARD_IN_ZONES_SOURCE -s 10.0.3.66/32 -g FWDI_peervm
-A FORWARD_OUT_ZONES_SOURCE -d 10.0.3.66/32 -g FWDO_peervm
-A INPUT_ZONES_SOURCE -s 10.0.3.66/32 -g IN_peervm
-A IN_peervm_allow -p tcp -m tcp --dport 5044 -m conntrack --ctstate NEW -j ACCEPT
使用抽象层可以生成很多像上面这样的样板规则,基本上只用一个iptables
规则就可以完成(放入此处未显示的一些标准规则):
# iptables -I INPUT -s 10.0.3.66/32 -p tcp --dport 5044 -j ACCEPT
因此,当熟练使用 时iptables
,对于最简单的情况,或者在范围的另一端,对于不容易用 覆盖的非常复杂的情况firewalld
,应该考虑使用直接iptables
规则和另一组已保存的配置工具,例如在 CentOS 上使用iptables-services
代替firewalld
。