🍑あわもり教室🫧 クラウドの「手前」を、ちゃんとやる。 はじめる
SET 0140分

アドレスを置き換え、通信を許可する

家庭や会社のネットワークからインターネットへ接続する場面で、アドレスの置き換えと通信許可の役割を分けます。

このレッスンのメニュー

家庭のPCには、家庭内で使うIPアドレスが付いています。 インターネットへ接続するときは、家庭用ルーターがそのアドレスを、インターネット側で使うアドレスへ置き換えます。

ルーターは、届いた通信を通すか拒否するかも判断できます。 アドレスを置き換える処理と、通信を許可する処理は別々に設定します。

家庭内とインターネットで使うアドレス

家庭や会社のLANでは、インターネットへ直接流さないプライベートIPアドレスを使えます。

インターネット上で通信相手を識別できるIPアドレスは、グローバルIPアドレスと呼ばれます。 プライベートIPアドレスを送信元にしたパケットは、そのままではインターネットを越えて応答を受け取れません。

LANとインターネットの境界にあるルーターは、内側と外側のアドレスを対応付けます。 そのときに使うのがNATやNAPTです。

NATはIPアドレスを置き換える

NAT(Network Address Translation)は、パケットに書かれた送信元または宛先のIPアドレスを置き換える機能です。

内側の端末がインターネットへ送るときは、送信元のプライベートIPアドレスをルーターのグローバルIPアドレスへ置き換えます。 応答が戻ると、ルーターは宛先を元のプライベートIPアドレスへ戻してから端末へ渡します。

次の図では、一台の端末と一つのグローバルIPアドレスを対応付けています。

端末のプライベートIPアドレスをルーターがグローバルIPアドレスへ置き換え、応答時に元へ戻す流れ
NATはパケットのIPアドレスを書き換えます。データの内容や通信を許可するかどうかは、この図では変えていません。

この例では、10.0.0.8203.0.113.5 が一対一で対応します。 外部から 203.0.113.5 宛てに届いた応答を、ルーターは 10.0.0.8 宛てへ書き換えます。

送信元を書き換える処理は送信元NAT、宛先を書き換える処理は宛先NATと呼ばれます。 サーバーを別のアドレスで公開する場合には、宛先NATを使うことがあります。

NAPTはポート番号も使って通信を見分ける

一つのグローバルIPアドレスを複数の端末で共有するには、IPアドレスだけでは戻り先を区別できません。 そこで、IPアドレスとポート番号の組み合わせを使います。

NAPT(Network Address Port Translation)は、IPアドレスに加えてTCPまたはUDPのポート番号も置き換える機能です。 家庭用ルーターの設定画面で単に「NAT」と書かれていても、実際にはNAPTを使っていることがよくあります。

二台の端末の通信を、ルーターが一つのグローバルIPアドレスと異なる二つのポート番号へ対応付ける流れ
外側のポート番号を分けることで、同じグローバルIPアドレスを使う二台の端末を区別できます。

図の変換表には、「内側のIPアドレスとポート番号」と「外側で使うIPアドレスとポート番号」の対応が記録されています。 応答が 203.0.113.5:40001 へ戻れば端末Aへ、:40002 へ戻れば端末Bへ渡せます。

この対応は通信を始めたときに作られ、一定時間通信がなければ削除されます。 NAPTは、限られたグローバルIPアドレスを複数の端末で共有するための仕組みです。

ACLは通信を通すか決める

ACL(Access Control List)は、条件に一致する通信を許可するか、拒否するかを並べた規則の一覧です。 NATとNAPTがアドレスやポート番号を置き換えるのに対し、ACLは通信を通すかどうかを決めます。

ACLでは、主に次の情報を条件に使います。

  • 通信が入ってくる方向か、出ていく方向か
  • 送信元と宛先のIPアドレス
  • TCP、UDP、pingなどで使うICMPといったプロトコル
  • TCPまたはUDPの送信元と宛先のポート番号
  • 許可するか拒否するか

多くのACLは規則を上から順に調べ、最初に一致した動作を使います。 製品によって評価方法は異なるため、設定するときはその製品の仕様も確認します。

優先方向プロトコル送信元宛先動作理由
10入ってくるTCP管理用ネットワークWebサーバーの22許可管理用のSSH
20入ってくるTCPすべてWebサーバーの443許可公開するHTTPS
30出ていくUDP、TCPWebサーバーDNSサーバーの53許可名前解決
1000両方向すべてすべてすべて拒否ほかの通信を拒否
SSH、HTTPS、その他の通信をACLの規則へ上から順に照合し、最初に一致した許可または拒否を使う流れ
通信ごとに上から条件を調べます。最初に一致した規則で判定が終わります。

最後に「ほかはすべて拒否」を置き、必要な通信だけ許可する考え方をデフォルト拒否と呼びます。 許可する理由を説明できる通信だけを通すため、不要な入口を減らせます。

入ってくる通信と出ていく通信

サーバーへ届く通信は受信方向(ingress)、サーバーから外へ向かう通信は送信方向(egress)です。 Webサイトを公開するには受信方向のHTTPSが必要です。 WebサーバーがDNSへ問い合わせるには、送信方向のDNS通信も必要です。

片方だけを見ると、接続の開始は通っても応答が戻らないことがあります。

ステートフルとステートレス

ステートフルな制御は、どちら側から始まった通信かを記録します。 外向きに始めたTCP接続を許可すると、その接続に対する応答を自動で戻り通信として扱えます。

ステートレスな制御は、一つひとつのパケットを独立して判定します。 この場合は、応答が戻る方向にも対応する規則が必要です。

NAT、NAPT、ACLの役割を比べる

機能何をするか何を決めないか
NATIPアドレスを置き換える通信を許可するか
NAPTIPアドレスとポート番号を置き換える通信を許可するか
ACL条件に合わせて通信を許可または拒否するIPアドレスの変換方法

NATやNAPTを使うと外側から内側へ直接接続しにくくなる場合がありますが、その効果だけを通信の許可設定として扱うことはできません。 外部へ公開する通信と内部だけで使う通信は、ACLやファイアウォールで分けます。

変換と許可を分けて考える

端末 192.168.1.20 が、家庭用ルーターを通してWebサイトへ接続する場面を考えます。

  1. NAPTが置き換える送信元IPアドレスとポート番号を挙げてください。
  2. Webサイトから応答が戻ったとき、ルーターは何を見て端末を選ぶでしょうか。
  3. ルーターの管理画面をインターネットへ公開しない場合、ACLは何を拒否すればよいでしょうか。

NAPTの変換表とACLの規則は、別々に書いてみましょう。

次は、Linuxで状態を確かめる

ネットワークの三ページでは、データの通り道、宛先の選び方、アドレス変換、通信の許可を外側から見ました。 次のLinuxのきほんでは、サーバーのOSへ入り、ファイル、プロセス、通信の状態を自分で確認する方法を学びます。

このレッスンは完了

このページで扱った流れを確認したら、次の内容へ進みます。