人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

1台のサーバで、インターネットへの出口となるルータが複数あり、かつ、そのルータが別々のプロバイダへ繋がっていて、それぞれのルータで、内部の1台のサーバに NAT している場合、インターネット側からサーバへの TCP のコネクションが成立するには、何が必要ですか?

関連:http://q.hatena.ne.jp/1228386753

上記、質問のコメントでは、単にルータを並列に並べれば良いように書かれていますが、単純に考えれば、サーバは、送信先の IP アドレスとルーティングテーブルに従って、パケットを投げるルータを選択するだけで、クライアントの IP アドレスが含まれるネットワークアドレスがサーバのルーティングテーブルに無ければ、デフォルトゲートウェイに指定されたルータへ送られると思います。

サーバが Linux であれば iproute や iptables をごちょごちょすると出来そうな気がしますが、サーバ側に特別な仕組み無しに、確実に TCP のコネクションが成立する(クライアントが送った時の送信先 IP アドレスからパケットが返される)としたら、どんな仕組みによるものですか?

●質問者: JULY
●カテゴリ:コンピュータ インターネット
✍キーワード:IP iptables Linux NAT TCP
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● goodvn
●100ポイント

まず,コメントに惑わされているのだと思いますが,ネットワークの仕組み的に言うと,送った IP と異なる IP からパケットが返ってくるのは,TCP として成立していなくは無くて,正しい動作です

しかし実際には,サーバに接続してくるユーザは,NAT などを使って The Internet に接続しており,この NAT の仕様としては,送った IP と異なる IP からのパケットを,ローカルネットワークに届ける術が無いので,パケットを破棄してしまうでしょう

NAT が入ると複雑なので,ちょっと整理してみます

まず,サーバは,複数の IP で Listen しているとします.ここでは,

・10.0.0.1

・10.0.1.2

・10.0.2.3

とします.10.0.0.1 がプライマリに割り振ったアドレスで,後はエイリアスとします

10.0.1.2 で httpd が Listen してたとします.ここに,どこかの IP (172.16.1.2 としましょうか) からコネクションの要求があり,accept したとします.この通信は,172.16.1.2 と 10.0.1.2 の間で成立しているので,ルーティングテーブルもデフォルトゲートウェイも関係ありません

10.0.2.3 で httpd が Listen してたとします.以下略.通信は,172.16.2.3 と 10.0.2.3 の間ですね

しかし,この httpd がプログラムを起動し(例えが wget),どこか他のマシンへ接続しに行くとします.この場合,ソース IP としては,10.0.0.1 が使われ,特にルーティングが決められていなければ,デフォルトゲートウェイへ抜けていきます

FTP などのサービスは,始めのコネクションは ポート21 で受け付けますが,データの転送は異なるポートを開きます.NAT 環境で FTPサーバがうまく動かないのも,この辺りが原因なのですが,こういう動作を行うアプリケーションの場合,上記にあげた,異なるソースIP が使われ,異なるゲートウェイを通ってしまうために,うまく動かないだろうと思います(TCP 的におかしいのではなく,もっと上位レイヤーの話)

というのも,自宅サーバでは縁が無いでしょうが,普通のサーバというのは,マルチホームといわれるネットワークに接続されています.この辺は調べていただくとさらに詳しい情報が出ますが,複数の経路を持っているなんてことは当たり前なんです

でも,家庭用ネットワークは,シングルホームといって,接続先は一つである前提で作られています.仕様としては間違って無くても,想定外の利用方法のために,うまくいかなくなります

家庭用ルータでは難しいでしょうから,YAMAHA の RTX1200 あたりを買えば,ご希望のネットワークが組めると思いますよ

http://netvolante.jp/products/rtx1200/

◎質問者からの返答

> 送った IP と異なる IP からパケットが返ってくるのは,

> TCP として成立していなくは無くて,正しい動作です。

TCP のハンドシェイク時に、SYN フラグつきのパケットを送って、違った IP アドレスから SYN/ACK のパケットを受け取ったら、SYN/ACK の送ってきた相手に対して ACK を返して、ハンドシェイクは成立してしまうんですか? それとも、SYN で送った相手に対して ACK を送る? SYN/ACK のパケットを受け取った時に、送信元のアドレスやポート番号を確認せず、ACK を送ってハンドシェイク成立するのかぁ...。う?ん、どこかにそのことが書いてあるサイトはないかなぁ...。


2 ● aki1960
●25ポイント

元の質問コメントの、

サーバに届く IP パケットは、つなぎに来たクライアントの IP アドレスが送信元アドレスになっていて、宛先アドレスはサーバの IP アドレスになっているよね。ルータの IP アドレスは入っていないよね?。それとも、NAT 前のグローバルな IP アドレスがどこかに入っている?

の部分ですけど、NATだから、

Internet -+-- (201.11.192.10)ROUTER1(192.168.1.1) --+-- (192.168.1.10)Server

+-- (128.20.173.24)ROUTER1(192.168.1.2) --+

こんなカンジでは?(IPアドレスは適当ですけど。)

そうすると、Serverにとってはローカルからのアクセスなんで、デフォルトゲートウエイではなくて、送信元のルータに直接返しますよね。

だから、コネクションとして成立するのでは?


http://www.asi.co.jp/techinfo/unix/nat.html

◎質問者からの返答

ん? NAT って、内側に入ってくるときの、送信元の IP アドレスを変更する?

例に挙げてもらった IP アドレスに、クライアントの IP アドレスを仮に 123.123.123.123 だとして、201.11.192.10 にパケットを送ると、サーバが受け取るパケットは、

・送信元アドレス:192.168.1.1

・宛先アドレス: 192.168.1.10

になる、ってことですか? とすると、サーバ側からはクライアントの 123.123.123.123 というアドレスは見えない、ということですよね。少なくとも TCP のレベルでは(上位プロトコルに載せている場合は除く)。

通常、NAT は内に入ってくるパケットは宛先アドレスを、外へ出て行くパケットは送信元アドレスを変換して、

外側で見たときの通信:123.123.123.123 - 201.11.192.10

内側で見たときの通信:123.123.123.123 - 192.168.1.10

とするものだと思っていたのですが...。

もし、クライアント側の IP アドレスも変換していたら、Web サーバのアクセスログには、全部 192.168.1.1 になりませんか? 自宅のサーバに ssh でつないだときは、ちゃんと、グローバルなアドレスで接続のログが残るけどなぁ...。


3 ● aki1960
●25ポイント

自宅のサーバに ssh でつないだときは、ちゃんと、グローバルなアドレスで接続のログが残る

ご自宅のサーバってNATで立ててます?

スタティックIPマスカレードじゃなく?


http://www.asi.co.jp/techinfo/unix/nat.html

◎質問者からの返答

「スタティックIPマスカレード」という用語が示されたページにある「静的IPマスカレード」ということであれば、「スタティックIPマスカレード」に該当します。(個人的にはポート・フォワーディングという用語の方がしっくりくるんだけど)

で、それで違いがあるんですか?

紹介いただいているページの先頭の方にある NAT の図でも、クライアント PC からみたサーバの IP アドレス(ルータの上にある PC の横に書書かれている終点のアドレス)は変化してませんよね。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ