思うこと
 OCNエコノミーとは
 DNSサーバの構築(WindowsNT BIND 4.9.7)
 メールサーバのインストール(WindowsNT+IMS)
 Webサーバのインストール(WindowsNT+IIS)
 セカンダリDNSサーバ(WindowsNT Bind)の構築
 ルータ(MN128-SOHO)の設定
 ちょっと一休み
 NATの導入
 NATの導入 その2
 NT+IISにPerlの導入
 namazuの導入
 namazuの導入 その2
 Windows版Apacheの導入
 8 NATの導入

グローバルIPアドレスとプライベートIPアドレス

インターネットにかぎらずTCP/IPのネットワークでは、接続している各マシンには重複しないIPアドレスが割り当てられていなければなりません。IPアドレスは、10進数では「xxx.xxx.xxx.xxx」というように「.」で区切られた4つのブロックの3桁数字で表わされます。ただし、3桁数字といっても無制限というわけではなく、最大が「255」であるため、「000.000.000.000」から「255.255.255.255」までの範囲でIPアドレスを割り当てます。

インターネットへの接続では、各ネットワークへのIPアドレスの割り当ては重複しないように一括管理されていて、OCNの場合には、NTTから支給される形になります。ここでは、「210.160.79.96」から「210.160.79.111」までの16個が支給されています。

ここでまず問題となるのが、IPアドレスの数です。支給されたIPアドレスのうち、先頭のIPアドレス(ここでは、「210.160.79.96」)は、ネットワーク全体を表わすネットワークアドレスとして、末尾のIPアドレス(ここでは、「210.160.79.111」)は、ブロードキャストアドレスとして使われます。したがって、16個支給されても、実際に利用できるのは、「210.160.79.97」から「210.160.79.110」までの14個です。

さらにルータにもIPアドレスが必要で、ここでは「210.160.79.97」をルータに割り当てています。当然、サーバにも必要です。こうして考えていくと、クライアントPCに割り当てることができるIPアドレスの数は、16個のうちせいぜい10個程度です。NTTから支給されたIPアドレスの総数が8個なら、せいぜい3つ程度しか余裕がないでしょう。このままでは、社内のクライアントPCが10台くらい(全体が8個なら3台くらい)しかインターネットにつなぐことができません。

IPアドレスの不足は、接続するネットワークが急激に増加しているインターネット全体にとっても重要な問題でもあり、インターネット全体で管理されている公的なIPアドレスとは別に、私的なIPアドレスというものが定められました。これがグローバルIPアドレスとプライベートIPアドレスです。プライベートIPアドレスは、それぞれのネットワークで自由に使っていいことになっていて、いちいち申請する必要はありません。また、プライベートIPアドレスは、その性格上、インターネット側からアクセスすることはできません。

現在、プライベートIPアドレスとして決められているものは、

「10.0.0.0」から「10.255.255.255」までの範囲クラスA
「172.16.0.0」から「172.31.255.255」までの範囲クラスB
「192.168.0.0」から「192.168.255.255」までの範囲クラスC

の3つのブロックです。クラスCの「192.168.0.0」から「192.168.255.255」の範囲でも、256×256=65536ものIPアドレスが自由に使えるわけです。

サブネットマスクとサブネット

「では、プライベートIPアドレスをそれぞれクライアントPCに割り当てればいいや」とネットワーク上のマシンにプライベートIPアドレスを適当に割り当てればいいというものではありません。実際に割り当ててみればわかりますが、そのマシンはインターネットに接続することはできません。運がよければプライベートIPアドレスのマシン同士では接続できますが、インターネット側とやりとりすることはできません。なぜかというと、インターネットとの出入り口であるルータにグローバルIPアドレスが割り当てられていて、プライベートIPアドレスと通信ができない状態になっているからです。このことには、IPアドレスとは別に「サブネット」というものを理解しなければなりません。

「サブネット」というと「サブネットマスク」というものをIPアドレスといっしょに設定するため、ごぞんじのことと思います。「255.255.255.0」というようにIPアドレスとまったく同じような形式のこの数字は、ネットワークを区分けするための仕組みだと思えばいいでしょう。サブネットに区分けするためにIPアドレスを「マスク」(mask)してしまうのが「サブネットマスク」、区分けられた小さなネットワークが「サブネット」です。

ここで重要なのが、区分けられたサブネット内のマシンは、異なったサブネット内にあるマシンとは(同じイーサネット上にあっても)接続できません。たとえば、

A IPアドレス「192.168.1.1」 サブネットマスク「255.255.255.0」
B IPアドレス「192.168.2.1」 サブネットマスク「255.255.255.0」

という設定のふたつのマシンAとBは、同じプライベートIPアドレスでも通信はできません。Aが所属するネットワークが「192.168.1.0」、Bが所属するネットワークが「192.168.2.0」というように、まったく異なったネットワークになっているからです。このふたつのマシンに加えてルータのIPアドレスが、

ルータ IPアドレス「210.160.79.97」 サブネットマスク「255.255.255.240」

だとすると、A、B、ルータの3つの機器とも所属しているネットワークがまったく異なることになり、かりに同じイーサネット上にあって、ケーブルで接続されていても、TCP/IPプロトコルを使っては、3者は通信することはできません。

IPアドレスとサブネットマスクの仕組みをもう少し説明するためには、「192.168.1.1」や「210.160.79.97」といった10進数から離れて、2進数で考える必要があります。IPアドレス「192.168.1.1」とサブネットマスク「255.255.255.0」は、2進数で表現すると次のようになります。

「192.168.1.1」
「11000000.10101000.00000001.00000001」

「255.255.255.0」
「11111111.11111111.11111111.00000000」

こうして2進数に表現しなおしてみるとわかりやすくなるでしょう。とくにサブネットマスク「255.255.255.0」は、先頭から「1」が続き、最後のブロックだけ「0」になっていることがわかります。専門的に言うと、このうち「1」が続いている部分が「ネットワーク番号」、「0」の部分を個々の「ホスト番号」と呼んでいます。「ネットワーク番号」がネットワーク全体の番号、ひとつひとつのマシンに割り当てられた番号が「ホスト番号」です。

グローバルIPアドレスで同じことをしてみます。IPアドレス「210.160.79.97」サブネットマスク「255.255.255.240」は、

「210.160.79.97」
「11010010.10100000.1001111.10100001」

「255.255.255.240」
「11111111.11111111.11111111.11110000」

となります。サブネットマスクで最後のブロックの4桁までマスクがかけられています。「210.160.79.97」の前後のIPアドレスを考えてみると、

「210.160.79.94」「11010010.10100000.01001111.01011110
「210.160.79.95」「11010010.10100000.01001111.01011111
「210.160.79.96」「11010010.10100000.01001111.01100000
「210.160.79.97」「11010010.10100000.01001111.01100001
「210.160.79.98」「11010010.10100000.01001111.01100010
「210.160.79.99」「11010010.10100000.01001111.01100011
「210.160.79.100」「11010010.10100000.01001111.01100100
「210.160.79.101」「11010010.10100000.01001111.01100101
「210.160.79.102」「11010010.10100000.01001111.01100110
「210.160.79.103」「11010010.10100000.01001111.01100111
「210.160.79.104」「11010010.10100000.01001111.01101000
「210.160.79.105」「11010010.10100000.01001111.01101001
「210.160.79.106」「11010010.10100000.01001111.01101010
「210.160.79.107」「11010010.10100000.01001111.01101011
「210.160.79.108」「11010010.10100000.01001111.01101100
「210.160.79.109」「11010010.10100000.01001111.01101101
「210.160.79.110」「11010010.10100000.01001111.01101110
「210.160.79.111」「11010010.10100000.01001111.01101111
「210.160.79.112」「11010010.10100000.01001111.01110000
「210.160.79.113」「11010010.10100000.01001111.01110001

というようになります。一目してわかるように、「210.160.79.96」というネットワークは、4ブロック目の最後の4桁が「0000」から「1111」までの16個です。ひとつ手前の「210.160.79.95」は、ネットワーク番号自体が「11010010.10100000.01001111.0101」と「11010010.10100000.01001111.0110」とはあきらかに異なっています。また、ひとつあとの「210.160.79.112」もネットワーク番号が「11010010.10100000.01001111.0111」になっていて、「11010010.10100000.01001111.0110」とは異なっています。

このようにサブネットマスクの組み合わせによって、IPアドレスはサブネットに区分けされています。そして、サブネットに区分けされると、たとえ同じイーサネット上にあっても通信することはできません。

サブネットマスクには、「255.255.255.0」(クラスC)や「255.255.255.240」(クラスC未満で16個)以外にも、「255.255.255.248」(クラスC未満で8個)などもあります。

「255.255.255.248」のクラスC未満8個で先の「210.160.79.96」のネットワークの前後を見てみると、サブネットマスク「255.255.255.248」が「11111111.1111111.1111111.11111000」というように最後の3桁だけが「1」でマスクされていないため、

「210.160.79.94」「11010010.10100000.01001111.01011110
「210.160.79.95」「11010010.10100000.01001111.01011111
「210.160.79.96」「11010010.10100000.01001111.01100000
「210.160.79.97」「11010010.10100000.01001111.01100001
「210.160.79.98」「11010010.10100000.01001111.01100010
「210.160.79.99」「11010010.10100000.01001111.01100011
「210.160.79.100」「11010010.10100000.01001111.01100100
「210.160.79.101」「11010010.10100000.01001111.01100101
「210.160.79.102」「11010010.10100000.01001111.01100110
「210.160.79.103」「11010010.10100000.01001111.01100111
「210.160.79.104」「11010010.10100000.01001111.01101000
「210.160.79.105」「11010010.10100000.01001111.01101001

というように、「210.160.79.96」から「210.160.79.103」までの8個のIPアドレスがひとつのネットワークとしてサブネット化されます。同様にして、4個のネットワーク「255.255.255.252」、2個のネットワーク「255.255.255.254」、1個のネットワーク「255.255.255.255」も理論的にはサブネット化できます。(ただし、ネットワークアドレスとブロードキャストアドレスで最低2個が必要なため、IPアドレス2個のネットワークというのは存在しない。また、「255.255.255.255」はそのIPアドレス自体を意味している)

16個より少なくサブネット化していくのではなく、「32個×8=256個」「64個×4=256個」「128個×2=256個」というように、IPアドレス256個のクラスCのネットワークを、32個8つ、64個4つ、128個2つに分割するというのは実用的です。その場合には、「255.255.255.224」(11111111.11111111.1111111.1110000000)、「255.255.255.192」(1111111.1111111.1111111.11000000)、「255.255.255.128」(11111111.11111111.11111111.10000000)とします。

IPアドレスの個数サブネットマスク(10進数)サブネットマスク(2進数)
1個255.255.255.25511111111.11111111.11111111.11111111
2個255.255.255.25411111111.11111111.11111111.11111110
4個255.255.255.25211111111.11111111.11111111.11111100
8個255.255.255.24811111111.11111111.11111111.11111000
16個255.255.255.24011111111.11111111.11111111.11110000
32個255.255.255.22411111111.11111111.11111111.11100000
64個255.255.255.19211111111.11111111.11111111.11000000
128個255.255.255.12811111111.11111111.11111111.10000000
256個255.255.255.011111111.11111111.11111111.00000000

サブネットマスクは「255.255.255.240」といった表現以外にも、「/28」といった「ネットマスク長」や「0xfffffff0」という16進数のビットマスクでも表現されます。

IPアドレスの個数サブネットマスク(10進数)ネットマスク長16進数
1個255.255.255.255/320xffffffff
2個255.255.255.254/31 
4個255.255.255.252/30 
8個255.255.255.248/29 
16個255.255.255.240/280xfffffff0
32個255.255.255.224/27 
64個255.255.255.192/26 
128個255.255.255.128/25 
256個255.255.255.0/240xffffff00

(この部分追加 実際には、IPアドレスとサブネットマスクとを掛け算(AND演算)しています。掛け算すると「ネットワーク番号」がもとめられます。)

サブネットをつなぐルータ

サブネット化されたネットワークは、ではどういう仕組みで通信を行なっているのでしょうか。その両者をつなぐ役目を果たしているのが、「ルータ」です。各クライアントに、自身のIPアドレスとサブネットマスクのほか、「デフォルトゲートウェイ」(あるいはルータ)としてルータのIPアドレスを設定したと思いますが、これは、「自分と同じネットワークに所属していないIPアドレスへのパケットは、そのゲートウェイ(ルータ)にゆだねる」というものです。

そのため、自ネットワーク外へのパケットはそのゲートウェイ(ルータ)に処理がまかされます。処理をゆだねられたルータは、パケットに書かれた宛て先のIPアドレスから判断して、インターネット側に送り出します(そう設定されていればの話しで、実際にそう設定されていることが多いでしょう)。上位のルータ(OCNの場合、NTT側のルータ)は、届いたパケットのIPアドレスを判断してふたたび処理します。こうしてパケットはどんどんと転送されていって、やがて目的のネットワークに接続しているルータにたどりつきます。そこのルータは、「自分のネットワークへのパケットだ」と知るとそのパケットを自分のネットワーク内へ届けます。こうして目的のホストにパケットが届きます。

さてNATとは

以上で、サブネットとそのサブネットをつないでいるルータ(ゲートウェイ)の簡単な仕組みが理解できました。プライベートIPアドレスを社内LAN側に導入するには、少なくても以上のようなことがらをぼんやりとでも理解していないとうまくいかないため、説明しておきます。

さて、NATですが、NATはNetwork Address Transportの略で、簡単に言ってしまえば、IPアドレスを変換する仕組みです。AというIPアドレスからのパケットをBというIPアドレスからのパケットであるというように書き換えたり、その逆にAというIPアドレス宛てのパケットをBというIPアドレス宛てのパケットであるように書き換えることで、あたかもBというIPアドレスを持っているホストがAというIPアドレスを持っているかのように見せかける技術です。

 IPアドレス(A)宛てのパケット       IPアドレス(B)宛てのパケット
      ーーー→        NAT     ーーー→

 IPアドレス(A)からのパケット       IPアドレス(B)からのパケット
      ←ーーー        NAT     ←ーーー

この技術を使って、グローバルIPアドレスとプライベートIPアドレスとの間で変換すれば、実態としてはプライベートIPアドレスを持っているマシンがあたかもグローバルIPアドレスを持っているかのように、インターネット側と通信できます。

NATに似た仕組みに「IPマスカレード」があります。Linuxで最初に実装された技術で、NATがあくまでも「1対1」でIPアドレスを変換するのに対して、IPマスカレードでは「1対n」でIPアドレスを変換することができます。わかりやすく言うと、文字どおりのNATでは、クライアント用のグローバルIPアドレスが1個しかなければ、プライベートIPアドレスも1個しか変換できません。これに対してIPマスカレードでは、複数のプライベートIPアドレスからのパケットをグローバルIPアドレス1個に変換して送りだし、返答パケットもそれぞれのプライベートIPアドレス用に変換されて、それぞれに届けられます。

つまり、「NAT」「IPマスカレード」ともIPアドレスを変換するという点では同じですが、NATの場合には1対1で変換するため、IPアドレスの総数としては変わりなく、IPマスカレードの場合には1対nで変換するため、IPアドレスの総数に制約がなくなります。また、NATの場合には、1対1でIPアドレスが変換されるだけで、プライベートIPアドレスをマシン側に導入してもセキュリティ面での向上があるわけではありませんが、IPマスカレードでは外部(インターネット側)からは内部(n側)のマシンを特定することができなくなり、セキュリティ面で向上します。

現在市販されているルータでは、「NAT機能」を持つのは当たり前ですが、この「IPマスカレード機能」も持っているものがほとんどです。ただ、両者はあまり区別されず漠然と「NAT機能」と呼ばれているようです。

NATとセキュリティ

セキュリティの観点からNAT機能を考えてみます。

ここではまだ、サーバもクライアントも含め、すべてのマシン(とルータ)にグローバルIPアドレスが導入されています。サーバはともかく、日常的に作業するクライアントは、丸裸のままインターネットにさらされているも同然で、かろうじてルータのパケットフィルタリングで守っているにすぎません。この状態はきわめて危険です。サーバのWindowsNTも、クライアントとしてたぶん多いはずのWindows95/98、Macintoshも、OSとして、たとえばUNIXのtelnetのようにリモートからログインして操作するような仕組みはありませんが、危険であることに変わりはありません。

そんなネットワークに、セキュリティ向上を考えるといくつかの方法が考えられます。

  1. アプリケーション型ファイアウォールを導入する
  2. パケットフィルタリング型ファイアウォール(LinuxのIPマスカレードなど)を導入する
  3. ルータのNAT機能(IPマスカレード含む)を導入する

大きく(便宜的に)分けると上の3つでしょう。

「1」と「2」は、いわゆる「ファイアウォール」の導入です。ファイアウォールと呼ばれる仕組みは、製品によって実現方法が異なっているため、ケースバイケースになってしまいますが、一般的に「アプリケーション型ファイアウォール」「サーキットレベル型ファイアウォール」「パケットフィルタリング型ファイアウォール」の3つに分類されています。

「アプリケーション型ファイアウォール」は、その名のとおりアプリケーションとして動作しているファイアウォールが、通過するパケットを審査するようになっています。パケットフィルタリング型ファイアウォールは、パケットの中身までは審査しませんが、パケットの発信元や送信先、ポートなどを審査して通過させるか否かを判断します。LinuxのIPマスカレードもこのパケットフィルタリング型ファイアウォールに含まれます。

(厳密には、IPマスカレードと呼ばれる仕組みでは、IPアドレスの変換をする機能と、ファイアウォール機能(IP firewalling)は、別々の機能になっているようです。)

「1」にしろ「2」にしろ、ネットワークの構成としては、社内ネットワークとインターネットとの間に、もうひとつのネットワーク(バリアセグメントといいます)を意図的に作ることになります。このネットワークはグローバルIPアドレスを持つネットワークです。このうちの1台に2枚のネットワークカードを装着し、そのうちのひとつにグローバルIPアドレスを持たせてグローバルIPアドレスのネットワーク側に接続し、もうひとつのネットワークカードにはプライベートIPアドレスを持たせて社内LAN側に接続します。こうすることで、社内LAN側からのパケットはすべてこのマシンを経由してグローバルネットワークに届き、最終的にはルータを出入りして、インターネットとやりとりすることになります。インターネット側からは、橋渡しをしているマシンまでしか見えず、社内LAN側のマシンの存在を知ることはできません。

(バリアセグメントに似た言葉に「DMZ=非武装地帯」というのがあります。これは2枚のネットワークカードに加え、さらにもう1枚のネットワークカードを装着したファイアウォール専用のマシンを構築し、インターネット側とは別にふたつのセグメントの接着点として働きます。そのうちのひとつのセグメントに各インターネットサーバを置きますが、ここをDMZと呼んでいます。残るもうひとつのセグメントが社内LAN側のセグメントです。)

2枚のネットワークカードが装着されたマシンは「ゲートウェイ」と呼ばれますが、ある種の「ルータ」として、グローバルIPアドレス空間とプライベートIPアドレス空間の橋渡しをすることになります。ただし、なんでもかんでもパケットを通すわけではなく、通過するパケットを審査した上で通過させたり、させなかったりするわけです。

(ただし、文字どおりの「ルータ」にはIPアドレスを変換する機能はありません。)

ルータのNAT機能では、文字どおり「NAT機能」として、1対1でグローバルIPアドレスとプライベートIPアドレスを対応させている状態では、たんに内部ネットワークがプライベートIPアドレスを持っているというだけで、インターネット側につつぬけ状態であることに変わりはありません。防いでいるのは、ルータのフィルタリング機能だけです。NATでなく、IPマスカレードを導入しているのなら、機能的にはLinuxのIPマスカレードがインストールされたマシンと同じ機能を持っているわけですが、インターネット側と社内LAN側との間に、もうひとつのネットワークが存在しません。

通常、Webサーバなどインターネット側に公開するマシンは、「1」「2」のケースともインターネットとの間に立つグローバルIPアドレス空間に置いておくのですが、ルータの「NAT機能」や「IPマスカレード機能」を使った場合、その空間がないため、サーバをクライアントと同じ社内LAN側に置いて、そのサーバへのパケットだけ通過させるようにします。逆に言えば、ファイアウォールに穴を開けてサーバへのパケットを通しているわけです。

こうして考えてみると、「1」→「2」→「3」の順番に、セキュリティは低くなっていきます。と同時に、「1」→「2」→「3」の順番でコストがかからなくなっていきます。

「3」の場合には、新しく追加する機器はなにもありません。設定を変更するだけです。「1」「2」の場合には、ネットワークを新しくもうける(セグメントを分ける)ためにネットワーク機器が必要になる場合が多いでしょう。とくに「2」は、LinuxのIPマスカレードのような仕組みがWindowsNT上にないため、そもそも無理な場合も多いでしょう。「1」のアプリケーション型ゲートウェイを導入する場合には、市販のソフトウェアを購入しなければならないケースが多いでしょう。「WinGate」のような比較的低価格なソフトや「Windows版delgate」のようなフリーのソフトもあります(プロキシと呼ばれています)が、高度な機能を持ったファイアウォールソフトは概して高価で、またかなり高機能なハードウェアを要求するものが多いため、かなりな投資を覚悟しなければなりません。

ここでは、すぐに実践できて、コストがかからないルータのNAT機能・IPマスカレード機能を使った設定の仕方をまず解説します。

(C) 1998 HyperDyne Inc.