質問: ### 前提・実現したいこと 同じレンタルサーバー会社で管理されている、LinuxサーバーAのiptablesの設定により、LinuxサーバーAへのアクセスをLinuxサーバーB(Apach HTTPインストール済み)にアクセスするように転送処理?のようなものを実装したい。 また、LinuxサーバーAにはVPNサーバーがインストールされていて、PC -> LinuxサーバーAにはプライベートIPでアクセス可能。 ### 環境構成 PC -> サーバーA(VPN) -> サーバーB(WEB) ### 実施したこと 参考サイトをもとに、下のコマンドをLinuxサーバー上で実行。 ``` iptables -t nat -A PREROUTING -d AAA.AAA.AAA.AAA -j DNAT --to BBB.BBB.BBB.BBB iptables -t nat -A POSTROUTING -d BBB.BBB.BBB.BBB -j SNAT --to AAA.AAA.AAA.AAA ``` *補足: AAA.AAA.AAA.AAAはサーバーAのeth1に割り振らているプライベートIPアドレスで、BBB.BBB.BBB.BBBはサーバーBのグローバルIPアドレス* ### 困っていること 上記記載の参考サイト通りに実施したのですが、うまく設定が反映されていないためか(or 技術的に難しいのか)サーバーAにアクセスしてもサーバーBのWEB画面を閲覧することができません。 こういった場合に、まずどうやって原因の切り分けを実施していけばいいのか教えていただきたいです。 ### 追記 ###### 表示されるエラー WEBブラウザからサーバーBにアクセスしようとすると、「このサイトにアクセスできません」と表示されます。 (サーバーの応答時間が長すぎるためアクセスできない状態です) また、サーバーBのグローバルIPアドレスをWEBブラウザに入力すると、WEB画面が正常に表示されます。 ###### ネットワーク構成 登場人物であるPC、サーバーA(VPN)、サーバーB(WEB)のネットワーク構成を下にまとめます。 * PC | NIC | IPアドレス | 備考 | | --- | --- | --- | | VPN用仮想NIC | 192.168.0.2/24 | 下のサーバーAのlocal_tapと疎通可 | * サーバーA(VPN) | NIC | IPアドレス | 備考 | | --- | --- | --- | | eth0 | 10.0.0.1/8 | グローバルIPはxxx.xxx.xxx.xxx | | VPN用仮想NIC(local_tap) | 192.168.0.30/24 | | * サーバーB(WEB) | NIC | IPアドレス | 備考 | | --- | --- | --- | | eth0 | 172.16.0.1/16 | グローバルIPはyyy.yyy.yyy.yyy | PC -> サーバーA(local_tap)にアクセスした際に、サーバーBのグローバルIPであるyyy.yyy.yyy.yyyにアクセスするようにしたいと思っています。 (PCからサーバーBのWEB画面をWEBブラウザから確認したいです)
回答: DNAT でサーバーB にパケットを転送することは出来ますが、サーバーB に届くパケットの送信元IPアドレスは PC ですので、サーバーB からの戻りパケットは PC の IPアドレス宛に送ろうとします。 このとき、戻りパケットがサーバーA を経由しないと DNAT の逆ができず、正しく通信できません。 サーバーB のルーティング設定で、PC のネットワークセグメント宛(AAA.AAA.AAA.AAA のネットワーク宛)をサーバーA にすれば可能かもしれませんが、サーバーA にリバースプロキシーを導入した方が簡単ではないでしょうか。 ### (2019/03/24 20:53) 追記 > > サーバーB のルーティング設定で、PC のネットワークセグメント宛(AAA.AAA.AAA.AAA のネットワーク宛)をサーバーA にすれば可能かもしれませんが、 > > > サーバーA の eth0 とサーバーB の eth0 が同じネットワークセグメントじゃないので、ルーティングは無理ですね。 リバースプロキシーを導入するか、サーバーA → サーバーB に SSH できるのであれば、`SSH LocalFoward` が利用できると思います。 サーバーA の 80 番ポートを開けるので、サーバーA 側は root ユーザーで ssh を実行する必要があります。 ``` [root@サーバーA]# ssh -f -N -L 192.168.0.30:80:172.16.0.1:80 (サーバーBの任意のユーザー)@YYY.YYY.YYY.YYY ```