heishi1HUMANITY article

大学の授業でやったlinuxルータをもう一度

最終更新 : 2022-08-06

こんなネットワークを作ります



VirtualBoxでやる課題だったんですけど、Dockerでやります。

Dockerfileを書く

とりあえず必要なもの詰め込んだDockerfileを書いていきます。

FROM ubuntu:20.04

RUN apt update && \
    apt full-upgrade -y && \
    apt autoremove && \
    apt install iproute2 curl iputils-ping vim quagga telnet -y


docker build -t net .


一応入れたものの説明をしますと、

  • iproute2→ipコマンドを使うのに必要、デフォルトゲートウェイを書き換える
  • curl→言わずとしれたcurl、確認用
  • iputils-ping→pingを送るのに必要、確認用
  • vim→僕はvim派
  • quagga→ルータ、ルータ以外には入れる必要なし
  • telnet→ルータとの接続用


Dockerでネットワークを作成

Dockerでネットワークを作成します。
192.168.0.0/24をseg1、10.0.0.0/8をseg2、192.168.1.0/24をseg3とします。

docker network create --subnet 192.168.0.0/24 --gateway 192.168.0.254 seg1
docker network create --subnet 10.0.0.0/8 --gateway 10.0.0.254 seg2
docker network create --subnet 192.168.1.0/24 --gateway 192.168.1.254 seg3


コンテナの作成

コンテナを作成します。複数のネットワークを紐付けるコンテナがあるので、コンテナを作るだけです。
また、ipコマンドでデフォルトゲートウェイを変更するのに--privilegedをつける必要があります。

docker create -it --name PC1 --privileged net
docker create -it --name RT1 --privileged net
docker create -it --name RT2 --privileged net


ネットワークとの紐付け

コンテナとネットワークを紐付け、ipアドレスを割り当てます。

docker network connect --ip 192.168.0.2 seg1 PC1
docker network connect --ip 192.168.0.1 seg1 RT1
docker network connect --ip 10.0.0.1 seg2 RT1
docker network connect --ip 192.168.1.1 seg3 RT2
docker network connect --ip 10.0.0.2 seg2 RT2


また、bridgeネットワークを切り離します。

docker network disconnect bridge PC1
docker network disconnect bridge RT1
docker network disconnect bridge RT2


終わったらコンテナを起動します。

docker start PC1
docker start RT1
docker start RT2


起動直後のPC1を見る

まずipv4がちゃんと設定されているかを見てみます。

# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
46: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default  link-netnsid 0
    inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever


eth0に192.168.0.2が付いてるのがわかります。
次のルーティングテーブルを見ます。

# ip route
default via 192.168.0.254 dev eth0
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2


デフォルトゲートウェイに192.168.0.254が設定されてます。Dockerでネットワークを作った際に決めたゲートウェイです。
現状であれば192.168.0.0/24内のノードにpingが届きます。試しに192.168.0.1にpingを送ると

# ping 192.168.0.1 -c 3
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.285 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.073 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=0.054 ms

--- 192.168.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2099ms
rtt min/avg/max/mdev = 0.054/0.137/0.285/0.104 ms


当然ですが、10.0.0.0/8や192.168.1.0/24には到達できません。

# ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
^C
--- 10.0.0.1 ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 10364ms


PC1のデフォルトゲートウェイを書き換える

それではPC1のルーティングテーブルを書き換え、デフォルトゲートウェイにRT1を追加します。

# ip route del default
# ip route add default via 192.168.0.1 dev eth0


この状態でルーティングテーブルは

# ip route
default via 192.168.0.1 dev eth0
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2


となります。

RT1,RT2をルータとし、静的ルーティングを行う

次に、ルータを設定していきます。
とりあえずデフォルトゲートウェイは削除しておきます。

次に、zebra.confを/etc/quagga/に配置します。
例えば、RT1のzebra.confは次のようになります。hostnameやpasswordは適当に変更します。

hostname rt1 
password rt1pass
enable password rt1pass


次にzebraを起動します。

# service zebra start


起動したzebraは2601ポートで待ち受けているのでtelnetで接続します。

# telnet localhost 2601
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Hello, this is Quagga (version 1.2.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification

Password:
rt1>


それでは現在のRT1のルーティングテーブルを確認します。コマンドは概ねCISCO IOSと同じです。

rt1> show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, P - PIM, A - Babel, N - NHRP,
       > - selected route, * - FIB route

C>* 10.0.0.0/8 is directly connected, eth1
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.0.0/24 is directly connected, eth0


それではここに192.168.1.0/24へのルーティングを追加します。

rt1> en
Password:
rt1> en
Password:
rt1# conf t
rt1(config)# ip route 192.168.1.0 255.255.255.0 10.0.0.2
rt1(config)# exit
rt1# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, P - PIM, A - Babel, N - NHRP,
       > - selected route, * - FIB route

C>* 10.0.0.0/8 is directly connected, eth1
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.0.0/24 is directly connected, eth0
S>* 192.168.1.0/24 [1/0] via 10.0.0.2, eth1


追加しました。RT2にも同じように192.168.0.0/24のルーティングを追加します。
ここまでで、PC1は10.0.0.2にも192.168.1.1にも到達できるようになりました。
実際にpingを送ってみます。

# ping 10.0.0.2 -c 3
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=63 time=0.407 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=63 time=0.065 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=63 time=0.065 ms

--- 10.0.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2069ms
rtt min/avg/max/mdev = 0.065/0.179/0.407/0.161 ms
#
# ping 192.168.1.1 -c 3
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=63 time=0.236 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=63 time=0.065 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=63 time=0.074 ms

--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2111ms
rtt min/avg/max/mdev = 0.065/0.125/0.236/0.078 ms


これにて静的ルーティングは完了です。

RIPで動的ルーティングを行う

次にRIPで動的ルーティングを行います。
まずルータに設定した静的ルーティングを削除します。

rt1(config)# no ip route 192.168.1.0 255.255.255.0 10.0.0.2
rt1(config)# exit
rt1# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, P - PIM, A - Babel, N - NHRP,
       > - selected route, * - FIB route

C>* 10.0.0.0/8 is directly connected, eth1
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.0.0/24 is directly connected, eth0


次に、/etc/quagga/にripd.confを設置します。
ripd.confの中身はRT1の場合次のようになります。

hostname ripdrt1
password ripdrt1pass
enable password ripdrt1pass


ripdを起動し、telnetで接続します。

# service ripd start
 * Starting ripd ripd
# telnet localhost 2602
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Hello, this is Quagga (version 1.2.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification

Password:
ripdrt1>


次に各ネットワークに向けRIPを起動します。

ripdrt1> en
Password:
ripdrt1# conf t
ripdrt1(config)# router rip
ripdrt1(config-router)# network 10.0.0.0/8
ripdrt1(config-router)# network 192.168.0.0/24
ripdrt1(config-router)# version 2
ripdrt1(config-router)# end


これを両方のルータでやることで、動的にルーティングテーブルが設定されます。
実際に、RT1のルーティングテーブルを確認します。

# telnet localhost 2601
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Hello, this is Quagga (version 1.2.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification

Password:
rt1> show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, P - PIM, A - Babel, N - NHRP,
       > - selected route, * - FIB route

C>* 10.0.0.0/8 is directly connected, eth1
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.0.0/24 is directly connected, eth0
R>* 192.168.1.0/24 [120/2] via 10.0.0.2, eth1, 00:01:44


192.168.1.0/24がRIPで設定されていることがわかります。
では、PC1からpingを送ってみます。

# ping 10.0.0.2 -c 3
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=63 time=0.166 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=63 time=0.064 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=63 time=0.065 ms

--- 10.0.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2109ms
rtt min/avg/max/mdev = 0.064/0.098/0.166/0.047 ms
#
# ping 192.168.1.1 -c 3
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=63 time=0.301 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=63 time=0.064 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=63 time=0.066 ms

--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2079ms
rtt min/avg/max/mdev = 0.064/0.143/0.301/0.111 ms


問題なさそうですね。

PC2を追加する

PC2を追加します。
PC2には192.168.1.2を与えます。

docker create -it --name PC2 --privileged net
docker network connect --ip 192.168.1.2 seg3 PC2
docker network disconnect bridge PC2
docker start PC2


PC2のデフォルトゲートウェイを変更します。

# ip route del default
# ip route add default via 192.168.1.1 dev eth0


通信の確認をします。

# ping 192.168.0.2 -c 3
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=62 time=0.246 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=62 time=0.094 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=62 time=0.077 ms

--- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2083ms
rtt min/avg/max/mdev = 0.077/0.139/0.246/0.075 ms


新たにノードを追加しても問題なく動作することが確認できました。

コメント