Iptables:阻止所有出站端口时虚拟机被锁定

Iptables:阻止所有出站端口时虚拟机被锁定

我正在尝试阻止OUTPUTChain 中给出的所有 IP 的其他几个 IP。

当我安装 Iptables 时,OUTPUT链是空的,输入链添加了STATED, ESTABLISHEDIP,并拒绝除给定链规则之外的所有 IP 。它起作用了,我只需要添加 ssh 和其他端口来允许来自输入链的流量。当我安装 iptables 时,INPUTREJECT 规则被添加了。INPUT

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:<....>
2    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
3    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
4   REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

对于OUTPUT链,它是空的。我添加了下面的规则,它将接受出站流量和一些其他端口的 ssh 连接并保存了规则,它有效。

sudo iptables -I OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
sudo iptables -I OUTPUT -p tcp -m tcp --dport <...> -j ACCEPT
sudo iptables -I OUTPUT -p tcp -m tcp --dport <..> -j ACCEPT
sudo service iptables save

注意:不要运行以下规则,否则可能会将您锁定在 VM 中。当我添加规则以阻止OUTPUT>>中的所有端口时sudo iptables -A OUTPUT -j REJECT,VM 会立即被锁定并且无法访问 VM。

从云控制台重新启动 VM 后,我能够重新获得访问权限,因为上述iptable规则未被保存。

过了一段时间后,我尝试了>> sudo iptables -A OUTPUT -j Drop,但它再次锁定了 VM,需要重新启动才能访问 VM。

请告诉我如何阻止所有出站端口(如输入链),而不会被锁定。当前 Iptables 配置如下。

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:<....>
2    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
3    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
4   REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:<>
2    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:<>
3    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:<>
4    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh

答案1

您所做的正是阻止传出流量所需要的,并且您确实通过向 OUTPUT 链添加规则来实现阻止传出流量。

您没有考虑到的是,任何传入连接(即允许的连接)也需要发送回流量,因此也始终会产生相关的传出流量。换句话说,允许的连接是双向的,传入连接(由您的 INPUT 规则控制)和您的服务器发送回的响应(由您的 OUTPUT 规则控制)。


未经测试的示例

最小状态防火墙配置仅允许环回接口和 SSH 作为入口流量并拒绝所有其他流量,如下所示:

iptables -I 1 INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I 2 INPUT -i lo -j ACCEPT
iptables -I 3 INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
...
   other allowances here
...
# as the last rule, reject everything that isn't explicitly allowed
iptables -A INPUT -j REJECT

最小的状态防火墙配置,用于出口过滤,同样应允许通过允许的连接、DNS 查找和响应(端口 53 TCP 和 UDP)往返于您的名称服务器的流量,

iptables -I 1 OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I 2 OUTPUT -o lo -j ACCEPT
iptables -I 3 OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
iptables -I 3 OUTPUT -p udp -m udp --dport 53 -j ACCEPT
...
   other allowances here
...
# as the last rule, reject everything that isn't explicitly allowed
iptables -A OUTPUT -j REJECT

相关内容