iptables 如何在其 INPUT 链中同时具有(ACCEPT,全部,任何地方,任何地方)和(DROP,全部,任何地方,任何地方)?

Shu*_*eng 2 linux iptables

如何在其 INPUT 链中iptables同时存在(ACCEPT, all, anywhere, anywhere)和?(DROP, all, anywhere, anywhere)

iptables对于具有默认策略 的规则ACCEPT以及DROP其链中的所有流量有何意义?INPUTDROP

在这种情况下,流量实际上会被接受还是丢弃?ssh我看到和存在特殊规则http,所以它们自然会优先,因为它们更具体?

# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DROP       all  --  anywhere             anywhere             ctstate INVALID
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http ctstate NEW,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere            

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp spt:ssh ctstate ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp spt:http ctstate ESTABLISHED
Run Code Online (Sandbox Code Playgroud)

iptables-保存:

iptables-save
# Generated by iptables-save v1.6.1 on Sun Jun 23 10:21:50 2019
*filter
:INPUT DROP [1665:309354]
:FORWARD DROP [0:0]
:OUTPUT DROP [10:520]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
COMMIT
# Completed on Sun Jun 23 10:21:50 2019
Run Code Online (Sandbox Code Playgroud)

HBr*_*ijn 7

请注意iptables-L标志附录中的小字并使用以下选项:-v

-L,--list [chain]
列出所选链中的所有规则。...确切规则被抑制,直到您使用

 iptables -L -v
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我更喜欢转储完整的规则集iptables-save以获得快速概述,因为默认情况iptables -L下也仅显示过滤器表,并且您必须显式请求例如 nat 表。

在讨论 iptables 规则集时非常有用的是将行号添加到输出中并打印数字 ip 地址和端口号: [sudo] iptables -L -v -n --line-numbers


由于ip-tables -L不显示确切的规则并省略了接口,因此信任使用创建的环回接口上的所有流量的规则-A INPUT -i lo -j ACCEPT 显示为:

# iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
Run Code Online (Sandbox Code Playgroud)

而不是:

# iptables -L -v -n --line-number

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1    75890 6101K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
Run Code Online (Sandbox Code Playgroud)

另请注意,在创建规则时,iptables -A INPUT -i lo -j ACCEPT对 ip 地址(范围)没有任何限制,并使用-s ip-address[/netmask] 和/或-d ip-address[/netmask]规则将其应用于任何源和目标 ip 地址(0.0.0.0/0 网络/网络掩码)。


现在,尽管回答你原来的问题并不完全是这样:

iptables怎么可能在同一个链上有完全相反的规则呢?

因为无论是内核还是操作规则的 iptables 命令都不会将规则集解释为一个整体。

每个数据包按照它们在每个相关链中列出的顺序依次检查规则。第一条规则是决定性匹配,处理停止。

这意味着您作为管理员可以轻松创建看起来完全相反但永远不会适用的规则(以不正确的顺序),因为数据包始终适用于较早的规则。

内核会很高兴地接受:

iptables -I INPUT 1 -s 10.2.3.4/32 -d 10.3.4.5/32 -j DROP
iptables -I INPUT 2 -s 10.2.3.4/32 -d 10.3.4.5/32 -j DROP
iptables -I INPUT 3 -s 10.2.3.4/32 -d 10.3.4.5/32 -j ACCEPT
iptables -I INPUT 4 -s 10.2.3.4/32 -d 10.3.4.5/32 -j DROP
Run Code Online (Sandbox Code Playgroud)

(最后三个完全不相关。)或者一些不那么做作的东西,例如:

iptables -I INPUT 1  -p tcp -m tcp --dport 22  -j ACCEPT
iptables -I INPUT 2  -p tcp -m tcp --dport 22 -s 10.1.0.0/16 -j DROP
Run Code Online (Sandbox Code Playgroud)

您可以有一个规则“接受所有 SSH 连接”,后跟一个规则“不排除来自 10.1.0.0/16 的 SSH 连接”。不幸的是,第二条规则虽然完全有效,但永远不会起作用,因为来自 IP 地址为 10.1.2.3 的主机的 SSH 连接始终首先匹配“接受所有 SSH 连接”规则。
一旦你改变这些规则的顺序......然后事情就会按预期进行:

iptables -I INPUT 1  -p tcp -m tcp --dport 22 -s 10.1.0.0/16 -j DROP
iptables -I INPUT 2  -p tcp -m tcp --dport 22  -j ACCEPT
Run Code Online (Sandbox Code Playgroud)