マスカレードとNATの設定
IPアドレスの枯渇
インターネットに接続するためには、インターネットに接続するすべての端末機にIPアドレスを割り振る必要があります。しかし、ここで1つ大問題が起こりました。それが、IPアドレスの枯渇です。
インターネットは、もともと軍事用に開発されたプロトコル(TCP/IP)を元に作られました。このプロトコルの考えられた当時は、今のような世界中の一般家庭からアクセスされる事は想定されてませんでした。IPアドレスは32ビットの空間で割り当てられ、その数は40億以上あります。しかし、アドレス帯を分割するためにネットワークアドレス・ブロードキャストアドレスが必要であったり、ローカルアドレスとして割り当てられている範囲もあり、実際にはもう少し少なくなります。
また、たとえ40億フルに使えたとしても、世界中のコンピューターを接続するのであれば、40億でも足りません。今現在、日本やアメリカでは猫も杓子もパソコンを持っているようになりましたが、世界ではまだまだコンピューターを使っていない地域が多くあります。これらの国々にインフラが整備され、インターネットが普及する事になれば、IPアドレスはあっという間に尽きてしまうでしょう。
そのために、今ではIPV6という新しいIPアドレスが考案され、これが普及すればIPアドレスはほぼ無尽蔵に使えることになります。しかしながら、IPV6の普及はまだまだ5~6年先になるとのことです。(注:この原文を書いてから既に5年経ちましたが、まだ普及してないようです)それでは、それまでの間、IPアドレスが尽きるのを指をくわえて待つだけなのでしょうか?
そこで、現状のIPV4を使い、なるべくIPアドレスを節約する方法が考えられました。
1)インターネットにつなぐ時だけグローバルアドレスを割り振る
アナログ回線を使う場合にしても、光やADSLを使いPPPoE接続する場合にしても、固定IP契約でなければプロバイダから接続毎にIPアドレスをもらう事になります。なので、インターネットに接続していない間は、IPは割り当てられない事になります。
といっても、現在は定額料金制で契約しているため、ルーターで常時接続したままにしておく人がほとんどでしょうから、あまり節約になっているとは言えません。
2)マスカレードを使う
マスカレードとは「~のふりをする」という意味です。

たとえば、このような場合に、端末機A~Dにそれぞれグローバルアドレスを割り振ると、IPアドレスが5個必要になってしまいます。5個ぐらいならまだいいのですが、もし端末が200台あると、IPアドレスが201個必要になってしまいます。
そこで考えられたのがマスカレードです。
例えば、ある課の課長が、Aというソフト買ってユーザー登録をします。しかし、部下達がそのソフトを使いたいと言い出したので、(ライセンス違反になりますが)皆に使わせる事にしました。
ある日部下の1人が、課長の普段使わない機能に不具合がある事を発見しました。それはあきらかにバグのようです。しかし、部下はユーザー登録をしてないので、ソフトメーカーに問い合わせる事ができません。なので、課長が自分のユーザー登録番号を使ってソフトメーカーに問い合わせ、対処法を教わって、部下に伝達しました。
この例では1つのユーザー登録番号を使って実際には部下達から出てくる質問に対して課長が代表して問い合わせたわけですが、マスカレードは、この話での課長の役割をルーターにさせる事です。ここでユーザー登録番号が、グローバルIPに当たります。
ルーター機の1つのNICにグローバルIPが、また、もう1つのNICに192.168.0.1というローカルIPが与えられています。
端末機A~Dには、ローカルIPのみが与えられています。この時に、端末機Aがインターネット上にあるサイト(例えばGoogle)が見たい、と言った場合、ルーター機はアクセス元アドレスを192.168.0.xxというローカルアドレスから、自分のグローバルIPに変換してGoogleにGETやPOST要求パケットを送ります。Googleのサーバーはルーター宛にページの情報を返すので、送信先IPを192.168.0.xxに変換して端末機Aに返します。
というように、ルーター機がローカル側からのアドレスを自分のIPアドレスに変換したり、グローバル側からの返答をローカル側のアドレスに変換したりするのがマスカレードです。
インターネットは、もともと軍事用に開発されたプロトコル(TCP/IP)を元に作られました。このプロトコルの考えられた当時は、今のような世界中の一般家庭からアクセスされる事は想定されてませんでした。IPアドレスは32ビットの空間で割り当てられ、その数は40億以上あります。しかし、アドレス帯を分割するためにネットワークアドレス・ブロードキャストアドレスが必要であったり、ローカルアドレスとして割り当てられている範囲もあり、実際にはもう少し少なくなります。
また、たとえ40億フルに使えたとしても、世界中のコンピューターを接続するのであれば、40億でも足りません。今現在、日本やアメリカでは猫も杓子もパソコンを持っているようになりましたが、世界ではまだまだコンピューターを使っていない地域が多くあります。これらの国々にインフラが整備され、インターネットが普及する事になれば、IPアドレスはあっという間に尽きてしまうでしょう。
そのために、今ではIPV6という新しいIPアドレスが考案され、これが普及すればIPアドレスはほぼ無尽蔵に使えることになります。しかしながら、IPV6の普及はまだまだ5~6年先になるとのことです。(注:この原文を書いてから既に5年経ちましたが、まだ普及してないようです)それでは、それまでの間、IPアドレスが尽きるのを指をくわえて待つだけなのでしょうか?
そこで、現状のIPV4を使い、なるべくIPアドレスを節約する方法が考えられました。
1)インターネットにつなぐ時だけグローバルアドレスを割り振る
アナログ回線を使う場合にしても、光やADSLを使いPPPoE接続する場合にしても、固定IP契約でなければプロバイダから接続毎にIPアドレスをもらう事になります。なので、インターネットに接続していない間は、IPは割り当てられない事になります。
といっても、現在は定額料金制で契約しているため、ルーターで常時接続したままにしておく人がほとんどでしょうから、あまり節約になっているとは言えません。
2)マスカレードを使う
マスカレードとは「~のふりをする」という意味です。

たとえば、このような場合に、端末機A~Dにそれぞれグローバルアドレスを割り振ると、IPアドレスが5個必要になってしまいます。5個ぐらいならまだいいのですが、もし端末が200台あると、IPアドレスが201個必要になってしまいます。
そこで考えられたのがマスカレードです。
例えば、ある課の課長が、Aというソフト買ってユーザー登録をします。しかし、部下達がそのソフトを使いたいと言い出したので、(ライセンス違反になりますが)皆に使わせる事にしました。
ある日部下の1人が、課長の普段使わない機能に不具合がある事を発見しました。それはあきらかにバグのようです。しかし、部下はユーザー登録をしてないので、ソフトメーカーに問い合わせる事ができません。なので、課長が自分のユーザー登録番号を使ってソフトメーカーに問い合わせ、対処法を教わって、部下に伝達しました。
この例では1つのユーザー登録番号を使って実際には部下達から出てくる質問に対して課長が代表して問い合わせたわけですが、マスカレードは、この話での課長の役割をルーターにさせる事です。ここでユーザー登録番号が、グローバルIPに当たります。
ルーター機の1つのNICにグローバルIPが、また、もう1つのNICに192.168.0.1というローカルIPが与えられています。
端末機A~Dには、ローカルIPのみが与えられています。この時に、端末機Aがインターネット上にあるサイト(例えばGoogle)が見たい、と言った場合、ルーター機はアクセス元アドレスを192.168.0.xxというローカルアドレスから、自分のグローバルIPに変換してGoogleにGETやPOST要求パケットを送ります。Googleのサーバーはルーター宛にページの情報を返すので、送信先IPを192.168.0.xxに変換して端末機Aに返します。
というように、ルーター機がローカル側からのアドレスを自分のIPアドレスに変換したり、グローバル側からの返答をローカル側のアドレスに変換したりするのがマスカレードです。
IPCHAINSではなくIPTABLESを使う
マスカレードを使うために、ルーター機にIPTABLESという機能を導入します。では、ここでソースを入手してコンパイルして……から説明すると大変なので、ここではIPTABLESが標準で入っているディストリビューションを使うことにします。インストール時にファイアウォールを有効にしておいてください。
RedHatLinux7.xxの頃はiptables -Lとすると何やらエラーが出てしまいます。それは、IPCHAINSという別のファイアウォールソフトが起動しているためです。しかし、IPCHAINSは設定が難しく、今後サポートされないようですので、IPCHAINSはまず停止させます。
/etc/rc.d/init.d/ipchains stop
サーバー起動時に自動起動しないようにします。
chkconfig ipchains off
続いてIPTABLESを起動させます。
/etc/rc.d/init.d/iptables start
サーバー起動時に自動起動させます。
chkconfig iptables on
RedHatLinux7.xxの頃はiptables -Lとすると何やらエラーが出てしまいます。それは、IPCHAINSという別のファイアウォールソフトが起動しているためです。しかし、IPCHAINSは設定が難しく、今後サポートされないようですので、IPCHAINSはまず停止させます。
/etc/rc.d/init.d/ipchains stop
サーバー起動時に自動起動しないようにします。
chkconfig ipchains off
続いてIPTABLESを起動させます。
/etc/rc.d/init.d/iptables start
サーバー起動時に自動起動させます。
chkconfig iptables on
マスカレードの設定
iptablesにマスカレードを設定します。
iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE |
各パラメーターは、
-t nat | NATテーブル |
-A | ルールを追加 |
POSTROUTING | 送信元のアドレスを変換する |
-o ppp+ | ppp接続へ出力する |
-j MASQUERADE | マスカレードを使う |
この他に、先述の通り「フォワーディングの設定」が必要です。これによって、LAN内からのパケットは、送信元をルーターの持つグローバルIPに変換してインターネットに送信します。
/etc/sysctl.conf
net.ipv4.ip_forward = 1 |
NATの設定
LAN内に接続されたコンピューターが、すべて「端末」ならこれで良いのでしょう。しかし、サーバー機があった場合どうでしょう。とくに、apacheが導入され、その会社のホームページをそこに置く場合、LANの内部からしか見られないのでは意味がありません。
そこで、LAN内のコンピューターのうちのいくつかに、グローバルアドレスを与える事ができます。これがNATです。

この場合、「サーバーA」のLAN内のアドレスは、192.168.0.2です。しかし、このままではLANの外側からアクセスする事ができません。なぜなら、192.168.xxx.xxxというアドレスはローカルアドレスであり、世界中にあるサーバー機のうちの1台を特定できるアドレスではないからです。
そのため、LAN内の192.168.0.2というアドレスを、グローバルアドレスに相互変換する必要があります。
そこで、LAN内のコンピューターのうちのいくつかに、グローバルアドレスを与える事ができます。これがNATです。

この場合、「サーバーA」のLAN内のアドレスは、192.168.0.2です。しかし、このままではLANの外側からアクセスする事ができません。なぜなら、192.168.xxx.xxxというアドレスはローカルアドレスであり、世界中にあるサーバー機のうちの1台を特定できるアドレスではないからです。
そのため、LAN内の192.168.0.2というアドレスを、グローバルアドレスに相互変換する必要があります。
iptables -t nat -A POSTROUTING -s 192.168.0.2 -p all -o ppp+ -j SNAT --to
(グローバルアドレス) iptables -t nat -A PREROUTING -d (グローバルアドレス) -p all -i ppp+ -j DNAT --to 192.168.0.2 |
各パラメーターは、
-t nat | NATテーブル |
-A | ルールを追加 |
POSTROUTING | アクセス元のアドレスの変換 |
PREROUTING | アクセス先のアドレスの変換 |
-s 192.168.0.2 | 192.168.0.2というアドレスを変換 |
-d (グローバルアドレス) | 指定されたグローバルアドレスを変換 |
-p all | すべてのプロトコルを変換 |
-o ppp+ | PPPへ出力 |
-i ppp+ | PPPから入力 |
SNAT --to (グローバルアドレス) | 指定されたグローバルアドレスに変換 |
DNAT --to 192.168.0.2 | 192.168.0.2に変換 |
という意味です。
※(グローバルアドレス)には、プロバイダから割り当てられたアドレスを入れます。
※ここでは、-p all ですべてのプロトコルを変換していますが、実際には必要なプロトコルだけを変換するように設定しましょう。
これによって、外部からグローバルアドレスでアクセスがあった場合、ローカルアドレスに相互変換され、サーバーAにアクセスする事ができます。
※(グローバルアドレス)には、プロバイダから割り当てられたアドレスを入れます。
※ここでは、-p all ですべてのプロトコルを変換していますが、実際には必要なプロトコルだけを変換するように設定しましょう。
これによって、外部からグローバルアドレスでアクセスがあった場合、ローカルアドレスに相互変換され、サーバーAにアクセスする事ができます。
ppp+って??
ところで、随所に出てくる「ppp+」って何でしょう??
本当は出力先ポートは、eth0やeth1のようなネットワークカードを指定します。しかしながら、インターネットに直接LANで接続するようなプランを契約しているならともかく、一般のADSLやISDNで接続をしている人は、PPP接続していることでしょう。
その場合、出力先はppp0とかppp1になります。大抵はppp0です。ただし、ppp+と書くと、ppp0またはppp1またはppp2……のうち、番号の一番若くて現在有効な接続が自動的に使われます。マルチセッションを使わない限りppp+で良いでしょう。
本当は出力先ポートは、eth0やeth1のようなネットワークカードを指定します。しかしながら、インターネットに直接LANで接続するようなプランを契約しているならともかく、一般のADSLやISDNで接続をしている人は、PPP接続していることでしょう。
その場合、出力先はppp0とかppp1になります。大抵はppp0です。ただし、ppp+と書くと、ppp0またはppp1またはppp2……のうち、番号の一番若くて現在有効な接続が自動的に使われます。マルチセッションを使わない限りppp+で良いでしょう。
FTPを有効にする
このままルーター機として使うと、FTPだけがどうしてもうまくいきません。
具体的には、
・接続はするが、LISTコマンドを発行すると固まってしまう。
・SENDはするがRECIEVEできない。
・パッシブモードにするとローカルIPが出てしまう。
という状態になります。これは、IPTABLESが、デフォルトのままではFTPモジュールを組み込まないためです。
FTPのパッシブモードでは、まずいったん21番ポートでデータ-をやりとりした後に、サーバーが任意のポート(1024番以降)を空けて、そこでデータ-をやりとりします。そのため、最初の21番ポートでのやりとりを監視して、そこで空けられたポートに対してもNATが有効になるようなモジュールを組み込む必要があります。
FTPモジュールの組み込み
具体的には、
・接続はするが、LISTコマンドを発行すると固まってしまう。
・SENDはするがRECIEVEできない。
・パッシブモードにするとローカルIPが出てしまう。
という状態になります。これは、IPTABLESが、デフォルトのままではFTPモジュールを組み込まないためです。
FTPのパッシブモードでは、まずいったん21番ポートでデータ-をやりとりした後に、サーバーが任意のポート(1024番以降)を空けて、そこでデータ-をやりとりします。そのため、最初の21番ポートでのやりとりを監視して、そこで空けられたポートに対してもNATが有効になるようなモジュールを組み込む必要があります。
insmod ip_nat_ftp insmod ip_conntrack_ftp |
これによって、NATで公開されたサーバーにFTPで正常に送受信ができるようになります。

広告