我目前正在尝试了解如何iptables
工作。我已阅读以下内容:
当数据包到达(或离开,取决于链)时,iptables 会将其逐一与这些链中的规则进行匹配。当找到匹配项时,它会跳转到目标并执行与其相关的操作。如果它找不到与任何规则匹配的规则,它只会执行链的默认策略所要求的操作。默认策略也是一个目标。1
我现在已经像这样在过滤表上设置了我的 INPUT 链:
$ iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -i wg0 -j ACCEPT
现在可以使用 wg0 接口从另一台机器(10.0.0.2)ping 该机器(10.0.0.1)。
使用iptables -S INPUT -v
,我还可以看到规则匹配,因为数据包和字节计数器在增加。
添加日志目标iptables -I INPUT -i wg0 -j LOG --log-prefix "INPUT-wg0: "
进一步证实了这一点。我现在可以使用来查看数据包dmesg -w
。
但是,当我将默认策略设置为 DROP 时,不再记录任何数据包,也无法再进行 ping 操作:
$ iptables -S INPUT
-P INPUT DROP
-A INPUT -i wg0 -j LOG --log-prefix "INPUT-wg0: "
-A INPUT -i wg0 -j ACCEPT
我不明白这一点。我以为会使用第一个匹配规则的目标?(LOG 目标似乎是个例外)
规则之前已经匹配,因此即使在默认策略改变后仍然应该匹配,对吗?
如果有人能解释这一点我会非常高兴链接对我而言。
iptables-save
ping 工作时的输出:
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:18:42 2022
*mangle
:PREROUTING ACCEPT [31842:2917695]
:INPUT ACCEPT [28740:2664375]
:FORWARD ACCEPT [3102:253320]
:OUTPUT ACCEPT [23607:5802958]
:POSTROUTING ACCEPT [26366:6035482]
COMMIT
# Completed on Fri Dec 23 06:18:42 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:18:42 2022
*raw
:PREROUTING ACCEPT [217327:66651913]
:OUTPUT ACCEPT [102949:46884985]
COMMIT
# Completed on Fri Dec 23 06:18:42 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:18:42 2022
*nat
:PREROUTING ACCEPT [115:6688]
:INPUT ACCEPT [49:2632]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [62:3720]
-A POSTROUTING -s 10.0.0.0/24 -o wg0 -j MASQUERADE
COMMIT
# Completed on Fri Dec 23 06:18:42 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:18:42 2022
*filter
:INPUT ACCEPT [974:119665]
:FORWARD ACCEPT [474:28440]
:OUTPUT ACCEPT [558:81105]
-A INPUT -i wg0 -j ACCEPT
-A FORWARD -i wg0 -o wg0 -j ACCEPT
COMMIT
# Completed on Fri Dec 23 06:18:42 2022
iptables-save
将 INPUT 链的默认策略更改为 DROP 后,ping 不再起作用,输出如下:
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:22:19 2022
*mangle
:PREROUTING ACCEPT [32468:2982249]
:INPUT ACCEPT [29284:2723905]
:FORWARD ACCEPT [3184:258344]
:OUTPUT ACCEPT [23854:5839963]
:POSTROUTING ACCEPT [26695:6077511]
COMMIT
# Completed on Fri Dec 23 06:22:19 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:22:19 2022
*raw
:PREROUTING ACCEPT [217953:66716467]
:OUTPUT ACCEPT [103193:46921614]
COMMIT
# Completed on Fri Dec 23 06:22:19 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:22:19 2022
*nat
:PREROUTING ACCEPT [165:9268]
:INPUT ACCEPT [73:3868]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [71:4260]
-A POSTROUTING -s 10.0.0.0/24 -o wg0 -j MASQUERADE
COMMIT
# Completed on Fri Dec 23 06:22:19 2022
# Generated by iptables-save v1.8.8 on Fri Dec 23 06:22:19 2022
*filter
:INPUT DROP [205:26532]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [26:9060]
-A INPUT -i wg0 -j ACCEPT
-A FORWARD -i wg0 -o wg0 -j ACCEPT
COMMIT
# Completed on Fri Dec 23 06:22:19 2022
(这里有一些与我的 Wireguard VPN 设置相关的附加规则,我没有提到,但它们似乎与我的默认策略问题无关)
答案1
正如评论中提到的那样这个答案,解决方案是也允许 eth0 接口上的数据包。这是有道理的,因为 wg0 接口只是虚拟的,并且需要 eth0 接口来建立隧道。
答案2
规则按行顺序进行处理。因此,如果规则匹配,则不会处理该 IP 数据包的其他规则。如果规则为匹配的数据包指定了 ACCEPT 目标,则数据包将跳过其余规则检查并允许继续到达其目的地。如果规则指定了 DROP 目标,则该数据包将被拒绝访问系统,并且不会将任何内容发送回发送数据包的主机。
正如您所述,在遵循规则集中,Drop 首先被匹配,并且没有进一步的过程进入下一行来记录您的数据包。
iptables -S INPUT
-P INPUT DROP ***Matched Line***
-A INPUT -i wg0 -j LOG --log-prefix "INPUT-wg0: "
-A INPUT -i wg0 -j ACCEPT
现在,如果您想添加日志记录,同时丢弃数据包,这样的操作可能会对您有所帮助。
iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP
欲了解更多详情,请参阅以下链接。 如何将 Linux IPTables 防火墙丢弃的数据包记录到日志文件