我正在学习 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 操作。现在,您将看到标记的数据包没有得到回复,因为规则将丢弃它们。