CentOS 7 中的白名单源 IP 地址

CentOS 7 中的白名单源 IP 地址

我想设置 CentOS 7 防火墙,以便阻止除我列入白名单的原始 IP 地址之外的所有传入请求。对于白名单 IP 地址,所有端口都应可访问。

我能够找到一些解决方案(不确定它们是否有效),iptables但 CentOS 7 使用firewalld.我找不到类似的东西可以用firewall-cmd命令来实现。

接口位于公共区域。我也已经将所有服务移至公共区域。

答案1

我将通过向区域添加源来实现此目的。首先检查您所在区域有哪些来源:

firewall-cmd --permanent --zone=public --list-sources

如果没有,您可以开始添加它们,这是您的“白名单”

firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32

(这会添加一个完整的/24IP和一个IP,这样您就可以同时获得子网和单个IP的参考)

设置您要打开的端口范围:

firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp

这仅适用于端口 1 到 22。如果您愿意,您可以扩大它。

现在,重新加载您所做的事情。

firewall-cmd --reload

并检查你的工作:

 firewall-cmd --zone=public --list-all

旁注/社论:这并不重要,但我喜欢firewalld中白名单IP组的“可信”区域。您可以通过阅读进行进一步评估redhat 关于选择区域的建议

也可以看看:


如果您想将DROP数据包发送到此源之外,这里有一个将这些数据包丢弃到源之外的示例/24我之前用作示例的外部的数据包,你可以为此使用丰富的规则, 我相信。这是概念性的,我还没有测试过它(除了看到 centos 7 接受该命令之外),但是,应该很容易执行 pcap 并看看它的行为是否如您所期望的那样

firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'

答案2

即使答案已被接受并被投票,我也不认为它是正确的。我无法在文档中找到明确的解释,但从实现的行为来看,它看起来像这样:

  1. 接口和源用作选择器 - 要激活哪个区域
  2. 对于默认区域,两者都会被忽略(始终处于活动状态)

所以答案是:

  1. 锁定默认区域,例如“公共” - 没有开放的端口或可用的服务
  2. 在另一个区域,说“工作” - 定义源和开放端口

例如,假设默认区域是公共区域并且没有开放端口,请将源和端口范围添加到“工作”区域:

$ sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ sudo firewall-cmd --zone=work --add-port=8080-8090/tcp

现在检查活动区域(默认区域始终处于活动状态):

$ sudo firewall-cmd --get-active-zones

你会得到:

work
  sources: 192.168.0.0/24

因此“工作”区域规则将适用于特定子网。您将拥有一系列“白名单”开放端口=子网按照要求。当然,--permanent在语句中使用选项--add-xxx可以使行为坚持下去。

反过来,您在“公共”(默认)区域中拥有的任何端口或服务将适用于所有接口和源地址。

$ sudo firewall-cmd --list-all-zones

public (default)
interfaces:
sources:
services:
ports: 
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

work (active)
interfaces: 
sources: 192.168.0.0/24
services: dhcpv6-client ipp-client ssh
ports: 8080-8090/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

相同的系统也适用于接口。通过将接口“ens3”添加到“工作”区域来表示:

$ sudo firewall-cmd --zone=work --add-interface=ens3

您将对来自特定接口的任何请求使用“工作”区域规则 - 比“源”更粗略的选择器。

答案3

免责声明:我实际上还没有尝试过我在这里建议的内容,但它与我上次所做的防火墙设置相当接近,所以我将不再这样做。 Firewalld 为您提供了一些预配置的区域,就是为了这个目的。有一种称为“drop”,它会丢弃任何传入的内容,还有一种称为“trusted”,它允许任何连接(即,我认为您甚至不需要打开单独的端口)。诀窍是找到正确的区域来触发你想要的东西。

Firewalld 将根据以下优先级应用区域规则:

  • 如果源 IP 与绑定到区域的源 IP 匹配,则使用该源 IP。
  • 如果源 IP 与任何特定区域都不匹配,则会检查是否有为该源配置的区域界面数据包进来了。如果有的话,它就会使用它。
  • 最后,如果没有其他匹配,它将使用默认区域。

因此,首先,您需要将可信 IP 绑定到“可信”区域:

firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4

然后,将默认区域设置为“drop”或将您的接口绑定到它:

firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0

然后使更改生效(警告:如果您通过网络执行此操作并且没有将源 IP 添加到受信任区域,这可能会断开您的连接):

firewall-cmd --reload

当然,您也可以通过省略“--permanent”来临时测试这些(然后您也不必--reload)。

答案4

我很惊讶受信任区域的答案不是选定的答案。受信任区域有一个默认的“target: ACCEPT”,而其余的都是“target: default”。虽然这实际上并不重要,但由于其名称和默认目标值,它似乎是预期的方法。

如何快速锁定盒子以便只有您可以访问它:

firewall-cmd --zone=trusted --add-source=1.2.3.4
firewall-cmd --zone=trusted --add-source=5.6.7.8/24
firewall-cmd --zone=drop --change-interface=eth1
firewall-cmd --set-default-zone=drop
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all-zones

列出所有区域后,您应该看到如下内容:

trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  sources: 1.2.3.4 5.6.7.8/24
  masquerade: no

drop (active)
  target: DROP
  icmp-block-inversion: no
  interfaces: eth1
  masquerade: no

注意:我删除了具有空值/缺失值的行。重要的是,trusted 和 drop 都是(活动的)并且 drop 有你的公共接口。

演示这对 iptables 的作用:

Chain INPUT_ZONES_SOURCE (1 references)
target     prot opt source               destination
IN_trusted  all  --  1.2.3.4         0.0.0.0/0
IN_trusted  all  --  5.6.7.8/24        0.0.0.0/0
Chain INPUT_ZONES (1 references)
target     prot opt source               destination
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0

相关内容