在CentOS 7中将源IP地址列入白名单


23

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

我能找到一些解决方案(不确定它们是否可以使用),iptables但CentOS 7可以使用firewalld。我找不到与firewall-cmd命令相似的东西。

这些接口位于“公共区域”中。我已经将所有服务都移到了公共区域。

Answers:


44

我可以通过将资源添加到区域来完成此任务。首先结帐您所在区域的来源:

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'

非常感谢您的回答。由于声誉不足,无法投票。但是,除了使用源添加的IP之外,如何删除所有其他IP?
Krishnandu Sarkar 2014年

感谢@KrishnanduSarkar-您是对的,默认情况下,它应该是ICMP拒绝项。但是,我认为您可以添加一个丰富的规则来丢弃数据包。我在回答中添加了一个我认为可以解决的示例。感谢您的支持,我了解,如果答案有效,请考虑接受答案。
dougBTV

很好的答案,到目前为止我一直在使用iptables。
Tensigh

(!)对于当前的默认FirewallD配置,此答案将无法正常工作(默认情况下,接口分配给公共区域)。
des

24

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

  1. 界面和源用作选择器-要激活的区域
  2. 两者都将被默认区域忽略(始终处于活动状态)

因此答案将是:

  1. 锁定默认区域,说“ public”-没有打开端口或没有可用的服务
  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

因此“工作”区域规则将适用于特定子网。您将根据要求为“ 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

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


4
这是最好的答案。最关键的部分是关于设置接口扩大访问范围的说明(如果设置了源)。我有一个问题,即使我有sources白名单,也可以访问这些端口。原因是该区域已分配接口。
pinkeen '17

1
要完全正确,此答案需要从public区域中删除所有默认服务(如果有)(这些服务将对所有地址可用,因为public默认情况下接口已分配给区域)。或将默认区域更改为另一个区域:blockdrop(这是常见做法)。或将public区域目标更改为%%REJECT%%DROP
des

6

免责声明:在这里,我实际上没有尝试过我的建议,但这与我上次进行防火墙设置相当接近,因此我不打算这样做了。仅出于此目的,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)。


block也可以使用(而不是drop),如果你想告诉其他主机,你不跟他们说话....
格特·范登贝尔赫

5

我以这种方式操作防火墙。这是完成您想要的工作的首选方法。

# 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

2

您可以通过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'

2

来自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重新加载时记住该规则。


1

只需添加到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。


对于当前的默认FirewallD配置,可能还不够。有关详细信息,请参见我对Normunds答案的评论。
des

为多个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'
fyrye

0

我很惊讶受信任的区域答案不是所选的答案。受信任的区域具有默认的“目标:接受”,而其余区域则是“目标:默认”。虽然并不重要,但由于其名称和默认目标值,它似乎是预期的方法。

如何快速锁定一个框,以便只有您可以访问它:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.