Closed60

TCP/IPをハンズオンで学ぶ[Network Namespace]

ハガユウキハガユウキ

Namespace

  • LinuxのNamespaceという機能を使うと、簡単にネットワークが作れる。dockerでこのNamespace機能が使われているそう。
ハガユウキハガユウキ

ip netnsコマンド

ip netnsコマンドは、LinuxシステムにおいてNetwork Namespace(ネットワーク名前空間)を管理するためのコマンドである。

ip netns add helloworld
ハガユウキハガユウキ

このipnetnsaddというサブコマンドを使うと、新しくhelloworldという名前のNetworkNamespaceを作れる。
作られたNetwork Namespaceは、ip netns listで確認できる。

vagrant@ubuntu-focal:~$ ip netns list
helloworld
ハガユウキハガユウキ

作ったNetwork Namespaceでは、コマンドを実行できます。この操作には、ip netns execサブコマンドを使います。このコマンドに、NetworkNamespaceの名前と、そこで実行したいコマンドを続けて入力しましょう。すると、指定したNetwokNamespaceの環境を使って、そのコマンドを実行したことになります。

ハガユウキハガユウキ

表示されている内容が全然違う。
Network Namespaceを使うと、ネットワーク的にはシステムから独立した領域を作れる。あたかも別のlinuxインストールしたマシンを用意したかのようにである。
ルーティングテーブルも同様に独立しているそう。

vagrant@ubuntu-focal:~$ 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
vagrant@ubuntu-focal:~$ 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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 02:ba:21:ca:b1:0c brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
       valid_lft 82717sec preferred_lft 82717sec
    inet6 fe80::ba:21ff:feca:b10c/64 scope link
       valid_lft forever preferred_lft forever
vagrant@ubuntu-focal:~$

とりあえず、LinuxのNetwork Namespaceは、IPに関する処理を1台のLinuxの中で複数に分割することができると覚えておこう。Network Namespaceを作ると、それが新しいノードを表す感じ。そのノードには自由にIPアドレスやルートテーブルを設定したり、新しいネットワークに所属させたりできると考えよう。

https://zenn.dev/takai404/articles/52e75a953efe9e

ハガユウキハガユウキ

作成したNetwork Namespace同士を繋ぐには、veth(Virtual Ethernet Device)という仮想的なネットワークインターフェースを使う。vethをつくるには、ip link add サブコマンドを使う

# これでvethのネットワークインターフェースが作られる
 sudo ip link add ns1-veth0 type veth peer name ns2-veth0

作成したネットワークインターフェースはsudo ip link show | grep vethで確認できる。

ハガユウキハガユウキ

作成したvethインターフェイスは、2つのネットワークインターフェイスが一対(ペア)になって機能します。これは、片方のネットワークインターフェイスにパケット2が入ると、もう片方から出てくるという特性があるためです。

momijiame. Learning TCP/IP networking by exercise on Linux (Japanese Edition) (p. 70). Kindle Edition.

ハガユウキハガユウキ

Named Spaceで作ったノードは、ネットワークインターフェースを使えば、ネットワークに属すことができる。

ハガユウキハガユウキ

ip netns exec <名前> <コマンド>:指定した名前空間内で別のコマンドを実行します。

ハガユウキハガユウキ

docekrじゃこのコマンド実行できなかった。大人しく仮想環境作るか。

ハガユウキハガユウキ

brew caskは、Homebrewをさらに拡張し、GUIアプリケーションやデスクトップアプリケーションのインストールを簡単に行うためのコマンド。

ハガユウキハガユウキ

ハイパーバイザ

  • ハイパーバイザーとは、 物理的なマシンの中に、仮想的なコンピュータを作り出し、実行するためのコンピュータのこと。代表例として、Virtual Boxなど。

Vagrant(ベイグラント)

Vagrantとは仮想マシンをCLIで管理するためのツールである。

ハガユウキハガユウキ
vagrant version
Installed Version: 2.3.7
Latest Version: 2.3.7

You're running an up-to-date version of Vagrant!

# ubuntuの仮想マシンのイメージをダウンロードする
vagrant box add ubuntu/focal64

# vagrantに仮想マシンのイメージが登録されたことがわかる。
vagrant box list
ubuntu/focal64 (virtualbox, 20230719.0.0)

# 登録したイメージを指定して、仮想マシンの設定ファイル作成する
vagrant init ubuntu/focal64

# 設定ファイルのあるディレクトリでこのコマンドを実行すると、仮想マシンが起動する
vagrant up

# 仮想マシンが起動するとrunnningになる
vagrant status
Current machine states:

default                   running (virtualbox)

# 仮想マシンには以下のコマンドでログインできる
vagrant ssh

# 次のコマンドで操作対象がubuntuであることが分かる。
lsb_release -a

# 仮想マシンを使わないときはシャットダウンしておく
vagrant halt


https://psc-smartwork.com/topics/2021/08/162.html

ハガユウキハガユウキ

vethのネットワークインターフェースをNetwork Namespaceに移す
これでvethのネットワークインターフェースがNetwork Namespaceで使えるようになった。

sudo ip link set ns1-veth0 netns ns1
sudo ip link set ns2-veth0 netns ns2
ハガユウキハガユウキ

移すと、sudo ip link show | grep vethで移したvethネットワークインターフェースが見えなくなる。
代わりに、それぞれのNetworkNamespaceにvethインターフェイスが移動している。これでNetworkNamespace同士がvethインターフェイスのペアを通してつながる。

vagrant@ubuntu-focal:~$ sudo ip netns exec ns1 ip link show | grep veth
8: ns1-veth0@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
vagrant@ubuntu-focal:~$ sudo ip netns exec ns2 ip link show | grep veth
7: ns2-veth0@if8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
vagrant@ubuntu-focal:~$
ハガユウキハガユウキ

vethインターフェースにIPアドレスを付与する。そうするとノードたちはIPプロトコルで通信できる。
ネットワークインターフェイスにIPアドレスを設定するにはip address addサブコマンドを使う。

vagrant@ubuntu-focal:~$ sudo ip netns exec ns2 ip address add 192.0.2.2/24 dev ns1-veth0
Cannot find device "ns1-veth0"
vagrant@ubuntu-focal:~$ sudo ip netns exec ns2 ip address add 192.0.2.2/24 dev ns2-veth0
ハガユウキハガユウキ

ネットワークインターフェースは状態を持っていて、デフォルトではDOWN。使うにはUPにしないといけない。

vagrant@ubuntu-focal:~$ sudo ip netns exec ns1 ip link show ns1-veth0 | grep state
8: ns1-veth0@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
vagrant@ubuntu-focal:~$ sudo ip netns exec ns2 ip link show ns2-veth0 | grep state
7: ns2-veth0@if8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
vagrant@ubuntu-focal:~$ sudo ip netns exec ns1 ip link set ns1-veth0 up
vagrant@ubuntu-focal:~$ sudo ip netns exec ns2 ip link set ns2-veth0 up
vagrant@ubuntu-focal:~$
ハガユウキハガユウキ
vagrant@ubuntu-focal:~$ 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
8: ns1-veth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 62:9d:14:4c:32:6d 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
    inet6 fe80::609d:14ff:fe4c:326d/64 scope link
       valid_lft forever preferred_lft forever
vagrant@ubuntu-focal:~$

たしかに、network namespaceってネットワークを独立させつつ、そこにノードを作る感じがするな。でも今回の場合は、同じネットワークに所属させつつ、別のノードを作った感じか。

ハガユウキハガユウキ

同じネットワークに所属している

上の2つのNetwork Namespaceの場合、同じネットワークに所属しているので、ルータがなくても通信できる。逆にいえばルータが必要になるのはネットワークが違う相手と通信したいときだけ。より一般的な言い方をすれば、異なるネットワーク同士をつなぐためにルータが存在します。

ネットワーク図の物理バージョンと論理バージョン

コンピュータ同士をLANケーブルで繋いだだけだと、通信できない。ネットワークインターフェースにiPアドレスを付与しないと通信できない。 ネットワークを使えるようにするには、物理的な配線をどのように扱うかを論理的に設定する必要がある。そのため、ネットワークの構成も物理的なものと論理的なものを分けて扱うことが一般的である。

物理的なネットワークは、実際のネットワークデバイス(コンピュータ、スイッチ、ルータ、ハブなど)が物理的なケーブルやワイヤレス接続を介して接続されている実体を指す。
一方、論理的なネットワークは、IPアドレスやサブネットマスク、ルーティングテーブル、仮想LAN(VLAN)、VPN(仮想プライベートネットワーク)などの設定によって定義される仮想的な関係を指します。論理的なネットワークは物理的なネットワークの上に構築される。

ハガユウキハガユウキ

つまり、物理的に構築されたネットワークの上で論理的なネットワークを構築することによって、ネットワークが完成する。

ハガユウキハガユウキ

よくホストにIPアドレスが付与されているっていうけど、厳密にはネットワークインターフェースにIPアドレスが付与されている。

正確にはホストにIPアドレスが付与されているのではなく、ネットワークインターフェース(Network Interface)にIPアドレスが付与されている。ホスト(コンピュータ)がネットワークに接続されるためには、少なくとも1つ以上のネットワークインターフェースが必要であり、それぞれのネットワークインターフェースに対してIPアドレスが設定される。

ネットワークインターフェース

ネットワークインターフェースは、コンピュータとネットワーク媒体(有線または無線接続)を接続するための機器であり、データを送受信するためのインターフェースです。ネットワークインターフェースは、ネットワークカード(NIC:Network Interface Card)などのネットワークデバイスを指します。
要は、コンピュータがネットワークに接続するには、ネットワークインターフェースが必要だと覚えれば良い。

ホストが複数のネットワークインターフェースを持つ場合、それぞれのインターフェースに異なるIPアドレスが割り当てられることがある。このようにして、1つのホストが複数のネットワークに参加したり、複数のサービスを提供したりすることができる。

ハガユウキハガユウキ

ルーターがローカルのネットワークに接続する際、ネットワークインターフェースを使う。

ルーターは複数のネットワークを相互に接続し、パケットの転送やルーティングを行うためのネットワークデバイスです。ルーターには少なくとも2つ以上のネットワークインターフェースが搭載されています。各ネットワークインターフェースは、異なるネットワークに接続されており、 それぞれのインターフェースには固有のIPアドレスが割り当てられています。具体的にはWANで一意に識別するためのグローバルIPアドレスと、LANで一位に識別するためのIPアドレス

ハガユウキハガユウキ

なんでサーバーがipアドレスを持つって間違った認識が広まってしまったんやろう。それだと、異なるネットワークに所属できないやんってなるし。

ハガユウキハガユウキ

IPアドレスのネットワーク部とホスト部の境目を示す方法として、CIDR表記とサブネットマスクがある

個人的にはCIDR表記のが好き。

セグメントとは、ネットワークやサブネットのこと

ハガユウキハガユウキ

ルータを増やしてみる。

Network Namespaceの仕組みを使って、ルータを増やしてみる。

ハガユウキハガユウキ

このネットワークを作るためには、

  1. Network Namespaceをノードの分だけ作る
  2. ノードとノードを接続するLANケーブルの役割を表すvethのネットワークインターフェースを作る(ここがややこしいけど、vethのネットワークインターフェースはセットでLANケーブルを表す。ネットワークの物理的な構成を考えれば分かる)
  3. vethのネットワークインターフェースをそれぞれNetwork Name spaceの環境に移す。
  4. vethインターフェースにIPアドレスを付与する。そうするとIPプロトコルで通信できる。
  5. ネットワークインターフェースの状態をDOWNからUPにする
ハガユウキハガユウキ

ルーター2つのネットワークインターフェースを通して、2つのネットワーク内のホストと接続できる
ホストのルートテーブルにデフォルトルートを指定しないと、ルーターに飛ばないわ。デフォルトルートがない場合、別のネットワークのIPアドレスを指定すると、ルータに飛ぶように設定できないやん。

ハガユウキハガユウキ
vagrant@ubuntu-focal:~$ 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

今の状態だと、同じネットワーク内でしか通信できないな。pingコマンドでこのネットワークに所属していないIPアドレスを指定すると、ルートテーブルに該当するルーティングエントリがないから「到達できないよ」ってエラーが返ってくるだけ。だから、ホストのルートテーブルにデフォルトルートのルーティングエントリを作る。そのデフォルトルートのnext popにrouterを指定する

ハガユウキハガユウキ

ルートテーブルにルーティングエントリを追加するには、ip route addコマンドを使う。
デフォルトルートをホストのルートテーブルに追加しなくても、直接宛先のIPアドレスとネクストポップにrouterを指定したルーティングエントリをホストのルートテーブルに追加するでも通信できる。しかしこの場合だと、異なるネットワークのホストに接続するにはまたホストのルートテーブルにルーティングエントリを追加しないといけない。なので、デフォルトルートを追加した方が良い。

sudo ip netns exec ns1 ip route add default via 192.0.2.254
ハガユウキハガユウキ

ルーターにこの設定をすると、ルーターがバケツリレーをするようになって、pingができるようになる
sysctlはカーネルのパラメータを設定するためのコマンド。 パケットを処理するプロトコルスタックも一般的にはカーネルの中にある。カーネルのnet.ipv4.ip_forwardというパラメータに1を指定した。このパラメータは、LinuxにおいてIPv4のルータとして動作するかを決めるパラメータである。というのも、Linuxはこのパラメータが有効になっていないとルータとして動作しない。

momijiame. Learning TCP/IP networking by exercise on Linux (Japanese Edition) (p. 104). Kindle Edition.

sudo ip netns exec router sysctl net.ipv4.ip_forward=1
ハガユウキハガユウキ

ルータのネットワークインターフェイスに付与するIPアドレスは、特にこれを使うという決まりはないが、一般的にはネットワークの先頭または末尾のIPアドレスを使うことが多い。.254を指定した。

ハガユウキハガユウキ

ブロードキャストアドレス

ブロードキャストアドレスは、IPアドレスの末尾が.256のIPアドレス。特殊なIPアドレスで、ネットワークインターフェースに付与できない。ブロードキャストアドレスはそのネットワーク所属しているすべてのノードに対して通信したいときに、宛先として指定する。ネットワークアドレスとブロードキャストアドレスはホストのネットワークインターフェイスに対して付与できないので注意。

ハガユウキハガユウキ

間に複数のルータが存在する状態で通信を成功させる

ルーター自身が持つルートテーブルには、接続しているネットワークに所属しているすべてのホストにアクセスできるルーティングエントリが存在する。難しいのが2つのルーターを経由して、あるネットワークに所属するホストにアクセスする場合、どうするかって話。ルーターから見ても直接繋がっていないネットワークが存在する

ハガユウキハガユウキ

実装

# ノードの数だけNamed Spaceを作る
vagrant@ubuntu-focal:~$ sudo ip netns delete ns1
vagrant@ubuntu-focal:~$ sudo ip netns add ns1
vagrant@ubuntu-focal:~$ sudo ip netns add ns2
vagrant@ubuntu-focal:~$ sudo ip netns add router1
vagrant@ubuntu-focal:~$ sudo ip netns add router2

# vethネットワークインターフェースを作る
vagrant@ubuntu-focal:~$ sudo ip link add ns1-veth0 type veth peer name gw1-veth0
vagrant@ubuntu-focal:~$ sudo ip link add gw1-veth1 type veth peer name gw2-veth0
vagrant@ubuntu-focal:~$ sudo ip link add gw2-veth1 type veth peer name ns2-veth0

# vethネットワークインターフェースをNamed Spaceの環境に移す
# これでvethのネットワークインターフェースがNetwork Namespaceで使えるようになる
vagrant@ubuntu-focal:~$ sudo ip link set ns1-veth0 netns ns1
vagrant@ubuntu-focal:~$ sudo ip link set ns2-veth0 netns ns2
vagrant@ubuntu-focal:~$ sudo ip link set gw1-veth0 netns router1
vagrant@ubuntu-focal:~$ sudo ip link set gw1-veth1 netns router1
vagrant@ubuntu-focal:~$ sudo ip link set gw2-veth0 netns router2
vagrant@ubuntu-focal:~$ sudo ip link set gw2-veth1 netns router2

 # vethインターフェースにIPアドレスを付与する。そうするとノードたちはIPプロトコルで通信できる。
# vethインターフェースにIPアドレスを付与したときに、ipアドレスのネットワーク部を決める必要があるから、ネットワークも勝手に決まる。作られるというか。
# devはLinuxコマンドにおいて、ネットワークインターフェースを指定するためのオプションである。
vagrant@ubuntu-focal:~$ sudo ip netns exec ns1 ip address add 192.0.2.1/24 dev ns1-veth0
vagrant@ubuntu-focal:~$ sudo ip netns exec ns2 ip address add 198.51.100.1/24 dev ns2-veth0
vagrant@ubuntu-focal:~$ sudo ip netns exec router1 ip address add 192.0.2.254/24 dev gw1-veth0
vagrant@ubuntu-focal:~$ sudo ip netns exec router1 ip address add 203.0.113.1/24 dev gw1-veth1
vagrant@ubuntu-focal:~$ sudo ip netns exec router2 ip address add 203.0.113.2/24 dev gw2-veth0
vagrant@ubuntu-focal:~$ sudo ip netns exec router2 ip address add 198.51.100.254/24 dev gw2-veth1

# ネットワークインターフェースは状態を持っているので、UPにする
vagrant@ubuntu-focal:~$ sudo ip netns exec ns1 ip link set ns1-veth0 up
vagrant@ubuntu-focal:~$ sudo ip netns exec ns2 ip link set ns2-veth0 up
vagrant@ubuntu-focal:~$ sudo ip netns exec router1 ip link set gw1-veth0 up
vagrant@ubuntu-focal:~$ sudo ip netns exec router1 ip link set gw1-veth1 up
vagrant@ubuntu-focal:~$ sudo ip netns exec router2 ip link set gw2-veth0 up
vagrant@ubuntu-focal:~$ sudo ip netns exec router2 ip link set gw2-veth1 up

# ns1とns2にデフォルトルートを追加する。
vagrant@ubuntu-focal:~$ sudo ip netns exec ns1 ip route add default via 192.0.2.254
vagrant@ubuntu-focal:~$ sudo ip netns exec ns2 ip route add default via 198.51.100.254

# ルーターのノードをルーターとして機能させる
# ルーターにこの設定をすると、ルーターがバケツリレーをするようになって、pingができるようになる
sudo ip netns exec router1 sysctl net.ipv4.ip_forward=1
sudo ip netns exec router2 sysctl net.ipv4.ip_forward=1
ハガユウキハガユウキ

上の設定で実行するとこのエラーが出る。
ns1からns2のIPアドレスに向けてpingを打ったのに、ICMPのメッセージがrouter1のIPアドレスから届いている。

vagrant@ubuntu-focal:~$ sudo ip netns exec ns1 ping -c 3 198.51.100.1 -I 192.0.2.1
PING 198.51.100.1 (198.51.100.1) from 192.0.2.1 : 56(84) bytes of data.
From 192.0.2.254 icmp_seq=1 Destination Net Unreachable
From 192.0.2.254 icmp_seq=2 Destination Net Unreachable
From 192.0.2.254 icmp_seq=3 Destination Net Unreachable

--- 198.51.100.1 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2039ms

Destination Net Unreachableは、経路の途中でルーターがパケットを目的地まで送り届けることができなかったことを示している。原因はルーターを増やしたこと。今回のネットワーク構成では、ルータが直接繋がっていないネットワークがある。router1は198.51.100.1宛のパケットを受け取ったものの、次に渡す相手が分からない(router2が198.51.100.1宛に届けてくれるって保証がないから、router2にはパケットを渡せない)。ルーターは隣接しているネットワークにいるノードにしかパケットを出せない。なるほどね

ハガユウキハガユウキ

この問題を解決するにはルーターのルートテーブルにもルーティングエントリを追加する必要がある。

sudo ip netns exec router1 ip route add 198.51.100.0/24 via 203.0.113.2
sudo ip netns exec router2 ip route add 192.0.2.0/24 via 203.0.113.1
ハガユウキハガユウキ

できた!

vagrant@ubuntu-focal:~$ sudo ip netns exec ns1 ping -c 3 198.51.100.1 -I 192.0.2.1
PING 198.51.100.1 (198.51.100.1) from 192.0.2.1 : 56(84) bytes of data.
64 bytes from 198.51.100.1: icmp_seq=1 ttl=62 time=0.070 ms
64 bytes from 198.51.100.1: icmp_seq=2 ttl=62 time=0.173 ms
64 bytes from 198.51.100.1: icmp_seq=3 ttl=62 time=0.147 ms

--- 198.51.100.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2057ms
rtt min/avg/max/mdev = 0.070/0.130/0.173/0.043 ms
vagrant@ubuntu-focal:~$ sudo ip netns exec ns2 ping -c 3 192.0.2.1 -I 198.51.100.1
PING 192.0.2.1 (192.0.2.1) from 198.51.100.1 : 56(84) bytes of data.
64 bytes from 192.0.2.1: icmp_seq=1 ttl=62 time=0.119 ms
64 bytes from 192.0.2.1: icmp_seq=2 ttl=62 time=0.331 ms
64 bytes from 192.0.2.1: icmp_seq=3 ttl=62 time=0.321 ms

--- 192.0.2.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2041ms
rtt min/avg/max/mdev = 0.119/0.257/0.331/0.097 ms
vagrant@ubuntu-focal:~$
ハガユウキハガユウキ

routerは結局隣り合うネットワークに存在するノードにしかパケットを送れない。ルーター1がルーター2のことをあまりにも知っていればルーター1はルーター2へパケットをくるけど、ルーター1はルーター2が目的地のネットワークと繋がっていることを知らないからどこに送れば良いか迷う。なので、目的地のネットワークへのルートをルーター1のルートテーブルに追加してネクストポップにルーター2を指定する。そうすれば、ルーター1はルーター2へパケットを送れる

ハガユウキハガユウキ

物理的に構築されたネットワークの上で論理的なネットワークを構築することによって、ネットワークが完成する。

ChatGPTに聞いてみた

ネットワークを論理と物理の観点から説明します。
論理的なネットワーク(Logical Network)
論理的なネットワークは、データ通信のために論理的に定義された仮想的なネットワークです。論理ネットワークは、IPアドレスやサブネット、ルーティングテーブルなどの設定によって形成されます。これらの設定によって、ネットワークデバイスが論理的に接続され、データの転送と通信が可能になります。
論理的なネットワークは、特定のルールとプロトコルに基づいて動作します。例えば、IPアドレスはインターネット上のデバイスを一意に識別し、ルーティングテーブルはデータの最適な経路を決定するために使用されます。論理的なネットワークは物理的な構成に依存せず、論理的な設定や接続を変更することで、ネットワークの構造を柔軟に変更することができます。
物理的なネットワーク(Physical Network)
物理的なネットワークは、実際のネットワークインフラストラクチャやデバイスを指します。これには、ネットワークケーブル、スイッチ、ルータ、ネットワークカード、ハブなどが含まれます。物理的なネットワークは、データの物理的な転送とネットワークデバイスの接続を管理します。
物理的なネットワークは、データ通信において物理的な制約や性能に影響を与えます。たとえば、ケーブルの長さや帯域幅、ネットワークデバイスの性能などが、データの転送速度や信頼性に影響を与えます。物理的なネットワークの設計や構成は、データ通信の効率性やパフォーマンスに大きく影響を与える重要な要素となります。
論理的なネットワークと物理的なネットワークは相互に関連しており、論理的なネットワークは物理的なネットワーク上に構築されます。論理的なネットワークの設定は、物理的なネットワーク上のデバイスやリソースとの組み合わせによって実現されます。物理的なネットワークの設計は、論理的なネットワークをサポートするために適切なネットワークインフラストラクチャを提供する役割を果たします。

ハガユウキハガユウキ

ネットワークを構築するには、物理的なデバイスからなる物理的なネットワークを構築するのと、物理的なネットワークの上に論理的なネットワークを構築する必要がある。

ハガユウキハガユウキ

そうか、コンピュータ同士が通信して異なる情報にアクセスするためにネットワークが存在するのか。わかってきた。

ハガユウキハガユウキ

devはLinuxコマンドにおいて、ネットワークインターフェースを指定するためのオプションである。

ハガユウキハガユウキ

ip linkコマンド

ip linkコマンドは、Linuxシステムにおいてネットワークインターフェース(Network Interface)を管理するためのコマンドである。ネットワークインターフェースは、コンピューターとネットワークの物理的な接続を表します。要はネットワークインターフェースがあるから、コンピュータがネットワークに接続することができる。

ハガユウキハガユウキ

ip linkコマンドの主なサブコマンド

ip link show:システム上のすべてのネットワークインターフェースの一覧を表示します。インターフェースの名前、状態、MACアドレス、MTU(Maximum Transmission Unit)、接続タイプなどが表示されます。また、ネットワークインターフェース名を指定すると、そのネットワークインターフェースの情報だけ見れる。

ip link set:指定したネットワークインターフェースの設定を変更します。例えば、インターフェースの有効化や無効化、MTUの変更、MACアドレスの変更などを行えます。

ip link add:新しいネットワークインターフェースを作成します。物理的なインターフェース、VLANインターフェース、仮想的なタンプインターフェースなどの作成が可能です。

ip link delete:指定したネットワークインターフェースを削除します。

ip link showtype:サポートされているネットワークインターフェースのタイプ(例:vlan、veth、bridgeなど)を表示します。

ハガユウキハガユウキ

サブコマンド

サブコマンド(Subcommand)は、コンピューターやプログラム内で主要なコマンドの下に配置される、より具体的なコマンドや操作のことを指す。プログラムが多くの機能を持つ場合、それらの機能を組織化して管理するためにサブコマンドが使用される。

主要なコマンド サブコマンド [オプション] [引数]

例えば、gitコマンドのサブコマンドはaddやcommit, pullやpushなどがある。これらのサブコマンドは、gitコマンドのプログラムが多くの機能を持つから、それらの機能を組織化して管理するために作られる。

ハガユウキハガユウキ

サブコマンドを使用することで、1つのプログラムで複数の機能を効率的に管理できるため、コマンドラインインターフェース(CLI)やプログラムの使いやすさが向上する。

ハガユウキハガユウキ

ip routeコマンド

ip routeコマンドは、Linuxシステムにおいてネットワークルーティングテーブルを管理するためのコマンドである。

ハガユウキハガユウキ

pingコマンドの-Iオプション

pingコマンドは送信元のIPアドレスは指定しなくても良い。明示的に指定したいときは-Iオプションを使う。
-Iはinterfaceの略。このオプションを使用すると、特定のネットワークインターフェースのipアドレスをpingコマンドの送信元のipアドレスとして指定できる。

デフォルトでは、pingコマンドはデフォルトのネットワークインターフェースを使用して送信元のIPアドレスを決定します。しかし、複数のネットワークインターフェースがある場合、送信元のIPアドレスを特定のインターフェースに固定したい場合などに、-Iオプションを使って明示的にネットワークインターフェースを指定することができます。

ハガユウキハガユウキ

ブロードバンドルーター

ブロードバンドルータは、ルータの中でもインターネット接続を前提として販売されている機器です。 実際に使用するときイメージとしては「インターネット」と「自宅や会社のLAN」という2つのネットワークを接続するための機器と考えるとよいでしょう。

https://www.aibsc.jp/joho/otasuke_m/basic/06/04.html#:~:text=ブロードバンドルータとは&text=ブロードバンドルータは、ルータの,考えるとよいでしょう。

ハガユウキハガユウキ

人間が手でルーティングエントリを追加するような方式をスタティックルーティング(静的経路制御)と呼ぶ。家庭のブロードバンドルーターでは通常スタティックルーティングが使われている。ブロードバンドルーターではそこら辺の設定を自動でやってくれるから、やる機会はないそう。

ハガユウキハガユウキ

もう一つのやり方としては、ルーター同士が自律的に自身の知っているルーティング情報を教え合うダイナミックルーティングがある。ルーティング情報の交換にはBGP(Border Gateway Protocol)やOSPF(Open Shortest Path First)などの専用のプロトコルが用いられる。

ハガユウキハガユウキ

インターネットでは、前述したBGPを使って組織間のルーティング情報を交換するのが標準になっている。なぜなら、インターネットはさまざまな組織のネットワークが有機的につながりあってできているからである(全世界のルータのルーティングを手動で設定するのも現実的ではないし)。つまり、インターネットはネットワークのネットワークと言える

ハガユウキハガユウキ

インターネットがネットワークのネットワークっていうのはなんかわかりやすいな。ネットワークは複数のノードが接続することでできているので、それのネットワーク版と考えると分かりやすい。

ハガユウキハガユウキ

規模は小さいが、この章で学んだネットワークの振る舞いはインターネットで実際に行われていることの本質を示している

このスクラップは2023/07/26にクローズされました