web-dev-qa-db-ja.com

iptablesでマークを一緒に追加する方法(ターゲットMARKおよびCONNMARK)

iptablesでパケットをマークする場合は、通常、ファイアウォールスクリプトに次の行を追加します。

iptables -t mangle -A POSTROUTING -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2

このテーマは少し複雑ですが、単一のルールだけに焦点を当てましょう。上記のようなものを/proc/net/nf_conntrack file一部のエントリにはマークセットがあります。

ipv4     2 tcp      6 3706 ESTABLISHED ... mark=2

ルールの問題は、たとえば送信元または宛先アドレスに一致する別のルールを追加して別のマークを設定すると、以前のマークが設定したものに書き換えられることです。ただし、マークを「追加」する方法はいくつかあります。したがって、1つのルールセットがmark=2および別のルールセットmark=5の場合、結果のマークはmark=7、またはそのようなもの。

mwan に基づく実用的な例が1つありますが、実際にはわかりません。ツールを起動した後のmangleテーブルの外観と、追加されたルールを知っています。

enter image description here

そのため、メカニズムを理解するには、到着するパケットに実際に何が起こるかを知る必要があります。ただし、この例では、マーキングルールが異なります。

2つの異なるWANインターフェースがあります。マークに基づいて、パケットは異なるルーティングテーブルに送られます。そのため、ポート443、たとえばポート宛てのパケットに実際に何が起こるか1000?誰かがルールの分析を手伝ってくれませんか?

2

ターゲット "-j MARK --set-mark 2"は、以前の値が何であれ、パケットにマーク2を設定します。マークが消去されないようにするには、チェーンのパケットパスを-j ACCEPTで終了するだけです。例えば ​​:

iptables -t mangle -A POSTROUTING -p tcp --dport 80 -j MARK --set-mark 10
iptables -t mangle -A POSTROUTING -p tcp --dport 80 -j ACCEPT
iptables -t mangle -A POSTROUTING -d 8.8.8.8 -j MARK --set-mark 20
iptables -t mangle -A POSTROUTING -d 8.8.8.8 --dport 80 -j ACCEPT
# If you open a connection to 8.8.8.8:80, the mark will be 10

ただし、メインチェーン(例:POSTROUTING)またはカスタムチェーンにいる場合は注意が必要です。ACCEPTはメインチェーンを終了し、RETURNは現在のチェーンを終了します。それはあなたのニーズに依存します。

Mwan3の例については、フィルター、NAT、およびrawテーブルがなく、tc構成がないと、確認するのが非常に困難です。

ただし、次のようになります。

  • 「mwan3_rules」チェーンは、dport 80または443の新しい接続から「mwan3_policy_balanced」チェーンにパケットを送信します
  • 「mwan3_policy_balanced」チェーンは、パケットの40%にマーク200を設定し、他のパケットにはマーク100を設定しました
  • 「mwan3_rules」チェーンは、dport 80または443以外の新しい接続から「mwan3_policy_wan_only」チェーンにパケットを送信します
  • 「mwan3_policy_wan_only」チェーンはマーク100を設定しました
  • マーク100のパケットはケーブルを通過し、マーク200のパケットはlteを通過すると思います

したがって、http(s)トラフィックの40%はLTEを通過し、60%はケーブルを通過し、その他はすべてケーブルを通過します。

2つのISPで接続の負荷分散を行うことが目的の場合、mwan3のルールは読みにくいため、独自のiptablesルールを最初から作成する必要があります。

this の質問から始めることができます。

幸運を !

エディション:

ドキュメント は次のように述べています。

--set-xmark value[/mask]
    Zero out the bits given by mask and XOR value into the ctmark.

0x100マークがあり、xmark 0x200/0xff00を設定しようとする場合:

  • Ctmarkで、マスクによって指定されたビットをクリアします。00000001 0000 0000 AND NOT 1111 1111 0000 0000-> 0000 0000 0000 0000
  • CtmarkへのXOR値:0000 0000 0000 0000 XOR 0000 0010 0000 0000-> 0000 0010 0000 0000-> 0x200-> 512

0x100マークがあり、xmark 0x200/0xf000を設定しようとする場合:

  • Ctmarkで、マスクによって指定されたビットをクリアします。00000001 0000 0000 AND NOT 1111 0000 0000 0000-> 0000 0001 0000 0000
  • CtmarkへのXOR値:0000 0001 0000 0000 XOR 0000 0010 0000 0000-> 0000 0011 0000 0000-> 0x300-> 768

0x100マークがあり、xmark 0x100/0xf000を設定しようとする場合:

  • Ctmarkで、マスクによって指定されたビットをクリアします。00000001 0000 0000 AND NOT 1111 0000 0000 0000-> 0000 0001 0000 0000
  • CtmarkへのXOR値:0000 0001 0000 0000 XOR 0000 0001 0000 0000-> 0000 0000 0000 0000-> 0x000-> 0

0x100マークがあり、xmark 0x100/0xff00を設定しようとする場合:

  • Ctmarkで、マスクによって指定されたビットをクリアします。00000001 0000 0000 AND NOT 1111 1111 0000 0000-> 0000 0000 0000 0000
  • CtmarkへのXOR値:0000 0000 0000 0000 XOR 0000 0001 0000 0000-> 0000 0001 0000 0000-> 0x100-> 256

Mwan3ファイルでは、ケースは常にこれです。

  • 0x0マークがあり、xmark 0x ?? 00/0xff00を設定しようとしています
  • Ctmarkで、マスクによって指定されたビットをクリアします。00000000 0000 0000 AND NOT 1111 1111 0000 0000-> 0000 0000 0000 0000
  • CtmarkへのXOR値:0000 0000 0000 0000 XOR ???? ???? 0000 0000-> ???? ???? 0000 0000-> 0x ?? 00 ->?
  • このマスクとこれらの値を使用して、set-xmarkは以前の値を置き換えるだけです。

さて、チェーンを見てみましょう:

  • プレルーティングはmwan3_hookにジャンプします。
  • mwan3_hook connmarksをmarksに復元する
  • mwan3_hookは新しい接続(マーク= 0x0)をmwan3_ifacesに送信します
  • mwan3_ifacesは新しい接続をmwan3_iface_wanに送信します
  • mwan3_iface_wanは、ソースアドレスがipsetリストにある場合、インターフェイスeth0からの新しい接続にマーク0xff00を設定しますmwan3_connected
  • mwan3_iface_wanは、インターフェイスeth0上の他の新しい接続にマーク0x100を設定します
  • mwan3_ifacesは新しい接続をmwan3_iface_lteに送信します
  • mwan3_iface_lteは、送信元アドレスがipsetリストにある場合に、インターフェース0wanからの新しい接続にマーク0xff00を設定しますmwan3_connected
  • mwan3_iface_lteは、マーク0x200をインターフェースwwanの他の新しい接続に設定します
  • 注:この時点で、すべての着信接続はマークされています
  • mwan3_hookはmwan3_connectedに接続を送信します
  • mwan3_connectedは、宛先アドレスがipsetリストにある場合にマーク0xff00を設定しますmwan3_connected
  • mwan3_hookは接続をmwan3_trackに送信します
  • mwan3_trackは、宛先IPがipsetリストのmwan3_track_wanにある場合、接続にマーク0xff00を設定します。パケットは32バイト長のicmpエコーです
  • mwan3_trackは、宛先IPがipsetリストmwan3_track_lteにある場合、接続にマーク0xff00を設定します。パケットは32バイト長のicmpエコーです
  • mwan3_hookは接続をmwan3_rulesに送信します
  • mwan3_rulesは新しいtcp/80またはtcp/443接続を内部からmwan3_policy_balancedに送信します
  • mwan3_policy_balancedは、マーク0x200を新しい接続の40%に設定します
  • mwan3_policy_balancedは、マーク0x100を他の新しい接続に設定します
  • mwan3_hookマークをconnmarksに復元します
  • mwan3_hookは、まだマークされていない接続にマーク0xff00を設定します(ICMPタイプ8、TCP/80、TCP/443ではなく、内部から)
  • プレルーティングはfwmarkにジャンプしますが、チェーンは画面上にありません
  • MSSを前方修正
  • 出力はmwan3_hookにジャンプし、すべてのステップが再度実行されます。

最後に、3つの状態があります。

  • 0x100マーク(256):WANからの接続、およびインターネットへのhttp(s)接続の60%
  • 0x200マーク(512):lteからの接続、およびインターネットへのhttp(s)接続の40%
  • 0xff00マーク(65280):その他のトラフィック

私たちはipルールを持っていないので、推測することしかできません:

  • 0x100マークはWANルーティングテーブルを通過します
  • 0x200マークはLTEルーティングテーブルを通過します
  • 0xff00は別のルーティングテーブルを通過します
5
Sanael