为什么 iptables 收不到标记的数据包?

为什么 iptables 收不到标记的数据包?

我正在学习 ping 命令选项。在其中我找到了 -m 选项来设置数据包的标记。

以下命令将标记为 10 的数据包发送到 192.168.2.65。

ping -m 10 192.168.2.65

使用下面的命令我可以在目的地接收该数据包。

iptables -A INPUT -m mark --mark 0xa -j ACCEPT

但上面的命令并没有收到标记的数据包。上面的 iptables 命令不返回任何内容。

注意:我们都拥有 root 权限。

答案1

该标记是内部的,不包含在数据包或其任何标头中的任何位置。

INPUT这意味着在进行实际的出站连接时它会丢失,并且在目标服务器的表中不可见,但您会在OUTPUT发起计算机的表中看到它。

在 ping 中支持标记的目的是允许出站路由规则。

答案2

@Julie Pelletier 的答案 100% 正确,但您可能不太理解。

首先,正如评论中多次提到的,标记是不是放入线路上的以太网数据包中。因此,如果您从服务器 A ping 服务器 B,服务器 B 将永远无法检测到该标记。如果你想做任何事情,你就必须单独使用服务器 A。因此,您必须将规则插入/附加到 OUTPUT 链发件人看到任何东西。

现在,让我们看看如何使用iptables。首先,我们想查看 OUTPUT 中哪些规则处于活动状态:

root@roran:~# iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination                                                                                           
root@roran:~#

好吧,没有规则。让我们定义一个规则:

root@roran:~# iptables -I OUTPUT -m mark --mark 0xa -j ACCEPT
root@roran:~#

如您所见,没有输出。但内核表现在有一个条目:

root@roran:~# iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 177 packets, 120K bytes)
 pkts bytes target     prot opt in     out     source               destination                                                                                           
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0  mark match 0xa
root@roran:~#

“pkts”和“bytes”列均为 0,因为还没有数据包发出。现在,ping 另一台服务器,没有设置标记:

root@roran:~# ping -c 1 bermuda
PING bermuda (192.168.178.2) 56(84) bytes of data.
64 bytes from bermuda (192.168.178.2): icmp_seq=1 ttl=64 time=0.331 ms
[... some more lines omitted]

之后,内核表仍然没有匹配任何内容:

root@roran:~# iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 348 packets, 160K bytes)
 pkts bytes target     prot opt in     out     source               destination                                                                                           
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0  mark match 0xa
root@roran:~#

接下来,尝试使用标记集进行 ping 操作:

root@roran:~# ping -m 10 -c 1 bermuda
PING bermuda (192.168.178.2) 56(84) bytes of data.
64 bytes from bermuda (192.168.178.2): icmp_seq=1 ttl=64 time=0.324 ms
[... some more lines omitted]

再看一下表格:

root@roran:~# iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 631 packets, 319K bytes)
 pkts bytes target     prot opt in     out     source               destination                                                                                           
    1    84 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0  mark match 0xa
root@roran:~#

现在,该规则已找到一个数据包,该数据包有 84 字节。

如果你想尝试一下,在此之后,请iptables -F OUTPUT清除表格;iptables -I OUTPUT -m mark --mark 0x0a -j REJECT为了防止标记的数据包从您的计算机中流出,请对带有或不带有标记的另一台计算机执行 ping 操作。现在,您将看到标记的数据包没有得到回复,因为规则将丢弃它们。

相关内容