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
relay1
HAProxy()または透過モードを通過するトラフィックを正しく処理するrelay2
ためにゲートウェイとして機能するリレー(または)の目的と方法は次のとおりです。relay3
default-gateway
10.0.0.1
master-relay
10.0.0.254
リレーは
default-gateway
通常のトラフィックに通常のゲートウェイを使用する必要があります。つまり:- ローカルで開始されたトラフィック、
- 転送されたリモート開始トラフィックへのアウトバウンド応答
default-gateway
。
リレーは
master-relay
HAProxyを使用してトラフィックを代替ゲートウェイに透過的にリレーする必要があるため、次の場合にのみ適用されます。master-relay
バックアップゲートウェイを通過したリモート開始トラフィックへのアウトバウンド応答。
ルーティングケース1とケース2を区別するセレクタは、バックアップゲートウェイの送信元MACアドレスです
master-relay
。こうしておいてください02:03:04:05:06:07
。接続の最初のパケットで選択が行われた場合、接続の他のすべてのパケット部分についても選択は同じままである必要があります。
これには、バックアップルーティングテーブル(ip route add table ...
)、使用ip rule add fwmark...
に応じて追加のルーティング決定()を含むポリシールーティングが必要です。iptables
mac
MACアドレスセレクタのマッチングモジュール、MARK
ルーティング決定の対象を変更し、CONNMARK
目標は、全体の接続決定を覚えることです。
ケース 1. は特別な処理のない基本ケース、ケース 2 は例外であり、デフォルトdefault-gateway
ゲートウェイとして使用するには、ルーティングの変更を通常どおりに戻す必要があります。
ip route replace default via 10.0.0.1
ケース 2. バックアップ ルーティング テーブルに保存されます。命名は不要です。どんな数でも可能です。選択します1000254
(254
予約済み、これが基本テーブルです...):
ip route add table 1000254 default via 10.0.0.254
iptables
これを使用したルーティング決定は、タグ値(目的地)によってトリガされますMARK
。以下を選択してみましょう254
。
ip rule add fwmark 254 lookup 1000254
わかるように一般ネットワークのNetfilterとパケットフローのルールは、iptables
ルーティングの決定(または再ルーティングの確認)が完了する前にフラグを設定できます。結局、コースがこんなに変わりました。したがって、単一の受信パケットの場合は次のようになります。mangle/PREROUTING
mangle/OUTPUT
iptables
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_filter
1つのネットワークインターフェイスしか含まれていないため、緩いモードです。
冗長性が必要な場合は、より多くのテーブル、ルール、およびタグを簡単に挿入して複数のテーブル、ルール、およびタグを持つことができます(またはmaster-relay
IPが何らかの理由でMACアドレスを変更できる場合は、追加できます)。 IPおよびMACを使用したmaster-relay
追加のHAProxyの例:10.0.0.250
0A: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 -L
connmarkが表示されるため、そのマークが代わりに使用されるmaster-relay
ため、デフォルトの接続ではなく接続が転送されたかどうかを区別するために使用できます。254
0
# 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.