iptables 的 INPUT 链中如何同时包含 (ACCEPT, all, anywhere, anywhere) 和 (DROP, all, anywhere, anywhere)?

iptables 的 INPUT 链中如何同时包含 (ACCEPT, all, anywhere, anywhere) 和 (DROP, all, anywhere, anywhere)?

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

对其链中的所有流量iptables都制定规则ACCEPT并采用默认策略有何意义?DROPINPUTDROP

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

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

答案1

-L请注意国旗附录中的小字iptables并使用-v选项:

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

 iptables -L -v

我个人更喜欢转储完整的规则集以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

而不是:

# 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

还请注意,当创建规则时,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

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

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

您可以设置一条规则“接受所有 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

答案2

第一行iptables -L

target prot opt source destination ACCEPT all -- anywhere anywhere

对应输出第一条规则iptables-save

-A INPUT -i lo -j ACCEPT

此规则仅匹配来自接口lo(环回接口)的流量。它不匹配来自其他接口(例如 eth0)的任何流量。

因此,默认策略DROP将影响来自任何设备的任何流量,除非lo不匹配和被特定规则接受(例如 http、ssh、related-established 等)。

不幸的是,iptables -L输出没有列出/显示接口详细信息。这可以通过查看iptables-save输出或使用来澄清iptables -L -v

相关内容