我想设置CentOS 7防火墙,以便除我白名单中的原始IP地址外,所有传入请求都将被阻止。对于白名单IP地址,所有端口都应可访问。
我能找到一些解决方案(不确定它们是否可以使用),iptables
但CentOS 7可以使用firewalld
。我找不到与firewall-cmd
命令相似的东西。
这些接口位于“公共区域”中。我已经将所有服务都移到了公共区域。
我想设置CentOS 7防火墙,以便除我白名单中的原始IP地址外,所有传入请求都将被阻止。对于白名单IP地址,所有端口都应可访问。
我能找到一些解决方案(不确定它们是否可以使用),iptables
但CentOS 7可以使用firewalld
。我找不到与firewall-cmd
命令相似的东西。
这些接口位于“公共区域”中。我已经将所有服务都移到了公共区域。
Answers:
我可以通过将资源添加到区域来完成此任务。首先结帐您所在区域的来源:
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关于选择区域的建议来进行进一步的评估。
也可以看看:
如果您想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'
即使答案已被接受并投票通过,我也不认为这是正确的答案。我在文档中找不到清晰的解释,但是从实现的行为来看,它看起来像这样:
因此答案将是:
例如,假设默认区域是公共区域并且没有开放端口,则将源和端口范围添加到“工作”区域:
$ 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
因此“工作”区域规则将适用于特定子网。您将根据要求为“ whitelist” = 子网提供一系列开放端口。当然,--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
您将对来自特定界面的任何请求使用“工作”区域规则-比“源”更粗糙的选择器。
sources
白名单,也可以访问这些端口。原因是该区域已分配接口。
public
区域中删除所有默认服务(如果有)(这些服务将对所有地址可用,因为public
默认情况下接口已分配给区域)。或将默认区域更改为另一个区域:block
或drop
(这是常见做法)。或将public
区域目标更改为%%REJECT%%
或DROP
。
免责声明:在这里,我实际上没有尝试过我的建议,但这与我上次进行防火墙设置相当接近,因此我不打算这样做了。仅出于此目的,Firewalld为您提供了一些预配置的区域。有一个叫做“ drop”的东西,它丢弃所有传入的东西,还有一个叫做“ trusted”的东西,它允许任何连接(即,我认为您甚至不需要打开单个端口)。诀窍是找到正确的区域以触发您想要的内容。
Firewalld将基于以下优先级将规则应用于区域:
因此,首先,您要将您的受信任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)。
block
也可以使用(而不是drop
),如果你想告诉其他主机,你不跟他们说话....
我以这种方式操作防火墙。这是完成您想要的工作的首选方法。
# firewall-cmd --list-all
您会看到默认区域是public,启用的服务是dhcpv6-client和ssh。我们不希望有任何公共服务,对不对?仅列入白名单的IP被授权。因此,让我们删除两个公共服务。
# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent
现在,让我们将允许访问任何端口的特定IP列入白名单。
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'
现在,让我们将另一个IP列入白名单,我们只想访问SSH,http和https访问权限。没有其他端口。
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="ssh" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="http" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx service name="https" accept'
如果您通过SSH连接,请确保在应用新规则集之前对IP进行授权。准备应用新规则时。
#firewall-cmd --reload
您可以通过Rich Rule轻松管理。
第一步
firewall-cmd --permanent --set-default-zone=home
firewall-cmd --permanent --zone=drop --change-interface=eth0
第二步-添加丰富规则
firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" source address="192.168.78.76/32" accept'
添加丰富规则并阻止其他来源的每个端口后,192.168.2.2即可访问所有端口。
如果要通过以下命令添加任何端口或服务,则所有来源都可以访问它。
firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-port=8080
如果要为特定Ip打开特定端口,请使用以下命令
firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" port="8080/tcp" source address="192.168.78.76/32" accept'
来自dougBTV的最高答案是错误的。我无法回复他的回答,因为我还没有必要的代表点,因此在这里我将进行解释:
他正在使用默认区域“公共”。他将网络绑定到该区域,然后打开该区域上的端口。但是,在默认配置下,所有流量都流经默认区域,而不仅仅是您绑定到该源区域的源网络。因此,他的--add-source命令没有影响,他的--add-port命令现在允许全世界访问这些端口。
Normunds Kalnberzins的第二个答案是正确的。您要创建一个单独的区域,将您的网络/ IP绑定到该区域,然后打开该区域中的端口。
或者,您可以将所有内容保留在默认区域中,并使用firewalld的丰富规则来允许从某些IP进行访问:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'
这允许从192.168.2.2到所有端口的所有流量,并且由于我尚未指定区域,因此它将应用于默认区域“ public”(使用--get-default-zone验证默认区域是什么,以及- get-active-zones以查看当前正在使用的区域)。
为了只允许从该IP访问特定端口,我可以这样做:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" port port="1234" protocol="tcp" accept'
最佳实践是在不影响当前运行防火墙的--permanent(或简称为–perm)的情况下运行这些命令。在测试您的规则是否有效之后,请在附加--perm的情况下再次运行该规则,以便在随后的firewalld重新加载时记住该规则。
只需添加到Normunds答案即可:
$ sudo firewall-cmd --permanent --zone=work --add-source=172.16.0.0/12
$ sudo firewall-cmd --permanent --zone=work --add-port=8080-8090/tcp
要阻止所有其他流量:
$ sudo firewall-cmd --set-default-zone=drop
警告:如果从远程计算机访问,则可能会断开登录会话。如果未正确设置“工作”区域IP,则将无法连接到服务器。
重新加载防火墙:
$ sudo firewall-cmd --reload
我不知道如何用'--add-rich-rule'添加两个不同的IP。
ipset
类似的firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip
将ip 添加到ipset中,firewall-cmd --ipset=blacklist --add-entry=192.168.1.4
然后就可以使用firewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
我很惊讶受信任的区域答案不是所选的答案。受信任的区域具有默认的“目标:接受”,而其余区域则是“目标:默认”。虽然并不重要,但由于其名称和默认目标值,它似乎是预期的方法。
如何快速锁定一个框,以便只有您可以访问它:
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
注意:我删除了具有空值/缺失值的行。重要的是,信任和丢弃都是(活动的),并且丢弃具有您的公共接口。
这会对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