この演習の目的は次の三つです。
Linux PCでRouterを作り、運用するための導入を行います。
まず、Linux PCをRouterとして利用できることを確認するために、次のようなNetworkを構成します。
Network Name | Network Address | Subnet Mask |
---|---|---|
Network 1 | 192.168.1.0 | 255.255.255.0 (/24) |
Network 2 | 192.168.2.0 | 255.255.255.0 (/24) |
Host (Windows-PC)は、二台、Router (Linux-PC)は一台です。なお、このNetworkでは、Name Serverが存在しないので、Name Serverは、設定しません。
また、Routerには、Default Gatewayは、設定しません(図中ではN/Aで表現している。)。
Host Name | Interface | IP Address | Subnet Mask | Default Gateway |
---|---|---|---|---|
Windows-A | N/A | 192.168.1.1 | 255.255.255.0 (/24) | 192.168.1.2 |
Windows-B | N/A | 192.168.2.4 | 255.255.255.0 (/24) | 192.168.2.3 |
Linux-X | eth0 | 192.168.1.2 | 255.255.255.0 (/24) | N/A |
eth1 | 192.168.2.3 | 255.255.255.0 (/24) | N/A |
Windows-A [192.168.1.1] | 192.168.1.0/24 >-------+--------------+------------< | eth0:[192.168.1.2] Linux-X eth1:[192.168.2.3] | 192.168.2.0/24 >-------+--------------+------------< | [192.168.2.4] Windows-B
+------------+ | | | | 192.168.1.1 | Windows-A +------------------+ 192.168.1.0/24 | | | +------------+ +------------+ | | | +---+ | | | | Hub/Switch | +---+ | +------------+ | | | | | eth0:192.168.1.2 | +------------+ | +------------------+ | Linux-X | eth1:192.168.2.3 | +------------------+ 192.168.2.0/24 | | | +------------+ +------------+ | | | (*) PC Card を二枚挿す。 +---+ | | | | Hub/Switch | +---+ | +------------+ | | | | | 192.168.2.4 | +------------+ | +------------------+ | Windows-B | | | +------------+
Windowsの設定は、一回目の手動設定
の所を参考にしてください。
また、IP Address, Subnet Mask, Default Gatewayは、表2.1.1.2[実験 1 の Host の情報]を参照してください。
なお、Name Serverの設定は、今回は行いません。
Linuxの設定は、二回目の手動設定
の所を参考にしてください。
また、IP Address, Subnet Maskは、表2.1.1.2[実験 1 の Host の情報]を参照してください。
なお、Default Gateway, Name Serverの設定は、今回は行いません。
注意点としては、Linux-Xは、二つのEthernet Interface ( eth0とeth1 )を持つということで、先に挿した方のPC Cardが、eth0になり、後から挿した方が、eth1になります。
そこで、二つのSlotの内、下の方を先に入れ、後から上を入れるか、あるいは、cardctl
コマンドを利用して、次のように明示的に、指定すると良いかもしれません。
[root@Linux-X /root]# cardctl eject [root@Linux-X /root]# cardctl insert 0 [root@Linux-X /root]# cardctl insert 1 [root@Linux-X /root]#
最初のコマンドは、「全てのカードを抜け」という意味になり、次のコマンドは、「Slot 0 (下)のカードを挿せ」の意味になり、最後の命令が「Slot 1(上)カードを挿せ」の意味となる(1)
ので、このコマンドにより、「下→上」の順番に挿したのと同じ効果が得られます。
これによって、下がeth0,上がeth1という関係も成り立つようになります。
また、IP AddressとNetmaskを設定する場合は、eth0とeth1では当然、別々の設定を行いますので、それぞれ、次のようなコマンドで設定することになります。
[root@Linux-X /root]# ifconfig eth0 192.168.1.2 netmask 255.255.255.0 [root@Linux-X /root]# ifconfig eth1 192.168.2.3 netmask 255.255.255.0 [root@Linux-X /root]#
PCによっては、この時に、ピッ、ブッと、二度目の音が、鈍い音(設定に失敗した意味)になることがあります。
原則として、これは、気にする必要はありません。なぜなら、その理由は、/etc/sysconfig/network-scripts/ifcfg-eth1が存在しないからだけで、これ以後の作業には、影響しないからです。
しかし、どうしても気になるのでしたら、次のようにして、/etc/sysconfig/network-scripts/ifcfg-eth1を作ればよいでしょう。
[root@Linux-X /root]# echo \ DEVICE="eth1">/etc/sysconfig/network-scripts/ifcfg-eth1 [root@Linux-X /root]# echo \ BOOTPROTO="none">>/etc/sysconfig/network-scripts/ifcfg-eth1 [root@Linux-X /root]# echo \ ONBOOT="no">>/etc/sysconfig/network-scripts/ifcfg-eth1 [root@Linux-X /root]#
この状態で、pingを行うと次のような結果になるはずです。実際にWindows-A/BやLinux-Xから、Pingを行って、このような結果になることを確かめなさい。
From / To | Windows-A | Linux-X | Windows-B |
---|---|---|---|
Windows-A | OK | OK | NG |
Linux-X | OK | OK | OK |
Windows-B | NG | OK | OK |
実験1では、同一のNetwork (同じHub )に接続されているHost間での通信はできたが、異なるNetwork間で接続されているHost ( Windows-AとWindows-B )間では、通信できなかった。
これは、単にケーブルを結んだだけでは繋がらないということを意味します。
実は、実験1でWindows-A, B間が接続できなかった理由は、単にLinux-Xで、Routerとして設定( IP Forwarding : IPの転送機能)の設定がなされてなかったからです。
これは/proc/sys/net/ipv4/ip_forward
の内容が0であることで確認できます。
[root@Linux-X /root]# cat /proc/sys/net/ipv4/ip_forward 0 [root@Linux-X /root]#
ということで、次の実験では、IP Forwardingの設定をすると、Networkに跨る通信ができるということを確認します。
実験1と実験2では、Network構成は、全く同じです。ただし、Linux-Xが、IP Forwardingを行うように、次の設定を行います。
[root@Linux-X /root]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@Linux-X /root]#
これは、/proc/sys/net/ipv4/ip_forwardの中身を1にするという作業です。
実際に、ip_forwardの中身が(以前の0から現在設定した..) 1になっていることも確認してみましょう。
この状態で、pingを行うと次のような結果になるはずです。実際にWindows-A/BやLinux-Xから、Pingを行って、このような結果になることを確かめなさい。
From / To | Windows-A | Linux-X | Windows-B |
---|---|---|---|
Windows-A | OK | OK | OK |
Linux-X | OK | OK | OK |
Windows-B | OK | OK | OK |
実験1と実験2の違いは、Windows-A, B間の通信が可能になったという点です。これは、当然、実験2でのIP Forwardingの設定の差であることに注意してください。
逆に、このような追加設定が必要であっても、要するに、異なるNetwork間を繋ぐには、今回のLinux-XのようなRouter機能をもった、装置を間に挟めば、通信が可能になるということも大きなポイントです。
実験3では、実験1, 2と異なり、今度は、3つのNetworkを結びます。
構成としては、Network 3と、Linux-Y,そして、Windows-Cを実験1, 2のNetworkに追加した形になっています。
Network Name | Network Address | Subnet Mask |
---|---|---|
Network 1 | 192.168.1.0 | 255.255.255.0 (/24) |
Network 2 | 192.168.2.0 | 255.255.255.0 (/24) |
Network 3 | 192.168.3.0 | 255.255.255.0 (/24) |
Host Name | Interface | IP Address | Subnet Mask | Default Gateway |
---|---|---|---|---|
Windows-A | N/A | 192.168.1.1 | 255.255.255.0 (/24) | 192.168.1.2 |
Windows-B | N/A | 192.168.2.4 | 255.255.255.0 (/24) | 192.168.2.3 |
Windows-C (新規追加) | N/A | 192.168.3.7 | 255.255.255.0 (/24) | 192.168.3.6 |
Linux-X | eth0 | 192.168.1.2 | 255.255.255.0 (/24) | N/A |
eth1 | 192.168.2.3 | 255.255.255.0 (/24) | N/A | |
Linux-Y (新規追加) | eth0 | 192.168.2.5 | 255.255.255.0 (/24) | N/A |
eth1 | 192.168.3.6 | 255.255.255.0 (/24) | N/A |
Windows-A [192.168.1.1] | 192.168.1.0/24 >-------+--------------+------------< | eth0:[192.168.1.2] Linux-X eth1:[192.168.2.3] | 192.168.2.0/24 >-------+--------------+------------< | | [192.168.2.4] eth0:[192.168.2.5] Windows-B Linux-Y eth1:[192.168.3.6] | 192.168.3.0/24 >-------+--------------+------------< | [192.168.3.7] Windows-C
+------------+ | | | | 192.168.1.1 | Windows-A +------------------+ 192.168.1.0/24 | | | +------------+ +------------+ | | | +---+ | | | | Hub/Switch | +---+ | +------------+ | | | | | eth0:192.168.1.2 | +------------+ | +------------------+ | Linux-X | eth1:192.168.2.3 | +------------------+ 192.168.2.0/24 | | | +------------+ +------------+ | | | (*) PC Card を二枚挿す。 +---+ | | | +------------+ | | | | 192.168.2.4 | Hub/Switch | | +----------------------+ | | Windows-B | | | | | +---+ | | | | | | +------------+ | +------------+ | | +------------+ | | | eth0:192.168.2.5 | | +------------------+ | Linux-Y | eth1:192.168.3.6 | +------------------+ 192.168.3.0/24 | | | +------------+ +------------+ | | | (*) PC Card を二枚挿す。 +---+ | | | | Hub/Switch | +---+ | +------------+ | | | | | 192.168.3.7 | +------------+ | +------------------+ | Windows-C | | | +------------+
Linux-Xの設定は、実験2のまま(ちゃんとIP Forwardingできる形)で、Linux-Yの設定を行います。
IP Address, Subnet Maskは、表2.3.1.2[実験 3 の Host の情報]を参照します。当然のことながら、Linux-YもIP Forwardingできる状態にしましょう。
この状態で、pingを行うと次のような結果になるはずです。実際にWindows-A/B/CやLinux-X/Yから、Pingを行って、このような結果になることを確かめなさい。
From / To | Windows-A | Linux-X | Windows-B | Linux-Y | Windows-C |
---|---|---|---|---|---|
Windows-A | OK | OK | OK | NG | NG |
Linux-X | OK | OK | OK | OK | NG |
Windows-B | OK | OK | OK | OK | NG |
Linux-Y | NG | OK | OK | OK | OK |
Windows-C | NG | NG | NG | OK | OK |
実験2と実験3では、かなり奇妙な結果になっていることがわかります。Windows-AとWindows-Bがちゃんと、通信できているのに、Windows-CとWindows-Bは通信ができませんし、また、Windows-BとLinux-Yは、同じ所にあるのに、Windows-Bは、Windows-Aと通信ができて、Linux-Yは、Windows-Aと通信ができません。
これは、何が起きているのでしょうか?
この違いは、実は、前者が、Default GatewayをLinux-X (の192.168.2.3 )に向けているのに対し、Linux-Yは、Default Gatewayを設定していないところに問題があります。
Windows-Bは、Windows-AのIP Address (192.168.1.1)を与えると、自分のIP Addres 192.168.2.4と比較します。ここで、Subnet Maskが、255.255.255.0 (/24)なので、比較するのは、上の三つの数だけ(つまり、192.168.2と192.168.1 )を比較します。
すると、これが、異なるので、この場合は、Default GatewayであるLinux-Xに投げます。Linux-Xは、これを受け取ると、今度は、( eth0側のNetworkに)直接Windows-Aがいることがわかる( eth0の192.168.1.2の上の三つの数192.168.1とWindows-Aの192.168.1.1の上の三つの数192.168.1を比較すると同じなる)ので、その通信をWindwos-Aに中継できるわけです。
もちろん、Windows-Aも同様な流れ(2)で、Windows-Bに返事を返します(3)。
ところが、Linux-Yは、Windows-Aの192.168.1.1と比較して、自分の所属する二つのNetwork ( eth0の192.168.2.5, 192.168.3.6 )のいずれとも異なる上に、Default Gatewayがないので、通信のしようがないわけです。
Windows-CからWindows-B Pingが通らない理由は、次の通りです。
まず、Windows-Cは、自分のIP Address 192.168.3.7の上位3つの192.168.3と、通信先のWindows-BのIP Address 192.168.2.4の上位三つ192.168.2を比較し、異なるNetworkにいることを理解します。
そして、Default GatewayであるLinux-Y (192.168.3.6)が設定されていますので、Linux-Yに投げます。
Linux-Yはもちろん、eth0側に、Windows-Bがいるので、実は、ちゃんと、このパケット(行き)は、Windows-Bまで届くのです。
ところがです。今度は、Windows-Bからの返事ですが、これは、返事を返す先である、Windows-Cが、異なるNetworkにいるということで、Linux-Xに投げるのですが、Linux-Xは、192.168.3のNetworkを知りません。ということで、返事が返らないわけです。
実験3では、Linux-Yが、Network 1のことを知らなかったり、あるいは、Linux-Xが、Network 2のことを知らなかったために、通信がうまく行きませんでした。
そこで、Linux-X/Yに、それぞれNetwork 2/1のことを教えてやれば、通信ができそうです。
今回の実験では、その設定方法を学びます。
実験4のNetworkは、実験3と同じですが、次のように、Linux-XにNetwork 2のことを教えます。
これを、(static:静的) Routing の設定
と呼びます。
[root@Linux-X /root]# route add -net 192.168.3.0 netmask \ 255.255.255.0 gw 192.168.2.5 [root@Linux-X /root]#
これは、default gateway の設定
とよく似ている(4)ことがわかります。
この状態で、pingを行うと、今度は、Windows-B/C間での通信が可能になることがわかると思います(5)。
ただし、Windows-A/C間はまだです。なぜなら、まだ、Linux-YでのNetwork 1へのRoutingの設定がなされていないからです。
もし、上記のことが確認したら、同様にLinux-Yに設定を加えてみましょう。
また、もし、時間があったら、なぜ、Linux-X, Linux-YそれぞれにDefault Gatewayを相互に設定するのではだめ(6)かも考えて見ましょう。
実際、このような設定を行うと、実は、全てのHost間でのPingが通り、今回のように、一々、Networkを設定した場合と結果が同じように見える(確かめてみよう)。
しかし、Networkに存在しないIP AddressにTracerouteした場合に結果が異なる。