我想设置 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
(这会添加一个完整的/24
IP和一个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 关于选择区域的建议。
也可以看看:
- 使用防火墙的 RHEL 7 文章
- Fedora FirewallD 文档(相当不错,fedora 使用firewalld已经有一段时间了)
如果您想将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
即使答案已被接受并被投票,我也不认为它是正确的。我无法在文档中找到明确的解释,但从实现的行为来看,它看起来像这样:
- 接口和源用作选择器 - 要激活哪个区域
- 对于默认区域,两者都会被忽略(始终处于活动状态)
所以答案是:
- 锁定默认区域,例如“公共” - 没有开放的端口或可用的服务
- 在另一个区域,说“工作” - 定义源和开放端口
例如,假设默认区域是公共区域并且没有开放端口,请将源和端口范围添加到“工作”区域:
$ 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