Operandiコンピュータ関係のTipsやトラブルシューティングメモ。若干専門用語多めです。Software::Linux諸般の事情でネットワークセグメントを分けたのだけど、どうしてもあるポートだけ疎通させたいと思ったので、iptablesのNAT機能を使って実現してみた。ルールの書き方はiptables本来のfilterとは少し違うのと、他のサイトでは解説が不足している点があるな、と思ったのでしっかり書き留めておく。やろうとしていることこの図の通り。今回、iptablesを使ってNATさせる箱は、192.168.1.30と10.0.2.40と二つのサブネットのIPを持っていなければならない。クライアント(192.168.1.20)とサーバ(10.0.2.50)となる2ホストに、スタティックルートを書く必要はない所がポイント。NAT箱でアドレスを変換するので、クライアントは192.168.1.30さえ到達可能であればよい。同様にサーバも10.0.2.40には到達可能なので、実現できる。今回ルータは関係無いので図から削除。クライアントはサーバのTCP80番ポートを開きたいのだが、直接到達できないので、代わりにNAT箱の192.168.1.30:1234を叩くことによって開く。ip_forwardまずは、NAT箱にパケットのルーティングをさせるように設定。設定ファイルにも書き込んでおく。/etc/sysctl.confNATテーブルまずは、アドレスを変換するルール。ちなみに以下で出てくるPREROUTINGとPOSTROUTINGというチェインの間に、FORWARDチェインが処理されると考えると良い。参考NAT箱の192.168.1.30:1234宛に届いたパケットを、10.0.2.50:80へ投げるというNATを書く。10.0.2.50:80しかし、このままだと宛先アドレスを書き換えるだけなので、サーバ(10.0.2.50)は192.168.1.20という知らないサブネットから受信することになり、戻りのパケットは自分のデフォルトゲートウェイ10.0.2.1へ送りつける。これではマズいので、NATしたパケットの送信元アドレスを10.0.2.40に変更するのがミソ。"10.0.2.50:80宛のパケットは、NAT箱の10.0.2.40というアドレスに付け替えてから送信する"というルールを書く。10.0.2.40逆方向に関しては、このルールだけで自動的に処理されるため心配しなくて良い。クライアントの送信元ポート番号をきちんと覚えていて、そこに向かって戻りパケットを変換してくれる。Filterテーブル前述のルーティングだけ紹介しているサイトが多かったのだが、本来はここからきちんとパケット転送させるためのフィルタも書かなくてはならない。用心深い設定をしている人なら、チェインのデフォルトポリシーがDROPだろうから、上の設定だけではパケットは飛ばないはず。destinationというわけで、こんな感じで転送するパケットを許可。NATのPREROUTINGを通って変換されたアドレスに対して許可ルールを書いておく。ACCEPT忘れちゃいけないのが、戻りのパケットも許可するということ。これはTCPのフラグを見て通すようにするおなじみのやり方で。MTU周りの心配をすることはないのだけど、MTUが違うサブネット同士を結ぶ場合には以下の設定も入れておくと吉。かえでのWebログDNATの説明があってもSNATの説明がないサイトが多かったり、FORWARDチェインをデフォルトをDROPにしてたり、戻りのFORWARDが落ちていることに気づかず、結構手間取った。-考になった記事や興味深かった記事は、他の人も見つけやすいようにTwitterやFacebookへポストしたり、はてブしていただけると助かります。返信をお急ぎの場合は、@kero7にお知らせ下さい。似たようなうことを行おうとしていますがうまくいきません。NAT箱には10.0.2.10(eth1)と192.168.1.1(eth2)が割り当てられており、10.0.2.10側がインターネットにつながる側、192.168.1.1側はプライベートネットワークで、NAT箱にはDHCP機能も持たせて192.168.1.Xのアドレスを発行させています。ACCEPTを設定しており、これでプライベートネットワークからインターネットに問題なくアクセスできています。192.168.1.2にはWebサーバが立ててあり、10.0.2.10からはhttp://192.168.1.2でアクセスできます。10.0.2.10は基本的にヘッドレスなので、できれば10.0.2.X側からこれを経由してWebサーバにアクセスしたいと考えています。--clamp-mss-to-pmtuを設定しましたが、10.0.2.X側のPCからhttp://10.0.2.10:8080にアクセスするとずっと待機状態になり、192.168.1.2のWeb画面にアクセスできません。上記の設定にどこか間違いがありますでしょうか。非公開コメント投稿?返信を期待する場合には、非公開にしないでください。