ソースMACフィルタ iptables

ソースMACフィルタ iptables

smtpクラスタのロードバランシングプロキシとしてcentos7がインストールされたHAProxyボックスがあり、顧客にメールリレーを提供します。

default gateway => 10.0.0.1
master-relay.example.net => 10.0.0.254
relay1.example.net => 10.0.0.10 | gateway 10.0.0.1
relay2.example.net => 10.0.0.11 | gateway 10.0.0.1
relay3.example.net => 10.0.0.12 | gateway 10.0.0.1

各リレーは、ポート 25 および 587 でリッスンするサフィックスで構成されます。

私が達成する必要があるのは、誰かが3つのリレー(リレー1​​、リレー2、またはリレー3)のいずれかに直接接続されたメールを送信しようとすると、応答パケットがデフォルトゲートウェイに転送されることです。これは通常、外部メールサーバーが私たちに電子メールを送信しようとし、同じ優先順位を持つ3つのMXサーバーのいずれかにランダムに接続するときに発生します。

ただし、モバイルまたはWebメールクライアントが電子メールを中継するためにクラスタに接続すると、デフォルトの中継に中継され、クライアントは3つのMXサーバーのいずれかに接続してメールを転送します。

クラスターの HAProxy 構成は次のとおりです。

# Puerto 25 - SMTP (Postfix Cluster)
frontend frontend-smtp-25
        bind 10.0.0.254:25 transparent
        option tcplog
        default_backend backend-smtp-25

backend backend-smtp-25
        option tcplog
        source 0.0.0.0 usesrc clientip
        server mx1 10.0.0.10:25 check
        server mx2 10.0.0.11:25 check
        server mx3 10.0.0.12:25 check

# Puerto 587 - STARTTLS (Postfix Cluster)
frontend frontend-smtp-587
        bind 10.0.0.254:587 transparent
        option tcplog
        default_backend backend-smtp-587

backend backend-smtp-587
        option tcplog
        source 0.0.0.0 usesrc clientip
        server mx1 10.0.0.10:587 check
        server mx2 10.0.0.11:587 check
        server mx3 10.0.0.12:587 check

カーネルパラメータ:

net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_recycle
net.ipv4.ip_local_port_range = 1025 65535

net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1

ファイアウォールルール:

iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

この設定では、中継ボックスのデフォルトゲートウェイをプライマリリレーゲートウェイに変更すると、すべてがうまく機能し、postfixログにプライマリリレーのIPアドレスではなくクライアントのIPアドレスが表示されますが、ここでは、たとえば、誰かがRelay1に直接接続している場合は、ゲートウェイではなくデフォルトのリレーを介して応答し、クライアントはパケットがRelay1ボックスから出ないために破棄します。

私がやろうとしているのは、3つのリレーボックスすべてにプライマリリレーのソースMACアドレスをタグ付けすることです。タグに一致するすべてのエントリは、デフォルトゲートウェイをデフォルトリレーのゲートウェイに変更します。

すべてのIPは公認IPなので、インターネットで見ることができます。

私ができることは、同じインターフェイスに2つのIPを配置し、パケットがIP1に到達した場合は1つのゲートウェイに応答し、IP2に達すると別のゲートウェイに応答することです。しかし、可能であればMacを好む。

プロキシに到達するためにクライアントIPアドレスを使用するため、プライマリリレーIPアドレスからのパケットに再応答するように強制するルールを作成することはできません。

事前にありがとう

答え1

relay1HAProxy()または透過モードを通過するトラフィックを正しく処理するrelay2ためにゲートウェイとして機能するリレー(または)の目的と方法は次のとおりです。relay3default-gateway10.0.0.1master-relay10.0.0.254

  1. リレーはdefault-gateway通常のトラフィックに通常のゲートウェイを使用する必要があります。つまり:

    • ローカルで開始されたトラフィック、
    • 転送されたリモート開始トラフィックへのアウトバウンド応答default-gateway
  2. リレーはmaster-relayHAProxyを使用してトラフィックを代替ゲートウェイに透過的にリレーする必要があるため、次の場合にのみ適用されます。

    • master-relayバックアップゲートウェイを通過したリモート開始トラフィックへのアウトバウンド応答。
  3. ルーティングケース1とケース2を区別するセレクタは、バックアップゲートウェイの送信元MACアドレスですmaster-relay。こうしておいてください02:03:04:05:06:07

  4. 接続の最初のパケットで選択が行われた場合、接続の他のすべてのパケット部分についても選択は同じままである必要があります。

これには、バックアップルーティングテーブル(ip route add table ...)、使用ip rule add fwmark...に応じて追加のルーティング決定()を含むポリシールーティングが必要です。iptablesmacMACアドレスセレクタのマッチングモジュール、MARKルーティング決定の対象を変更し、CONNMARK目標は、全体の接続決定を覚えることです。

ケース 1. は特別な処理のない基本ケース、ケース 2 は例外であり、デフォルトdefault-gatewayゲートウェイとして使用するには、ルーティングの変更を通常どおりに戻す必要があります。

ip route replace default via 10.0.0.1

ケース 2. バックアップ ルーティング テーブルに保存されます。命名は不要です。どんな数でも可能です。選択します1000254254予約済み、これが基本テーブルです...):

ip route add table 1000254 default via 10.0.0.254

iptablesこれを使用したルーティング決定は、タグ値(目的地)によってトリガされますMARK。以下を選択してみましょう254

ip rule add fwmark 254 lookup 1000254

わかるように一般ネットワークのNetfilterとパケットフローのルールは、iptablesルーティングの決定(または再ルーティングの確認)が完了する前にフラグを設定できます。結局、コースがこんなに変わりました。したがって、単一の受信パケットの場合は次のようになります。mangle/PREROUTINGmangle/OUTPUTiptables

iptables -t mangle -A PREROUTING -m mac --mac-source 02:03:04:05:06:07 -j MARK --set-mark 254

これで、接続全体を覚えておくには、次の操作を行う必要があります。CONNMARK呼び出されると、そのストリームのconntrackエントリにマーカーを保存して検索し、OUTPUTの方向を忘れずに最初にのみ設定できるようにします。このブログにはいくつかの説明があります。Linux以上!ネットフィルターコマック。 LANトラフィックのパケットを表示する必要がないため、フィルタリングされます(これはconntrack -L最後にビューを使用するときに役立ちます)。最後に、前のルールを含めると次のようになります。

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN
iptables -t mangle -A PREROUTING ! -s 10.0.0.0/24 -m mac --mac-source 02:03:04:05:06:07 -j MARK --set-mark 254
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark

それはすべてです。この場合、設定も不要です。rp_filter1つのネットワークインターフェイスしか含まれていないため、緩いモードです。

冗長性が必要な場合は、より多くのテーブル、ルール、およびタグを簡単に挿入して複数のテーブル、ルール、およびタグを持つことができます(またはmaster-relayIPが何らかの理由でMACアドレスを変更できる場合は、追加できます)。 IPおよびMACを使用したmaster-relay追加のHAProxyの例:10.0.0.2500A:09:08:07:06:05

ip route add table 1000250 default via 10.0.0.250
ip rule add fwmark 250 lookup 1000250
iptables -t mangle -I PREROUTING 4 ! -s 10.0.0.0/24 -m mac --mac-source 0A:09:08:07:06:05 -j MARK --set-mark 250

conntrack -Lconnmarkが表示されるため、そのマークが代わりに使用されるmaster-relayため、デフォルトの接続ではなく接続が転送されたかどうかを区別するために使用できます。2540

# conntrack -L -s 198.51.100.1
tcp      6 431635 ESTABLISHED src=198.51.100.1 dst=10.0.0.10 sport=50230 dport=25 src=10.0.0.10 dst=198.51.100.1 sport=25 dport=50230 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 use=1
tcp      6 431527 ESTABLISHED src=198.51.100.1 dst=10.0.0.10 sport=49554 dport=25 src=10.0.0.10 dst=198.51.100.1 sport=25 dport=49554 [ASSURED] mark=254 secctx=system_u:object_r:unlabeled_t:s0 use=1
conntrack v1.4.4 (conntrack-tools): 2 flow entries have been shown.

関連情報