![2台のルーターによるポート転送](https://rvso.com/image/761005/2%E5%8F%B0%E3%81%AE%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AB%E3%82%88%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E8%BB%A2%E9%80%81.png)
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
両方のルーターにkeepalivedをインストールする
$ 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 eth1
LAN に面している (内部サーバーに面している) インターフェースです。
state MASTER
on Router-A
and state BACKUP
on はRouter-B
説明不要です。
virtual_router_id 50
両方のルータで一致する必要があります。これは識別子です。
priority 101
繰り返しRouter-A
ます(この場合、ルータ A の優先度が高くなります) priority 100
。Router-B
authentication
両方のルーターで一致する必要があります。この場合、事前共有キーとしてpassw123
virtual_ipaddress
VRRPが使用するフローティング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-A
。Router-B
答え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 接続を管理するルーターを介してルーティングされます。