背景
我使用的是 Debian 10 Buster。我开始在我的家庭 IP 地址上运行 Tor 中继。专用的成熟服务器可能不是最节能的方式,但我想尝试一下。自从我停止运行比特币守护程序以来,就有大量可用流量。尽管如此,我确实有一个纯粹的网络问题,根据过去的经验,我知道它不属于我们的专门讨论该主题的姊妹网站。
研究
今天早上我遇到了一个关于 ServerFault 的非常旧的答案,因为我很好奇,所以我应用了这些规则,请参阅下面的完整列表。我添加了一些在其他地方找到的更多规则。简化了它并做了一些很好的结构。
我想问一下,下面的规则现在在2019年的kernel上是否可以有可衡量的结果4.19.0-2-amd64
?
从iptables
“IPv4 文件 - /etc/iptables/rules.v4
:
--append INPUT --proto all --fragment --jump DROP --match comment --comment "all fragmented packets"
--append INPUT --proto all --match state --state INVALID --jump DROP --match comment --comment "all invalid packets"
--append INPUT --proto icmp --match u32 ! --u32 "0x4&0x3fff=0x0" --jump DROP --match comment --comment "icmp fragmented packets"
--append INPUT --proto icmp --match length --length 1492:65535 --jump DROP --match comment --comment "icmp oversized unfragmented packets"
--append INPUT --proto tcp ! --syn --match state --state NEW --jump DROP --match comment --comment "new non-syn packets"
--append INPUT --proto tcp --tcp-flags ALL NONE --jump DROP --match comment --comment "NULL scan"
--append INPUT --proto tcp --tcp-flags ALL ALL --jump DROP --match comment --comment "Xmas scan"
--append INPUT --proto tcp --tcp-flags ALL FIN,URG,PSH --jump DROP --match comment --comment "stealth scan"
--append INPUT --proto tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG --jump DROP --match comment --comment "pscan 1"
--append INPUT --proto tcp --tcp-flags SYN,FIN SYN,FIN --jump DROP --match comment --comment "pscan 2"
--append INPUT --proto tcp --tcp-flags FIN,RST FIN,RST --jump DROP --match comment --comment "pscan 3"
--append INPUT --proto tcp --tcp-flags SYN,RST SYN,RST --jump DROP --match comment --comment "SYN-RST scan"
--append INPUT --proto tcp --tcp-flags ACK,URG URG --jump DROP --match comment --comment "URG scans"
--append INPUT --proto tcp --tcp-flags ALL SYN,FIN --jump DROP --match comment --comment "SYN-FIN scan"
--append INPUT --proto tcp --tcp-flags ALL URG,PSH,FIN --jump DROP --match comment --comment "nmap Xmas scan"
--append INPUT --proto tcp --tcp-flags ALL FIN --jump DROP --match comment --comment "FIN scan"
--append INPUT --proto tcp --tcp-flags ALL URG,PSH,SYN,FIN --jump DROP --match comment --comment "nmap-id scan"
到目前为止,之后0.5天,我只能看到规则 #2 和 #5 捕获一些数据包:
2 67 13972 DROP all -- any any anywhere anywhere state INVALID /* all invalid packets */
5 158 81683 DROP tcp -- any any anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW /* new non-syn packets */
后1.25天,仍然只捕获一条 TCP 规则和无效的规则:
2 178 26785 DROP all -- any any anywhere anywhere state INVALID /* all invalid packets */
5 467 241K DROP tcp -- any any anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW /* new non-syn packets */
后7天,仍然只捕获一个 TCP 规则和无效的规则 + 我通常在 INPUT 链上看到很多 DROP,我之前没有注意到:
Chain INPUT (policy DROP 62772 packets, 17M bytes)
2 3475 355K DROP all -- any any anywhere anywhere state INVALID /* all invalid packets */
5 2459 1324K DROP tcp -- any any anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW /* new non-syn packets */
问题
其他规则是否被视为过时,因为它们在其他地方或其他地方被过滤?
答案1
要完成@roaima的回答,并且真的只是因为您想要所有微小的细节,这就是下面这两条规则在大多数配置上无法匹配的原因:
--append INPUT --proto all --fragment --jump DROP
和
--append INPUT --proto icmp --match u32 ! --u32 "0x4&0x3fff=0x0" --jump DROP
--match u32 ! --u32 "0x4&0x3fff=0x0"
只是一种复杂的低级写入方法--fragment
,除了它可能还包含 MF 标志:片段偏移量(+ 标志 MF)是 IP 数据包中偏移量 4 处的 u32 字( 0x4
),在其最低位部分 ( &0x3fff
):非空值相当于拥有一个片段(或宣布更多片段)。
但是因为(至少)加载了--match state
module nf_conntrack
,而这又需要 module nf_defrag_ipv4
。这个碎片整理是在PREROUTING
钩子上完成的优先级-400,因此不允许任何东西看到碎片,而只是一个新建的重新组装的数据包。更高版本的内核允许raw
以较低的优先级加载表:
# modinfo -p iptable_raw
raw_before_defrag:Enable raw table before defrag (bool)
因此允许查看这些数据包,但只能在原始表中(显然不能使用 conntrack )。
现在也将成为真的彻底,与我之前的示例相反,默认情况下 Debian buster 不会使用ip_tables
或任何iptable_*
模块,因为对于iptables
, Debian buster默认使用 iptables-nft
这是通过 nftables 翻译的 iptables,但有时仍然使用iptables 扩展'xt_*
模块。
更新:这仍然允许u32
模块使用和工作,但会阻止尝试通过 nft 更改规则(例如无法保存然后恢复,并且现在的模拟始终会为链选择优先级 -300 raw/PREROUTING
) 。
root@buster-amd64:~# update-alternatives --display iptables|head -3
iptables - auto mode
link best version is /usr/sbin/iptables-nft
link currently points to /usr/sbin/iptables-nft
# iptables -A INPUT -p udp --fragment -j DROP
# iptables -A INPUT -p icmp --match u32 ! --u32 "0x4&0x3fff=0x0" -j DROP
# iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -p udp -f -j DROP
-A INPUT -p icmp -m u32 ! --u32 "0x4&0x3fff=0x0" -j DROP
# nft --debug=netlink list ruleset -a
ip filter INPUT 4
[ meta load l4proto => reg 1 ]
[ cmp eq reg 1 0x00000011 ]
[ payload load 2b @ network header + 6 => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x0000ff1f ) ^ 0x00000000 ]
[ cmp neq reg 1 0x00000000 ]
[ counter pkts 0 bytes 0 ]
[ immediate reg 0 drop ]
ip filter INPUT 5 4
[ meta load l4proto => reg 1 ]
[ cmp eq reg 1 0x00000001 ]
[ match name u32 rev 0 ]
[ counter pkts 4 bytes 4096 ]
[ immediate reg 0 drop ]
table ip filter { # handle 5
chain INPUT { # handle 1
type filter hook input priority 0; policy accept;
meta l4proto udp ip frag-off & 8191 != 0 counter packets 0 bytes 0 drop # handle 4
meta l4proto icmp # u32 ! "0x4&0x3fff=0x0" counter packets 4 bytes 4096 drop # handle 5
}
chain FORWARD { # handle 2
type filter hook forward priority 0; policy accept;
}
chain OUTPUT { # handle 3
type filter hook output priority 0; policy accept;
}
}
请注意,规则句柄 #5 在 之前放置了注释u32
,不是因为它不起作用,而是因为它无法由 native 处理nft
。字节码转储不会显示存储在其他地方的实际有效负载检查,但会按预期运行,并且当接收和丢弃实际片段时,计数器将增加。
答案2
我建议你的标志组合(规则 6等) 几乎都被规则 2 所捕获,--state INVALID
.
我在一台面向公众的服务器上运行了一套相当严格的规则,定制的规则fail2ban
就位于顶部。 (我进行了 3 次罢工,您将缺席几个小时,而 3 次出局则意味着一个月的禁令。有几个基于 IP 地址的例外情况,以防止我自己被完全锁定。)
rules.v4
这是我的套装的(精简版)
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
...
# Exceptions to allow suitably authorised traffic
...
-A INPUT -j LOG --log-level info --log-prefix "firewall: REJECT "
-A INPUT -j REJECT
iptables --line-numbers -nvL INPUT
自月初以来的一些相应数据包计数
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 97753 26M f2b-recidive tcp -- * * 0.0.0.0/0 0.0.0.0/0
2 94046 26M f2b-XXXXXXXXXXXX tcp -- * * 0.0.0.0/0 0.0.0.0/0
3 94046 26M f2b-XXXXXXXXXXXX tcp -- * * 0.0.0.0/0 0.0.0.0/0
4 88576 26M f2b-sshd tcp -- * * 0.0.0.0/0 0.0.0.0/0
5 902K 333M ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
6 2463M 2399G ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
7 1152 52453 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
...
19 417K 13M ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
20 56921 4276K LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 6 prefix "firewall: REJECT "
21 56921 4276K REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
正如您所看到的,我们收到了大量包含无效数据的数据包,但大多数都是简单的 TCP/IP 探测。其中大多数都会触发fail2ban
规则,正如它们应该的那样。