我正在尝试设置firewalld以将对CentOS7服务器的访问限制为特定IP(192.168.10.5和167.165.100.22)的传入和传出流量。
我只有一个网络接口 enp0s01。
我已将防火墙切换为启用了“ssh”服务的自定义区域。
firewall-cmd --zone=customlist --list-all
internal (active)
target: default
icmp-block-inversion: no
interfaces: enp0s01
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
我测试时添加了一个IP地址,例如,
firewall-cmd --permanent --zone=external --add-source=192.168.10.5
但是,网络内的其他 IP 仍然可以通过 ssh 访问服务器。
如何限制访问?我认为防火墙会阻止所有流量,除非通过添加源明确列入白名单。
答案1
背景
在研究中,您似乎无法使用基本的firewalld命令来限制传出流量。有几个消息来源支持这一点:
您唯一的办法是使用firewall-cmd --direct ...
命令,这些命令的作用只不过是iptables
为您提供便利的规则。鉴于此,您可以选择通过 Firewalld 执行此操作,或者仅使用您之前在使用iptables
.
笔记:直接规则看起来像这样:
$ firewall-cmd --direct --remove-rule ipv4 filter OUTPUT 0 -d 74.125.136.99/32 -p tcp -m tcp --dport=80 -j DROP
潜在的解决方案
如果您可以放宽禁止主机进行任何传出通信的要求,则可以使用基本firewall-cmd
命令获得大部分您想要的内容,如下所示。
笔记:在我的示例中,我有 3 个节点:
- 192.168.56.101 - VM #1 - 具有 Firewalld 规则的服务器
- 192.168.56.102 - 虚拟机 #2
- 192.168.56.1 - 我的笔记本电脑
$ firewall-cmd --permanent --zone=internal --add-source=192.168.56.101/32
$ firewall-cmd --permanent --zone=internal --add-source=192.168.56.1/32
$ firewall-cmd --permanent --zone=internal --add-port=8080/tcp
$ firewall-cmd --zone=public --set-target=DROP
通过此设置,我可以从笔记本电脑访问 VM #1,但无法从其他任何地方(例如 VM #2)访问。
默认区域$ firewall-cmd --get-default-zone
public
活跃区
$ firewall-cmd --get-active-zones
internal
sources: 192.168.56.101/32 192.168.56.1/32
public
interfaces: eth0 eth1
公共区域的设置
$ firewall-cmd --zone=public --list-all
public (active)
target: DROP
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
内部区域的设置
$ firewall-cmd --zone=internal --list-all
internal (active)
target: default
icmp-block-inversion: no
interfaces:
sources: 192.168.56.101/32 192.168.56.1/32
services: ssh mdns samba-client dhcpv6-client
ports: 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
公共区域的默认目标
$ firewall-cmd --permanent --get-target
DROP
测试
为了测试此设置,我将使用nc
(ncat) 在端口 8080 上创建一个“侦听器守护进程”,并使用curl -v telnet://...
命令充当连接到这些侦听器的客户端。
笔记:这纯粹是为了说明事情正在按预期进行,并且可以稍后删除。
在虚拟机 #1 上:$ nc -4 -l -p 8080 -k
现在,在 VM #2 上,我们无法连接:
$ timeout 1 curl -v telnet://192.168.56.101:8080
* About to connect() to 192.168.56.101 port 8080 (#0)
* Trying 192.168.56.101...
$
在笔记本电脑上我们可以:
$ timeout 1 curl -v telnet://192.168.56.101:8080
* Rebuilt URL to: telnet://192.168.56.101:8080/
* Trying 192.168.56.101...
* Connected to 192.168.56.101 (192.168.56.101) port 8080 (#0)
$
这种方法的唯一问题是 VM #1 节点仍然可以出口:
$ timeout 2 ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=26.4 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=25.6 ms
$
$ timeout 1 curl -v telnet://www.google.com:80
* About to connect() to www.google.com port 80 (#0)
* Trying 216.58.217.164...
* Connected to www.google.com (216.58.217.164) port 80 (#0)
$