| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

TCP/IP

提供: MyMemoWiki
2022年2月19日 (土) 13:06時点におけるPiroto (トーク | 投稿記録)による版 (→‎ルーターを増やす)
ナビゲーションに移動 検索に移動

TCP/IP

ip address show


  • inet の後がIPアドレス
  • lo,ens3 はネットワークインターフェース(NICや無線LANアダプタなどを抽象化)
  • IPアドレスはネットワークインターフェースに付与される
  • 127.0.0.1はループバックアドレスで、自分自身を表す
  • ループバックアドレスが付与されているインターフェースはループバックインターフェース
$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:97:68:97 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.243/24 brd 192.168.122.255 scope global dynamic ens3
       valid_lft 3189sec preferred_lft 3189sec
    inet6 fe80::5054:ff:fe97:6897/64 scope link 
       valid_lft forever preferred_lft forever

tcpdump パケットキャプチャ


  • -t : 時刻情報出力抑制
  • -n : IP逆引きしない
  • -i : 対象インターフェースを指定 anyで全て
  • icmp : icmp プロトコルに限定
$ sudo tcpdump -tn -i any icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
IP 192.168.122.243 > 8.8.8.8: ICMP echo request, id 2, seq 1, length 64
IP 8.8.8.8 > 192.168.122.243: ICMP echo reply, id 2, seq 1, length 64
IP 192.168.122.243 > 8.8.8.8: ICMP echo request, id 2, seq 2, length 64
IP 8.8.8.8 > 192.168.122.243: ICMP echo reply, id 2, seq 2, length 64

traceroute


  • パケット通過ルーター
  • TTL : 0-255と解釈される値が入りパケット送出時にノードが初期値を設定、ルーター追加ごとに1つづつ値が減る。経路で値が0になるとルーターにより破棄されるが、この時ルーターは、ICMPで時間切れメッセージを送信元に送る
  •  TTLにあえて小さな値を設定し、TTLを1つづつ増やしたパケットを送信、時間切れをおこした通知を組み立てる
  •  時間切れを通知しないルーター設定は、* となる
$ traceroute typea.info
traceroute to typea.info (160.16.110.88), 64 hops max
  1   192.168.122.1  0.343ms  0.288ms  0.301ms 
  2   192.168.0.1  0.694ms  0.492ms  0.487ms 
  3   210.173.146.32  4.710ms  4.013ms  3.784ms 
  4   210.173.145.69  3.968ms  4.044ms  4.072ms 
  5   210.173.150.97  3.557ms  4.091ms  3.896ms 
  6   210.171.224.113  9.550ms  7.866ms  8.150ms 
  7   *  *  * 
  8   *  *  * 
  9   *  *  * 
 10   *  *  * 
 11   160.16.110.88  11.148ms  12.124ms  12.150ms 

ip route show ルーティングテーブル


  • 複数のルーティングエントリから構成(それぞれの行)
  •  先頭に宛先のIPアドレス
  •  宛先に続くのがネクストホップ(パケットを次に渡す相手)
$ ip route show
default via 192.168.122.1 dev ens3 proto dhcp src 192.168.122.243 metric 100 
192.168.122.0/24 dev ens3 proto kernel scope link src 192.168.122.243 
192.168.122.1 dev ens3 proto dhcp scope link src 192.168.122.243 metric 100 

IPアドレス

  • 32bitの前半をネットワーク部(ネットワークアドレス)、後半をホスト部(ホストアドレス)
  • 192.0.2.1/24 24bitで分割 -> ネットワーク部 192.0.2.0、ホスト部 .1
  • ネットワーク部は、ネットワークセグメントを表す、同じなら同じセグメントに属する
  • 192.0.2.1/24 この書き方はCIDR表記と呼ばれる
  • サブネット表記では、255.255.255.0

Network Namespace

$ sudo ip netns add helloworld
$ ip netns list
helloworld
  • ip nets exec
    • 指定したNetwork Namespace環境でコマンドを実行
$ sudo ip netns exec helloworld ip address show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  • Network Namespaceでシェルも起動できる
$ sudo ip netns exec helloworld bash

ネットワークを作成して接続


2つのNetwork Namespaceを作成

Network01.png

$ sudo ip netns add ns1
$ sudo ip netns add ns2
  • 接続するには、veth(Virtual Ethernet Device)を作成
  • Nework Namespaceに所属させる
$ sudo ip link add ns1-veth0 type veth peer name ns2-veth0
$ sudo ip link set ns1-veth0 netns ns1
$ sudo ip link set ns2-veth0 netns ns2
  • 確認
$ sudo ip netns exec ns1 ip link show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: ns1-veth0@if3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether ca:f0:3b:a9:2a:eb brd ff:ff:ff:ff:ff:ff link-netns ns2

IPアドレスを付与

$ sudo ip netns exec ns1 ip address add 192.0.2.1/24 dev ns1-veth0
$ sudo ip netns exec ns2 ip address add 192.0.2.2/24 dev ns2-veth0
  • 確認
$ sudo ip netns exec ns1 ip address show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: ns1-veth0@if3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether ca:f0:3b:a9:2a:eb brd ff:ff:ff:ff:ff:ff link-netns ns2
    inet 192.0.2.1/24 scope global ns1-veth0
       valid_lft forever preferred_lft forever

vethを有効化

$ sudo ip netns exec ns1 ip link set ns1-veth0 up
$ sudo ip netns exec ns2 ip link set ns2-veth0 up
  • 疎通
$ sudo ip netns exec ns1 ping 192.0.2.2 -c 3
PING 192.0.2.2 (192.0.2.2) 56(84) bytes of data.
64 bytes from 192.0.2.2: icmp_seq=1 ttl=64 time=0.334 ms
64 bytes from 192.0.2.2: icmp_seq=2 ttl=64 time=0.101 ms
64 bytes from 192.0.2.2: icmp_seq=3 ttl=64 time=0.091 ms

--- 192.0.2.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2051ms
rtt min/avg/max/mdev = 0.091/0.175/0.334/0.112 ms

ルーターを介したネットワーク


Network router.png

Network Namespaceの構成

$ sudo ip netns add ns1
$ sudo ip netns add router
$ sudo ip netns add route2
$ sudo ip netns add ns2
  • それぞれのNetwork Namespaceを繋ぐvethインターフェースを作成
$ sudo ip link add ns1-veth0 type veth peer name gw-veth0
$ sudo ip link add ns2-veth0 type veth peer name gw-veth1
  • vethをNetwork Namespaceに属させる
$ sudo ip link set ns1-veth0 netns ns1
$ sudo ip link set gw-veth0 netns router
$ sudo ip link set gw-veth1 netns router
$ sudo ip link set ns2-veth0 netns ns2
  • vethをup
$ sudo ip netns exec ns1 ip link set ns1-veth0 up
$ sudo ip netns exec router ip link set gw-veth0 up
$ sudo ip netns exec router ip link set gw-veth1 up
$ sudo ip netns exec ns2 ip link set ns2-veth0 up
  • IPアドレスを付与
$ sudo ip netns exec ns1 ip address add 192.0.2.1/24 dev ns1-veth0
$ sudo ip netns exec router ip address add 192.0.2.254/24 dev gw-veth0
$ sudo ip netns exec router ip address add 198.51.100.254/24 dev gw-veth1
$ sudo ip netns exec ns2 ip address add 198.51.100.1/24 dev ns2-veth0

セグメント内の通信

  • ns1 と ns2それぞれから、rouer にping
$ sudo ip netns exec ns1 ping -c 3 192.0.2.254
PING 192.0.2.254 (192.0.2.254) 56(84) bytes of data.
64 bytes from 192.0.2.254: icmp_seq=1 ttl=64 time=0.362 ms
64 bytes from 192.0.2.254: icmp_seq=2 ttl=64 time=0.102 ms
64 bytes from 192.0.2.254: icmp_seq=3 ttl=64 time=0.108 ms

--- 192.0.2.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2049ms
rtt min/avg/max/mdev = 0.102/0.190/0.362/0.121 ms
$ sudo ip netns exec ns2 ping -c 3 198.51.100.254
PING 198.51.100.254 (198.51.100.254) 56(84) bytes of data.
64 bytes from 198.51.100.254: icmp_seq=1 ttl=64 time=0.314 ms
64 bytes from 198.51.100.254: icmp_seq=2 ttl=64 time=0.106 ms
64 bytes from 198.51.100.254: icmp_seq=3 ttl=64 time=0.110 ms

--- 198.51.100.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2051ms
rtt min/avg/max/mdev = 0.106/0.176/0.314/0.097 ms
  • セグメントはこえられない
$ sudo ip netns exec ns1 ping -c 3 198.51.100.1
ping: connect: Network is unreachable

ルーティングテーブルの確認と設定

  • 確認
  • 自身のセグメントしか表示されない
$ sudo ip netns exec ns1 ip route show
192.0.2.0/24 dev ns1-veth0 proto kernel scope link src 192.0.2.1 
  • デフォルトルート(他の宛先に一致しない場合)を追加、routerに向ける
$ sudo ip netns exec ns1 ip route add default via 192.0.2.254
  • 追加された
$ sudo ip netns exec ns1 ip route show
default via 192.0.2.254 dev ns1-veth0 
192.0.2.0/24 dev ns1-veth0 proto kernel scope link src 192.0.2.1 
  • ns2にも同様に
$ sudo ip netns exec ns2 ip route add default via 198.51.100.254
  • ns1 から ns2 へ再度 ping
  • エラーとはならないが、パケットロス100%
$ sudo ip netns exec ns1 ping -c 3 198.51.100.1
PING 198.51.100.1 (198.51.100.1) 56(84) bytes of data.

--- 198.51.100.1 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2039ms
  • 以下の設定を実施
  • sysctlでカーネルパラメータを設定(net.ipv4.ip_forward = 1 ルーターとして動作するかを設定)
$ sudo ip netns exec router sysctl net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
  • ルーターを介した接続成功
$ sudo ip netns exec ns1 ping -c 3 198.51.100.1
PING 198.51.100.1 (198.51.100.1) 56(84) bytes of data.
64 bytes from 198.51.100.1: icmp_seq=1 ttl=63 time=0.208 ms
64 bytes from 198.51.100.1: icmp_seq=2 ttl=63 time=0.114 ms
64 bytes from 198.51.100.1: icmp_seq=3 ttl=63 time=0.134 ms

--- 198.51.100.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2032ms
rtt min/avg/max/mdev = 0.114/0.152/0.208/0.040 ms

ルーターを増やす

Network3.png

  •  これまでの設定を削除
$ sudo ip --all netns delete
$ sudo ip netns ls
  • 作成
$ sudo ip netns add ns1
$ sudo ip netns add router1
$ sudo ip netns add router2
$ sudo ip netns add ns2
$ sudo ip link add ns1-veth0 type veth peer name gw1-veth0
$ sudo ip link add gw1-veth1 type veth peer name gw2-veth0
$ sudo ip link add gw2-veth1 type veth peer name ns2-veth0