我正在尝试删除除特定网络之外的所有传入到我的服务器的连接。同时,我想保持从我的服务器到外部网络(任何协议上的任何网络)的所有传出连接打开。它通过在 INPUT 链中进行以下两项更改来实现:
注意:测试使用 3 台服务器(虚拟机)进行,其 IP 位于 192.168.0.0/24 网络,所有规则均在服务器 3(IP:192.168.0.3)上定义
a. iptables -P INPUT DROP
b. iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
[root@server3 ~]# iptables -nvL
Chain INPUT (policy DROP 124 packets, 22308 bytes)
pkts bytes target prot opt in out source destination
265 34603 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 433 packets, 34693 bytes)
pkts bytes target prot opt in out source destination
但是,我的第一个问题是:
- 当我定义上述第一条规则(更改 INPUT 链的默认策略)时,它也会停止来自我的服务器(IP:192.168.0.3)的所有传出连接(ssh、ping)。如果我的默认 OUTPUT 链策略仍然接受,并且我在 OUTPUT 链下没有定义任何规则,为什么会发生这种情况?
我想通过不改变 INPUT 链的默认策略来实现同样的目的,如下所示:
c. iptables -I INPUT -j DROP
d. iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
但它仍然阻止了所有进出我的服务器 3 的连接。这让我想到了第二个问题:
- 规则
c.
和a.
工作方式有何不同?请帮助我理解,因为我对 Linux 防火墙还不熟悉。
答案1
如果你有一个默认的 DROP INPUT 策略,即使回复来自你的传出连接的数据包将被丢弃。
要接受这些,请添加此输入规则:
iptables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
至于你的最后一个问题,在你的c and d
例子中(假设这些命令之前的规则为空),你正在设置第一条规则drop everything
和第二接受来自特定网络的流量的规则。IPTABLES 会尽快获取匹配项,因此第一条规则始终匹配(不设置条件),因此之后的所有规则都不会执行。必须定义规则的例外情况前规则。
在第一个示例中-P INPUT DROP
,您设置了一个最后的规则将捕获之前未匹配的任何内容,因此任何添加的异常都将在默认规则之前执行(-P
)。
-I
插入到某个位置(例如,在我之前的命令中,我将 ESTABLISHED,RELATED 规则设置为第一个,因此无论您之后设置什么,它都会匹配。
-A
附加到规则列表,因此 if 将在默认规则之前匹配。
如果您想要使用明确的规则(如c and d
)实现与第一个例子相同的效果,您应该交换这些规则的位置。