如何在其 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
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)
请注意iptables-L
标志附录中的小字并使用以下选项:-v
-L
,--list [chain]
列出所选链中的所有规则。...确切的规则被抑制,直到您使用Run Code Online (Sandbox Code Playgroud)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
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)
归档时间: |
|
查看次数: |
10063 次 |
最近记录: |