【2024年08月版】Linux 1台でルーティング体験メモ【初学者向け、教育資料、namespace】

# はじめに

Linux の namespace機能を使ってルーティングを体験するメモ

初学者向け

Linux 1台でできるので、お手軽にルーティングの基礎を学べます

:::note info
その他の namespace を利用した体験メモはこちら
- [【2024年08月版】Linux namespace 体験メモ【初学者向け、教育資料、namespace】](https://qiita.com/nouernet/items/4c37dbef38c12939b72e)
- [【2024年08月版】Linux 1台でブリッジ体験メモ【初学者向け、教育資料、namespace】](https://qiita.com/nouernet/items/3d113360e700d0e9a5f9)
:::

# 環境準備

- Ubuntu22.04などのLinuxを1台準備します
- traceroute を利用します。コマンドがインストールされていないなら、インストールしてくだい

```terminal
sudo apt install inetutils-traceroute
```

# ルータ１つのパターン

- ２つのPCを別々のセグメント(10.11.12.0/24, 10.21.22.0/24)に分けます
- ２つのセグメント間にルータを入れます
- セグメントのデフォルトゲートウェイをルータにします
- ２つのPC間でルーターを経由してPingのやり取りができることを確認します

```plantuml
@startuml
nwdiag {

    network 01 {
        address = "10.11.12.0/24";
        testns01 [address = ".1"];
        testgw01 [address = ".254"];
    }
    
    network 02 {
        address = "10.21.22.0/24";
        testns02 [address = ".1"];
        testgw01 [address = ".254"];
    }
    
}
@enduml
```

```
sudo ip --all netns delete

sudo ip netns add testns01
sudo ip netns add testns02
sudo ip netns add testgw01
sudo ip netns list
sudo ip link add testns01-veth0 type veth peer name testgw01-veth0
sudo ip link add testns02-veth0 type veth peer name testgw01-veth1
sudo ip link
sudo ip link set testns01-veth0 netns testns01
sudo ip link set testns02-veth0 netns testns02
sudo ip link set testgw01-veth0 netns testgw01
sudo ip link set testgw01-veth1 netns testgw01
sudo ip netns exec testns01 ip link
sudo ip netns exec testns02 ip link
sudo ip netns exec testgw01 ip link
sudo ip netns exec testns01 ip a add 10.11.12.1/24 dev testns01-veth0
sudo ip netns exec testns02 ip a add 10.21.22.1/24 dev testns02-veth0
sudo ip netns exec testgw01 ip a add 10.11.12.254/24 dev testgw01-veth0
sudo ip netns exec testgw01 ip a add 10.21.22.254/24 dev testgw01-veth1
sudo ip netns exec testns01 ip link set testns01-veth0 up
sudo ip netns exec testns02 ip link set testns02-veth0 up
sudo ip netns exec testgw01 ip link set testgw01-veth0 up
sudo ip netns exec testgw01 ip link set testgw01-veth1 up
sudo ip netns exec testns01 ip link set lo up
sudo ip netns exec testns02 ip link set lo up
sudo ip netns exec testgw01 ip link set lo up
sudo ip netns exec testns01 ping 10.11.12.254
sudo ip netns exec testns02 ping 10.21.22.254
sudo ip netns exec testgw01 ping 10.11.12.1
sudo ip netns exec testgw01 ping 10.21.22.1
sudo ip netns exec testns01 ip route add default via 10.11.12.254
sudo ip netns exec testns02 ip route add default via 10.21.22.254
sudo ip netns exec testns01 ip route show
sudo ip netns exec testns02 ip route show
sudo ip netns exec testgw01 sysctl net.ipv4.ip_forward=1
sudo ip netns exec testns01 ping 10.21.22.1
sudo ip netns exec testns02 ping 10.11.12.1
sudo ip netns exec testns01 traceroute 10.21.22.1
sudo ip netns exec testns02 traceroute 10.11.12.1
```

# ルータ２つのパターン

- ２つのPCを別々のセグメント(10.11.12.0/24, 10.21.22.0/24)に分けます
- ルータ間を別のセグメント(10.31.32.0/24)で接続します
- ２つのセグメント間に２つのルータを入れます
- セグメントのデフォルトゲートウェイをルータにします
- ２つのPC間でルーターを経由してPingのやり取りができることを確認します

```plantuml
@startuml
nwdiag {

    network 01 {
        address = "10.11.12.0/24";
        testns01 [address = ".1"];
        testgw01 [address = ".254"];
    }
    
    network gw {
        address = "10.31.32.0/24";
        testgw01 [address = ".10"];
        testgw02 [address = ".11"];
    }

    network 02 {
        address = "10.21.22.0/24";
        testns02 [address = ".1"];
        testgw02 [address = ".254"];
    }
    
}
@enduml
```

```
sudo ip --all netns delete
sudo ip netns add testns01
sudo ip netns add testns02
sudo ip netns add testgw01
sudo ip netns add testgw02
sudo ip netns list
sudo ip link add testns01-veth0 type veth peer name testgw01-veth0
sudo ip link add testns02-veth0 type veth peer name testgw02-veth0
sudo ip link add testgw01-veth1 type veth peer name testgw02-veth1
sudo ip link
sudo ip link set testns01-veth0 netns testns01
sudo ip link set testns02-veth0 netns testns02
sudo ip link set testgw01-veth0 netns testgw01
sudo ip link set testgw01-veth1 netns testgw01
sudo ip link set testgw02-veth0 netns testgw02
sudo ip link set testgw02-veth1 netns testgw02
sudo ip netns exec testns01 ip link
sudo ip netns exec testns02 ip link
sudo ip netns exec testgw01 ip link
sudo ip netns exec testgw02 ip link
sudo ip netns exec testns01 ip a add 10.11.12.1/24 dev testns01-veth0
sudo ip netns exec testns02 ip a add 10.21.22.1/24 dev testns02-veth0
sudo ip netns exec testgw01 ip a add 10.11.12.254/24 dev testgw01-veth0
sudo ip netns exec testgw01 ip a add 10.31.32.10/24 dev testgw01-veth1
sudo ip netns exec testgw02 ip a add 10.21.22.254/24 dev testgw02-veth0
sudo ip netns exec testgw02 ip a add 10.31.32.11/24 dev testgw02-veth1
sudo ip netns exec testns01 ip link set testns01-veth0 up
sudo ip netns exec testns02 ip link set testns02-veth0 up
sudo ip netns exec testgw01 ip link set testgw01-veth0 up
sudo ip netns exec testgw01 ip link set testgw01-veth1 up
sudo ip netns exec testgw02 ip link set testgw02-veth0 up
sudo ip netns exec testgw02 ip link set testgw02-veth1 up
sudo ip netns exec testns01 ip link set lo up
sudo ip netns exec testns02 ip link set lo up
sudo ip netns exec testgw01 ip link set lo up
sudo ip netns exec testgw02 ip link set lo up
sudo ip netns exec testns01 ping 10.11.12.254
sudo ip netns exec testns02 ping 10.21.22.254
sudo ip netns exec testgw01 ping 10.11.12.1
sudo ip netns exec testgw02 ping 10.21.22.1
sudo ip netns exec testgw01 ping 10.31.32.11
sudo ip netns exec testgw02 ping 10.31.32.10
sudo ip netns exec testns01 ip route add default via 10.11.12.254
sudo ip netns exec testns02 ip route add default via 10.21.22.254
sudo ip netns exec testgw01 ip route add 10.21.22.0/24 via 10.31.32.11
sudo ip netns exec testgw02 ip route add 10.11.12.0/24 via 10.31.32.10
sudo ip netns exec testns01 ip route show
sudo ip netns exec testns02 ip route show
sudo ip netns exec testgw01 ip route show
sudo ip netns exec testgw02 ip route show
sudo ip netns exec testgw01 sysctl net.ipv4.ip_forward=1
sudo ip netns exec testgw02 sysctl net.ipv4.ip_forward=1
sudo ip netns exec testns01 ping 10.21.22.1
sudo ip netns exec testns02 ping 10.11.12.1
sudo ip netns exec testns01 traceroute 10.21.22.1
sudo ip netns exec testns02 traceroute 10.11.12.1
```

# さいごに

かんたんでしたね

# 関連リンク

- [【2024年08月版】Linux namespace 体験メモ【初学者向け、教育資料、namespace】](https://qiita.com/nouernet/items/4c37dbef38c12939b72e)
- [【2024年08月版】Linux 1台でブリッジ体験メモ【初学者向け、教育資料、namespace】](https://qiita.com/nouernet/items/3d113360e700d0e9a5f9)