Kotaro7750's diary

低レイヤを中心とした技術ブログ、たまに日記

Linuxにおけるネットワークインターフェースについて

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

コンピュータがネットワーク上にある他のコンピュータと通信する際に、パケットをやり取りする「境界」となるリソースでがネットワークインターフェースです。 「パケット」と書いたように、通常一つのインターフェースに対して一つのIPアドレスが割り振られます。

いまいちイメージがわかないかもしれませんが、コンピュータの裏にある、LANポートを想像するとわかりやすいかもしれません。

物理NIと仮想NI

物理NIとは、NIを物理的に実装したもので、前述のLANポートがついているボードが物理NIC(Network Interface Card)です。 それに対し、仮想NIとは物理NIを抽象化したもので、通常OSが作成します。最近のコンピュータでは、一つの物理NICしか搭載していないにもかかわらず、複数のNIを保有しているように見えます。 これはこの機能によるものです。

以下では仮想NIのことをNIと呼ぶことにします。

NIの種類

前項で複数のNIが存在していると言いましたが、どのような種類があるのか見てみます。 下にifconfigコマンドの実行結果の一部を載せます。 ifconfigコマンドはnetwork interface configurationの略で、オプション無しで実行すると、仮想NIを表示してくれます。

denjo@DJ00092/INS> ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:0a:55:e9:55  txqueuelen 0  (イーサネット)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (ローカルループバック)
        RX packets 32314  bytes 2989566 (2.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 32314  bytes 2989566 (2.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 10.8.0.22  netmask 255.255.255.255  destination 10.8.0.21
        inet6 fe80::81e6:710c:4a6f:e796  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (不明なネット)
        RX packets 21  bytes 6323 (6.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 307  bytes 17636 (17.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlp5s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.71  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::657c:c1c1:f1cc:d9a1  prefixlen 64  scopeid 0x20<link>
        ether 20:79:18:54:e7:a5  txqueuelen 1000  (イーサネット)
        RX packets 1831222  bytes 1941088076 (1.9 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 765585  bytes 137548363 (137.5 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

このパソコンにはおそらくWiFi用のNICと、有線LAN用のNICしかないので物理的な限界を超えてNIが作られていることがわかります。

docker0

これはdocker用のNIです。dockerはそれぞれのコンテナがIPアドレスを持っているように振る舞うので、コンテナとホストの通信のためにこのNIが必要になってきます。

lo

inetという部分を見るとわかるように、これはループバック用のNIです。その他のNIとは異なり、OSが起動していれば存在し、外のネットワークの影響を受けないため自分自身に対する疎通確認などに使われます。

tun0

ifconfigをVPN接続中に実行したので、VPN用のNIであるtunが入っています。これはtunnelの略であり、実際のアドレスとは異なるアドレスを用いるルーティング方式でのVPN用であることがわかります。

wlps0

wlps0は、WiFi接続用のNIです。IPアドレスを見るとわかりますが、実際にインターネット等に接続する際のNIはこれであると推測されます。 これはWiFi接続をしているコンピュータなら、名前は違えど大体のコンピュータに共通のNIだと思います。

上で上げた以外にも、イーサネット用のNIであるeth0や、仮想マシン用のNIであるVirbr0などがあります。