NAT
NATの設定

講義

PC とインターネットの爆発的な普及により 32 ビットしかない(約43億個) IP アドレス(バージョン 4) が枯渇している.解決法として

という方法が挙げられる.IPv6 に移行するほうが抜本的解決になるが, セキュリティ上内部ホストは外に出さないほうがかえって良いなどの 理由から現在は IPv4 に NAT, NAPT を組み合わせて解決している.

NAT, NAPT はルータが行う処理である. ルータはグローバル IP アドレスが 割り当てられているインターネット側と インターネットとは分離された内部ネットワーク側の両方に接続されている. 図. 5.1 は破線内が内部ネットワークであり, ルータ A が NAT を行う例である. ルータ A の外部ネットワーク側のグローバル IP アドレスが 150.7.136.61 であり, 内部ネットワーク側の IP アドレスが 192.168.1.1 だったとする. 内部ネットワークにある,IP アドレスが 192.168.1.3 のホスト B からインターネット上の IP アドレス 210.230.223.119 (グローバル IP のはずである)のホスト D へパケットを送信したい時,まず内部ネットワークを使ってルータへ 送信元が 192.168.1.3,宛先が 210.230.223.119 のパケットとして送信する. ルータはパケットの発信元のIPアドレスを自身のグローバルIPアドレスに書き換えて ホスト D に向けて発信する.ホスト D からは ルータ A から来たパケットに見える.HTTP のリクエストなどであった場合は 返答のパケットを宛先をルータ A として送る. パケットがルータに外部ネットワークを使って 到達すると,変換表に従って内部ネットワークを使い,宛先をホスト B に書き換えてホスト B に送る.

NAT

図. 5.1 NAT

上記のアドレスの書き換えにより内部から外部への通信を可能にすることが NAT の機能である.しかし,これでは読み替えが 1 対 1 であり, 同時に接続できるホスト数は増やせない.NAPT では, これにポート番号の割り当てをあわせることで複数の内部の IP アドレスの ホストを同時に外部へ接続することを可能にしている.

NAPT

図. 5.2 NAPT

図.5.2 に示すように,NAPT ではルータから外部へ出た後の パケットの発信元 IP アドレスは 単純な NAT と同じでルータ A のグローバル側のアドレスだけであるが, 内部のホストの IP アドレスごとに異なるポート番号を割り与えて 送信パケットに追加し,表に記録しておく. 戻って来た返信も A 宛になるが, パケットに書かれているポート番号を読むことで内部の発信元が どのホストだったかを知り, 本来の発信元だった内部ホストに送信先を読み替えて返す.

TCP, UDP を使用した通信の場合,

の 5 つが一つでも異なる通信は異なる通信であると扱う. NAPT ではこれを利用し,ルータのグローバル IP アドレス がこちら側のアドレスとなっているパケットを分類する.

図 5.2 のホストC,B からホストDへのパケットが HTTP リクエストであった 場合,ホスト D からの返信パケットはどちらもルータ A の グローバルIPアドレス宛になるが,ポート番号 1025 のリクエスト に対しては同じ 1025 番を記載して返信し,1026 番のリクエスト には 1026 番を記載する.ルータ A はこれを読み取って ホスト B への返信とホスト C への返信を区別し,  変換テーブルを参照して正しいホストへ送る.

これにより同時に接続できるホスト数を増やすことができる.

具体例を使って必要性を説明する.IP アドレスが足りない例として, 使用可能な IP アドレスとして 150.7.136.61 が 1 個だけ研究室に割り当てられているとする. この条件で複数台のホストを研究室で 同時にインターネットに接続するために NAPT を利用する.

ルータに使用するホストにネットワーク機器を 2 個導入する. 片方のネットワーク機器にグローバル IP アドレスの 150.7.136.61 を設定する.

次に研究室内に閉じた内部ネットワークを作成する. 内部ネットワークの全てのホストにも IP アドレスが必要であるが, 外部と接続しないという条件で使うことが許されている IP アドレスが予約されている. これをプライベートIP アドレスと言う. プライベート IP アドレスは以下の範囲のアドレスである

10.0.0.0 10.255.255.255
172.16.0.0 172.31.255.255
192.168.0.0 192.168.255.255

研究室内の計算機が高々 100 程度であればホストアドレスは 8 ビットあれば十分である. この場合,内部ネットワークをネットワークアドレスとして, 例えば 192.168.0/24 を使って構築し,ルータの内部ネットワーク側の機器を この 192.168.0/24 に属する IP アドレスに設定して接続し,ルータで NAPT を動作させる.

NAPT を行わない NAT は実際には使われることはほとんどないので 実際の計算機管理の場面で NAT という言葉は NAPT までを含んだ 意味合いで使われることが多い. Linux では多くの場合 NAPT を IP マスカレードと呼ぶ.

実習

今回の実習で最初に構成するネットワークは以下の図 5.3 に示すものである.

NAT実習

図 5.3 ネットワーク設計図(実習2)

実習0

まずハードウェアの準備を行う. 各班の代表者が後ろの棚よりハブ,USB イーサーネットデバイスなどの入った ボックスを受け取る.

1 号機 の USB ポートに USB イーサネットデバイスを接続せよ. USB イーサネットでバイスを接続する PC は 1 号機だけである. 図 5.3 ではこれを USB LAN ポートと記述している. 1 号機の USB LAN ポート以外の接続はすべて内蔵 LAN ポートを 使用する.図 5.3 に従ってケーブル,ハブを配線せよ.

接続が終ったら Ubuntu の自分のパーティションを起動し 各デバイスの IP アドレス関連の設定を行う.

実習0.1

Ubuntu 10.4 はインストール時の状態ではセキュリティ上の理由で パケットの転送を行わないように設定されているので パケットの転送を行う設定に変更する必要がある.

実習 0.1 は pcA1 のみで行う.

設定ファイルは /etc/sysctl.conf である.ファイル内容を変更するには管理者権限が必要である.

今回の実習では管理者権限で実行しなければいけないコマンドが多いので ターミナルでスーパーユーザになる方法を使う.ターミナルから以下のコマンド を入力し,ログインしたユーザのパスワードを入力せよ.

user1@pc001:~$ sudo su -

上記コマンドを実行するとプロンプトが以下のように変わる.

root@pc001:~#

スーパーユーザのユーザ名は root で,ホームディレクトリは /root である(pwd で確認せよ) プロンプトの最後が # に変わっているのは,現在スーパーユーザで 作業していることを示している.スーパーユーザ状態では あらゆるファイルを警告なく消せてしまうので 細心の注意を払って作業せよ.

重要なファイルは変更する前にファイルのバックアップを とっておくとよい.例えば作業を行ったのが 2014 年 10 月 27 日なら, sysctl.conf のコピーを sysctl.conf.20141027 という名前で作成しておくと 設定作業に失敗しても簡単に元の状態に戻す事ができる. 前回作成したシェルスクリプトなどを活用するとよい.

/etc ディレクトリに移動し(cd コマンド) sysctl.conf ファイルを gedit などのエディタで開き, 下記の行を探す.

#net.ipv4.ip_forward=1

net.ipv4.ip_forward=1 という経路制御を行う設定が,行頭の # によりコメントアウトされている.この # を削除するだけで経路制御を行う設定になるので変更する.

設定ファイルを書き換えただけでは変更は反映されない.

root@pc001:/etc# sysctl -p

上記コマンドでネットワークだけを再起動せよ.

ここまでの処理は最初に 1 度だけ行えば良い.

実習 1

1 号機には IP アドレスを 2 個設定する必要がある. 内蔵 LAN ポートに外側のネットワーク, USB LAN ポートに内側のネットワークを 接続する.デバイスの名前は通常は 内蔵 LAN ポートが eth1, USB LAN ポートが eth2 になっているが,これまでの作業で 変わっている班もある.ifconfig などで MAC アドレスを 調べることで確認せよ.MAC アドレスが d8:d3:85 で始まるものが内蔵 LAN ポート,00:24:a5 で始まるものが USB LAN ポートである.説明は内蔵 LAN を eth1, USB LAN を eth2 として行う.異なる場合は適宜読み替えよ.

図 5.3 は 1 班の例であるが,この場合は 内蔵 LAN ポートである eth1 に 172.17.2.1/16 を を設定し,USB LAN ポートにあたる eht2 に 192.168.1.1/24 設定する.サブネットマスクが異なるので注意せよ. 内蔵 LAN ポート(外部ネットワーク用)にのみ デフォルトゲートウェイと DNS サーバーを 172.17.254.254 に設定せよ. 各班の 1 号機の 内蔵 LAN ポート の IP アドレス,ホスト名を表 5.1 に示す. 各班に割り当てられた値を設定せよ. USB LAN ポートの IP アドレス, デフォルトゲートウェイとDNSサーバーは記入しない設定にせよ.

表 5.1 1 号機の内蔵LAN設定表

内蔵 LANホスト名
1 班 172.17.2.1/16pc011
2 班 172.17.2.29/16pc021
3 班 172.17.2.2/16pc031
4 班 172.17.2.30/16pc041
5 班 172.17.2.3/16pc051
6 班 172.17.2.31/16pc061
7 班 172.17.2.4/16pc071
8 班 172.17.2.32/16pc081
9 班 172.17.2.5/16pc091
10 班 172.17.2.33/16pc101
11 班 172.17.2.6/16pc111
12 班 172.17.2.34/16pc121
13 班 172.17.2.7/16pc131
14 班 172.17.2.35/16pc141

以上の設定が終了したら再起動させよ. 起動後にターミナルから以下の確認を行え.

  1. hostname コマンドでホスト名が正しく設定されていることを 確認(引数なしで hostname コマンドを実行すると現在設定されているホスト名が表示される)
  2. インターフェースの名前(eth1, eth2 など) が変わっている場合があるので ifconfig で確認. 2 つの IP アドレス,サブネットマスク が正しく設定されていることを確認.
  3. route -n ででフォルトゲートウェイが正しく設定されていることを 確認(「受信先サイト」0.0.0.0 がデフォルトゲートウェイを示す. この行の「ゲートウェイ」欄に書かれているのが設定されているデフォルトゲートウェイ)
  4. 「システム設定」→「ネットワーク」 →「有線」 で DNS サーバーが正しく設定されていることを確認

2, 3, 4 号機

2 号機の内蔵LANポート(eth1) には 192.168.1.2/24 を, 3 号機の内蔵LANポートには 192.168.1.3/24 を, 4 号機の内蔵LANポートには 192.168.1.4/24 を 設定せよ.2, 3, 4 号機のデフォルトゲートウェイは自班の 1 号機の内部ネットワーク側の IP アドレスである 192.168.1.1/24 を指定し, DNS サーバーは 172.17.254.254 を指定せよ.

設定が終了したら再起動し,1 号機と同じ方法で ホスト名,IP アドレス,サブネットマスク, デフォルトゲートウェイ,DNS サーバーの確認を行え.

実習1.1

1 号機の内部側 IP アドレスと 2, 3, 4 号機は互いに ping が通るはずである. 確認せよ.

実習1.2

1 号機からインターネット上のホスト antares.yamamotolab.jt.u-tokai.ac.jp への ping は通るが 2, 3, 4 号機から同ホストへの ping は通らないはずである.確認せよ.

実習 2

NAPTの一時的な実行と停止

ここまでの実習で,外部ネットワークと内部のネットワークは 独立して設置済みで,1 号機の 内蔵 LAN は外部ネットワークへ, USB LAN は内部ネットワークへ接続されている状態である.(図5.3 参照) この時点では内部ネットワークと外部ネットワークは通信できない.(実習1.2) 1 号機で NAPT サービスを行うことで内部ネットワークに所属する複数の ホストが外部ネットワークに同時に接続できる.

ファイアウォールサービスである iptables で NAPT を行うことができる. Linux ではこれを IP マスカレードと呼ぶことが多い.

iptables の現在の NAT, NAPT の状態を表すものを nat テーブルと 呼ぶ.現在の nat テーブルの状態を調べるコマンドは以下の通りである. 管理者権限で実行し,結果を確認せよ. この状態が何も設定されていない状態である.

iptables -t nat -nL

NAPT を作動させるためには以下の一行の iptables コマンドを 実行するだけでよい.1 号機で管理者権限で実行せよ.

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j MASQUERADE

iptables で間違ったルールを登録してしまった場合,登録したコマンドの "-A" の部分を "-D" に変えたコマンドを入力することで該当する ルールを消すことができる.(要管理者権限)

NAPT の設定ができたらもう一度 nat テーブルの確認のコマンド

iptables -t nat -nL

を実行せよ.以下のように表示されれば正しく設定されている.

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  192.168.1.0/24       0.0.0.0/0 

図5.4 IPマスカレード設定

これで NAPT が実行され,2, 3, 4 号機も外部ネットワークに接続できる はずである.ブラウザから適当なウェブサイトを表示し,確認せよ.

動作を確認したら設定した NAPT を取り消して初期状態に戻す. 以下のコマンドを管理者権限で実行せよ.

iptables -t nat -F

iptables -t nat -nL で NAPT の設定が 初期化されていることを確認せよ.

起動時のNAPTの実行

今回はNAPTの設定を再起動後も有効にする方法を説明する. iptables には

があるのでそれを利用する. 以下が iptables の一般的な手順である.

上記により,次回起動時にも同じ iptables の状態に することができる. 以下の通り各手順を順番に行う.作業はすべて管理者権限で行う.

手順 1

今回は NAPT だけを行う 以下のスクリプトを作成する. 管理者権限で /root 直下に set_iptables.sh という名前で保存し, ファイルに実行権限を与えよ.(chmod 755 set_iptables.sh)

#!/bin/sh

iptables -t nat -F
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j MASQUERADE

図 5.5 set_iptables.sh

最初のコマンドでnat テーブルを初期化し, 次のコマンドで NAPT を設定する単純なスクリプトである.

手順 2

iptables -t nat -nL を行い,現在の iptables の nat テーブルの設定を確認せよ.

作成した set_iptables.sh を実行し, その後 iptables -t nat -nL を行え.変化があったところを記録せよ.

手順 3

iptables の今の状況をファイルに書き出すコマンドは 「iptables-save > ファイル名 」である. 保存場所とファイル名はここでは /etc/iptables-rules とする. 以下のコマンドを管理者権限で入力せよ.

iptables-save -c > /etc/iptables-rules

手順 4

/etc/network/if-pre-up.d というディレクトリに 保存してあるコマンドはネットワークの起動の前に 自動的に実行される.この機能を利用し, このディレクトリに iptables の設定をファイルから 読み込むコマンドを書けばいい. 具体的には以下の手順を行え.

cd /etc/network/if-pre-up.d を行い, ls を実行してどんなファイルがあるか確認する. これから iptables-start というファイルを作るので 同じ名前のファイルが無い事を確認する.

gedit iptables-start としてファイルを開き, 以下のシェルスクリプトを書き込み,保存する.

#!/bin/sh

/sbin/iptables-restore < /etc/iptables-rules
exit 0

iptables-start に実行権限を付ける.(chmod 755 iptables-start)

これで起動時から NAT が動作するはずである.再起動し, iptables -t nat -nL を実行して確認せよ.2, 3, 4 号機からブラウザで 外部ネットワークのサイトを閲覧し,動作していることを確認せよ.

今回作成した set_iptables.sh スクリプトは NAPT を実行するだけのものでファイアウォールは全てのパケットを 通す設定である. 実用として運用する場合はファイアウォールの設計を熟慮して set_iptables.sh に各種パケットフィルタリングを記述するが, パケットフィルタリング詳細は後の回の実習で行う.

実習 3

2 号機で NAPT を動かす.

まず 1 号機の NAPT を起動時に実行する設定を止める. これには,自分が実習 2 で作成した /etc/network/if-pre-up.d/iptables-start ファイルを 管理者権限から rm コマンドで削除すればよい. 管理者権限の rm ではどんな重要なファイルも警告なしに消去される ので必要なファイルを間違って消去しないよう, 細心の注意を払って作業すること.

上記で起動時に NAPT が動作する設定はなくなるので再起動するか, 管理者権限で以下のコマンドを実行して nat テーブルを初期化することで NAPT の動作を止める.

iptables -t nat -F

実習 3 では図 5.6 のネットワーク構成になるように自分で設定項目を 考えて設定せよ.2 号機の内蔵LANのIPアドレス,ホスト名を表5.2に 示す.

NAT実習

図 5.6 ネットワーク設計図(実習3)

表 5.2 2 号機内蔵LANの設定表

内蔵 LANホスト名
1 班 172.17.2.8/16pc012
2 班 172.17.2.36/16pc022
3 班 172.17.2.9/16pc032
4 班 172.17.2.37/16pc042
5 班 172.17.2.10/16pc052
6 班 172.17.2.38/16pc062
7 班 172.17.2.11/16pc072
8 班 172.17.2.39/16pc082
9 班 172.17.2.12/16pc092
10 班 172.17.2.40/16pc102
11 班 172.17.2.13/16pc112
12 班 172.17.2.41/16pc122
13 班 172.17.2.14/16pc132
14 班 172.17.2.42/16pc142

設定後,1, 3, 4 号機からウェブの閲覧が可能であることを 確認せよ.

課題

第 4 回課題「NAT」 を提出せよ.


Updated in July 4, 2010, index.html, Yamamoto Hiroshi