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 コマンドは何も返しません。

注: 両方ともルート権限を持っています。

答え1

このマークは内部的なものであり、パケットやそのヘッダーのどこにも含まれません。

つまり、実際の送信接続を行うときに失われ、ターゲット サーバーのテーブルには表示されませんが、開始マシンのテーブルINPUTには表示されます。OUTPUT

ping でマークをサポートする目的は、発信ルーティング ルールを許可することです。

答え2

@Julie Pelletier さんの回答は 100% 正しいですが、おそらくあなたにはあまり理解できないでしょう。

まず、コメントで何度も言及されているように、マークはないイーサネットパケットにマークが挿入されます。したがって、サーバーAからサーバーBにpingを実行しても、サーバーBはマークを検出できません。何かしたい場合は、サーバーAのみを使用する必要があります。したがって、送信者何かを見るために。

それでは、 の使い方を見てみましょう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 バイトのパケットを 1 つ検出しています。

実験したい場合は、この後、iptables -F OUTPUTテーブルをクリアして、iptables -I OUTPUT -m mark --mark 0x0a -j REJECTマークされたパケットがマシンから出ないようにし、マークのあるマシンとマークのないマシンに ping を実行します。ルールによってマークされたパケットがドロップされるため、マークされたパケットが応答を受け取っていないことがわかります。

関連情報