8420
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が同一ポートでの通信を行うので、どちらかがポート番号を変更すれば通信できるようになる。ということでいいんでしょうか？

ちょっとネットワーク関係の基礎知識がないのでトンチンカンなことを言っているかもしれないです。  
恐れ多いですがよろしくお願いします。
CC BY-SA 3.0
2015-03-26T03:06:00.067
8408
2015-03-26T11:02:00.940
8396
question
network
【ネットワーク】IPマスカレードについて
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
    
```

が実現できるかと言うことであれば、不可能です。
CC BY-SA 3.0
2015-03-26T04:09:37.450
8411
2015-03-26T06:38:00.163
2015-03-26T06:38:00.163
5793
5793
8408
answer
> 別々のLAN機器から同時に1111番ポートでの通信を行うと、変換されるグローバルIPが同じになるからどちらかしかできない

~~のがNATですね。~~
最も単純なNATはローカルネットワークのホストとグローバルアドレスを一対一で対応させるもので、ポート番号が違ってもLAN機器の数だけグローバルアドレスが必要になるようです。

NAPTの場合はこれに加えてポートも変換しますから、次のようなテーブルになることで上記の問題が回避されます。

```

    10.1.1.2:1111 -- 210.124.-.-:9990
    10.1.1.3:1111 -- 210.124.-.-:9991
    
```

ここでいう9990、9991はランダムに採番されるので重複することはありません。外に出ていく時にはIPアドレスとポートで識別できますし、返ってくる時にはポートで識別できます。

※以下、NAPTはサーバー設置が難しい、みたいなことを書いていたので修正

なお動的NAT/動的NAPTどちらでも、初期状態ではマッピングがありませんから、サーバーなど外側から通信を待ち受けるのは難しいです。この場合、マッピングを手動で設定する静的NATや静的NAPT（ポートマッピング・ポート開放とも言われます）が必要です。

* * *

> ランダムに採番される のはNAPTだけの話ということで間違いないですか？

NATではポート番号を変更しないため、そもそもルーターが採番することはありません。

※NAPTを含んで「NAT」と言うケースはあります

> リクエスト時は 10.1.1.2:80 を 210.124.-.-:80 に、 10.1.1.3:80 を 210.124.-.-:80
> に変換しなければいけないので、NATでポートを変換しないか、それとも静的NAPTで両方 210.124.-.-:80 に変換するんですか？  
>  210.124.-.-:80
> にマッピングされているローカルアドレスは複数存在してしまうから、静的に変換しても結局返信あて先が片方にしかならないのかと思ったのですがどうなんでしょうか？

ご想像の通り問題が生じますから、NAPTで同じIPアドレスかつ同じポートに対してマッピングを行うことは動的静的に関わらずできません。LAN内にApacheを2つ動かして、どちらもインターネットから80番でアクセスできるようにする、といったことは所謂NAT/NAPTでは不可能だと思います。

なお、NAT/NAPTの実装方法には様々なやり方があるようです。私も詳しくは知らないので見かけたページを貼るだけになりますが、もし深堀りしたいのであれば参考になるかもしれません。

  * [ネットワークアドレス変換 - Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%A4%89%E6%8F%9B)
  * [NAT/NAPTについて](http://tec.jpn.ph/comp/nat.html)
CC BY-SA 3.0
2015-03-26T06:21:22.740
8420
2015-03-26T11:02:00.940
2015-03-26T11:02:00.940
8000
8000
8408
answer