Firewalld - 限制特定 IP 的流量

Firewalld - 限制特定 IP 的流量

我正在尝试设置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)
$

参考

相关内容