在其 INPUT 链中如何能
iptables
同时拥有(ACCEPT, all, anywhere, anywhere)
和?(DROP, all, anywhere, anywhere)
对其链中的所有流量iptables
都制定规则ACCEPT
并采用默认策略有何意义?DROP
INPUT
DROP
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
。