質問: IPマスカレードについて知りたいのですが、恥ずかしながらネットワークの知識に乏しいもので、教えていただけませんでしょうか。 NATについてはある程度理解しています。 要するに、ルータでローカルアドレスをグローバルアドレスに変換し、マッピングデータとしてNATテーブルに保存し、パケット送信。返信をルータでローカルアドレスに変換してLANに返すわけですよね?間違っていたら訂正してください。 そしてNAPTは、たとえば PC2(10.1.1.2)とPC3(10.1.1.3)があり、 PC2から1111番ポートで、PC3から1112番ポートでパケット送信した際、 ルータでの変換は 10.1.1.2:1111 を 210.124.-.-:9990, 10.1.1.3:1112 を 210.124.-.-:9991 に変換しNATテーブルに登録、帰りもポートを確認して戻っていく、ということでいいんでしょうか? でも、この解釈で疑問が湧きました。 ローカルアドレスも結局NATテーブルに登録されているのであれば、ポートを見る必要はないんではないのか?というのと、 別々のLAN機器(この場合PC2とPC3)から同時に1111番ポートでの通信を行うと、変換されるグローバルIPが同じになるからどちらかしかできない。ということはたとえばPS3とPS4が同一ポートでの通信を行うので、どちらかがポート番号を変更すれば通信できるようになる。ということでいいんでしょうか? ちょっとネットワーク関係の基礎知識がないのでトンチンカンなことを言っているかもしれないです。 恐れ多いですがよろしくお願いします。
回答: TCPにせよUDPにせよ、ほとんどのプロトコルではクライアント側(送信側)のポートは空きポートが適当に使われます。なので、たまたま重複することはあり得ますし、端末台数が増えるほど可能性は増えます。 また、他のクライアントがどのポートを使って通信しているかを知る方法はありません。したがってクライアント側で重複を回避することも不可能です。 (OSの設定によって送信ポート番号に使われる範囲を設定できる場合もありますので、それによって重複を回避することは理屈の上では可能ですが、現実的の環境では無意味な話です) したがって、NAPTではクライアント側のポート番号も変換する必要があります。 想定されている状況を読み違えてました。NATテーブルに送信元ポート番号がなくても区別がつくではないか、すなわち ``` 変換前 変換後 192.168.0.1 198.51.100.1:9990 192.168.0.2 198.51.100.1:9991 ``` でも、変換後のポート番号(帰り通信の宛先ポート番号)で変換前アドレスは識別できるであろう、ということですね。 こういうNATテーブルを想定すれば ``` 変換前 変換後 宛先 192.168.0.1:50000 198.51.100.1:9990 203.0.113.1:80 192.168.0.1:50001 198.51.100.1:9991 203.0.113.1:80 192.168.0.1:50002 198.51.100.1:9992 203.0.113.1:80 192.168.0.2:50000 198.51.100.1:9993 203.0.113.1:80 ``` 1行目と2行目と3行目は変換前のソースポート番号がないと区別がつかないのは自明だと思います。 「実質1回線内で同一ポートでの通信はIPマスカレードしたって無駄」というのがどういう意味なのかよくわからないのですが、グローバルIPアドレスが1つしかない環境でサーバ側(通信を受け付ける側の)がNATの内側にいる場合に俗に言う「ポート開放」の設定をしてなおかつクライアント側が特定の宛先ポート番号を想定している場合、つまり ``` 「ポート開放」の設定 1111 -> 192.168.0.1:1111 1111 -> 192.168.0.2:1112 ``` が実現できるかと言うことであれば、不可能です。