質問: あるクラウド環境でサーバ運用しています 今回、WEBサーバから決済用で通信するIPアドレスを1つに固定するために 決済サーバと通信する専用のサーバを作成することになりました そこで、WEBサーバから決済用のドメイン宛てはNATサーバ経由で決済サーバと通信させるための NAT設定についてご教示頂きたく思います ``` 構成は下記のようになります 決済会社への通信 Webサイトへの通信 ----->> [ 決済会社サーバ ] [ LoadBalance ] | | | <外部I/F> | <外部I/F> [ WEBサーバ ] ----- > [ 決済接続ドメイン通信 ] ----- > [ NATサーバ ] <内部I/F> <内部I/F> ``` WEBサーバには外部接続用のI/Fと内部接続用のI/Fがあります 決済用通信はWEBサーバとNATサーバ通信は内部通信I/F同士で接続出来るようにして NATサーバの外部通信I/Fから決済会社サーバと接続させる方向です この時のNAT設定(iptabale設定)をどのようにすればいいのかあまり理解出来ておりませんので ご教示頂けますと幸いです よろしくお願い致します **要件が変わりましたので再度修正記載させて頂きます** サーバは内部IPを保持していますが、サーバ間通信はグローバルIPアドレス同士でしか接続しないことが条件です 構成は下記図のようになります 現時点、natサーバから決済用サーバへの80ポート通信は出来ています WEBサーバから決済用サーバには80ポート接続は出来ない仕様です WEBサーバからの決済接続ドメイン通信はNATサーバと接続させるための WebサーバとNATサーバとの内部用VPCネットワークなどでのルーティング設定はされていません(しない方針です) とりあえず、hostsファイル内で決済サーバの名前解決を詐称して、 route add -hostで決済サーバのグローバルIPアドレスはnatサーバのグローバルIP経由で natサーバに接続させるようにしました。 いちよ、Webサーバからnatサーバまで接続出来るようにしましたが、 natサーバまで受けた決済サーバ宛先の通信を実際の外部決済サーバに転送させる設定について ご教示いただけますでしょうか ご回答頂きました設定を入れてみましたが、natサーバから決済サーバへの通信ができない状態となっています ``` 構成は下記のようになります 決済会社への通信(GlobalIP 150.1.*.*) Webサイトへの通信 ----->> [ 決済会社サーバ ] [ LoadBalance ] | | | | [ WEBサーバ ] ----- > [ 決済接続ドメイン通信 ] ----- > [ NATサーバ ] ``` **route情報は下記になります** > > Webサーバのroute情報 > > > ``` [root@web ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.200.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 0.0.0.0 10.200.0.1 0.0.0.0 UG 0 0 0 eth0 ``` > > NATサーバのroute情報 > > > ``` [root@nat ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.210.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 0.0.0.0 10.210.0.1 0.0.0.0 UG 0 0 0 eth0 ```
回答: nat テーブルの `POSTROUTING` チェインで `SNAT` または `MASQUERADE` すればいいです。 ``` // 内部I/Fのネットワークアドレス : 192.168.1.0/24 // NATサーバの外部I/F デバイス名: eth0 // NATサーバの外部I/F IPアドレス: AAA.BBB.CCC.DDD iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source AAA.BBB.CCC.DDD または iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE ``` 以下の条件が必要です。 * NATサーバの ip_forward が有効であること (sysctl -w net.ipv4.ip_forward=1) * NATサーバの iptables filter テーブルの FORWARD チェインで許可されていること * WEBサーバのルーティング設定で、決済会社サーバへの通信が NATサーバを経由すること (2017/12/22) 18:49 追記 WEBサーバ(50.151.)と NATサーバ(50.155.)は別ネットワークなのですよね? であれば、「決済接続ドメイン通信」ネットワーク向けのルーターが、それぞれのネットワークに用意されていると思います。 まずは、WEBサーバ <--> NATサーバ で「決済接続ドメイン通信」を経由して双方向に疎通できるようにルーティングする必要があります。 ``` 50.151.0.X : 「決済接続ドメイン通信」ネットワークの WEBサーバ側ゲートウェイ 50.155.0.Y : 「決済接続ドメイン通信」ネットワークの NATサーバ側ゲートウェイ [root@web]# ip route add 50.155.0.0/24 via 50.151.0.X dev eth0 [root@nat]# ip route add 50.151.0.0/24 via 50.155.0.Y dev eth0 ※ネットワークプレフィックスは /24 と仮定 ``` (2017/12/22) 23:41 追記 ネットワーク構成がわからなくなりましたが、結局、WEBサーバ <--> NATサーバ の通信はデフォルトゲートウェイを経由しているのですか? WEBサーバ <--> NATサーバ が疎通できていて、80番ポートのみでいいのであれば、NATサーバでは SNAT/MASQUERADE するのではなく、プロキシーを建てればいいのではないでしょうか?