2台のルーターによるポート転送

2台のルーターによるポート転送

2 つの異なるパブリック IP の背後にサーバーがあり、ポートに応じてトラフィックを異なる内部サーバーに送信するために DNAT を実行しています。


-------------------------                  -----------------------
| server a (port 80/tcp)|                  |       router A      |
|   (eth0) 192.168.1.123|..................|192.168.1.1 (eth1)   |
-------------------------         :        |       (eth0) 1.2.3.4|............
                                  :        -----------------------           :
                                  :                                          :
                                  :        -----------------------           :.... INTERNET
-------------------------         :        |       router B      |           :
| server a (port 25/tcp)|         :        |       (eth0) 2.3.4.5|...........:
|   (eth0) 192.168.1.234|..................|192.168.1.2 (eth1)   |
-------------------------                  -----------------------

ルータ A と BI では、転送と次の iptables が有効になっています。

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.234
iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.123

実際には、サーバー A と B に次のルートが追加されています。

route add default gw 192.168.1.1

したがって、インターネットへのすべての内部トラフィックはルータ A を通過し、ポート 25 と 80 へのすべてのトラフィックはサーバー A と B に正しく送信されますが、接続はトラフィックがルータ A を通過した場合にのみ機能します。実際、ルータ B を通過するトラフィックはサーバーに到達しますが、ルータ B ではなくルータ A を介して返されるため、接続は機能しません。

サーバーに新しいルートを追加しました:

route add default fw 192.168.1.2

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
0.0.0.0         192.168.1.2     0.0.0.0         UG    0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

しかし、接続はまだ機能していません。

どうすればそれを管理できるでしょうか?

内部 -> 外部のトラフィックのバランスを取ることは重要ではありませんが、インターネットから外部 IP に対するすべての着信接続が正しく確立されることを望みます。

注: ルーターの 1 つで他のルーターの外部 IP に対して DNAT を実行しようとしましたが、それらは異なるネットワーク上にあるため機能しませんでした。

iptables -t nat -I PREROUTING -p tcp --dport 25 -d ${ExternalIPA} -i eth0 -j DNAT --to ${ExternalIPB}

答え1

Router-A現在の設定では、意図したとおりに動作しません。とにまたがる仮想IPが必要ですRouter-B。これにより、2つのルーター間の負荷分散も簡単に行えます。この例では、業界標準の仮想化Linux ルーター (Ubuntu-16) 上。

手順は次のとおりです。

LinuxRouter-Aとの両方でRouter-B、次のコマンドを実行します。

$ sudo echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf
$ sudo sysctl -p

両方のルーターにk​​eepalivedをインストールする

$ sudo apt-get update
$ sudo apt-get install keepalived -y

次に、Router-Aとして動作するに移動します。次のエントリを含むMASTER新しい構成ファイルを作成します。/etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    interface eth1
    state MASTER
    virtual_router_id 50
    priority 101

    authentication {
        auth_type AH
        auth_pass pass123
    }

    virtual_ipaddress {
        192.168.1.99
    }
}

Router-B次に、として動作するに移動しBACKUP、新しい構成ファイルに対して同じ操作を実行します/etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    interface eth1
    state BACKUP
    virtual_router_id 50
    priority 100

    authentication {
        auth_type AH
        auth_pass pass123
    }

    virtual_ipaddress {
        192.168.1.99
    }
}

説明:

net.ipv4.ip_nonlocal_bind=1仮想 IP をどの物理インターフェースにもバインドしてはならないことをカーネルに指示します。

vrrp_instance VI_1両方のルータで一致する必要があります。これは、同じルータで複数の VRRP を実行できるための識別子です。

interface eth1LAN に面している (内部サーバーに面している) インターフェースです。

state MASTERon Router-Aand state BACKUPon はRouter-B説明不要です。

virtual_router_id 50両方のルータで一致する必要があります。これは識別子です。

priority 101繰り返しRouter-Aます(この場合、ルータ A の優先度が高くなります) priority 100Router-B

authentication両方のルーターで一致する必要があります。この場合、事前共有キーとしてpassw123

virtual_ipaddressVRRPが使用するフローティングIPアドレスです。このIPは両方のルータで一致している必要があります。このIPはLANセグメント上のどのデバイスでも使用できません。この場合は192.168.1.99

キープアライブサービスを有効にする

$ sudo systemctl enable keepalived

keepalived サービスを開始する

$ sudo systemctl start keepalived

両方のルーターで iptables ルールを操作する時間です。

両方のルーターからすべての NAT ルールをクリアします (壊れた NAT ルールを削除します)

$ sudo iptables -t nat -F
$ sudo iptables -t mangle -F

次に、正しい NAT ルールを追加します。

ルータA

$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 192.168.1.99
$ sudo iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.234

ルータB

$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 192.168.1.99
$ sudo iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.123

ルーター側で必要なのはこれだけです。次に、サーバー(Server-AとServer-B)に移動し、既存のデフォルトゲートウェイ(192.168.1.1)を削除して、新しいゲートウェイ(192.168.1.99)を割り当てます。

$ sudo ip route del 0/0
$ sudo route add default gw 192.168.1.99

192.168.1.99インターネットからの接続が確立されると、2つのサーバー(サーバーAとサーバーB)は、上に表示される仮想IP( )にトラフィックを返しますRouter-ARouter-B

参照:https://www.keepalived.org/manpage.html

答え2

最終的に、基本的に CONNNMARK を使用してさまざまなルートを追加することで、仮想 IP を使用せずに動作させることができました。

注記:

  • ルータA eth1 MAC = AA:AA:AA:AA:AA:AA
  • ルータ B eth1 MAC = BB:BB:BB:BB:BB:BB

非対称ルートを使用しているすべてのサーバーに次のルートと iptables を追加する必要があります。

# add the two routing tables
ip route add to default table 11 via 192.168.1.1 dev eth0
ip route add to default table 33 via 192.168.1.2 dev eth0

# add the mark to the routing tables
ip rule add priority 99 table 11 fwmark 11
ip rule add priority 99 table 33 fwmark 33

# mark the packets that came from the different routes
iptables -t mangle -A OUTPUT ! -d 192.168.1.0/24 -m addrtype --dst-type UNICAST -j CONNMARK --restore-mark
iptables -A INPUT -i eth0 ! -s 192.168.1.0/24 -m addrtype --src-type UNICAST -m mac --mac-source AA:AA:AA:AA:AA:AA -j CONNMARK --set-mark 33
iptables -A INPUT -i eth0 ! -s 192.168.1.0/24 -m addrtype --src-type UNICAST -m mac --mac-source BB:BB:BB:BB:BB:BB -j CONNMARK --set-mark 11

現在、すべて正常に動作しています。インターネットから外部 IP アドレスへのすべての接続は、DNAT 接続を管理するルーターを介してルーティングされます。

関連情報