(メモ) Linux 上での IP アドレスのネットワークインターフェースへのディスパッチ

VPN 内部の環境で Vagrant を立ち上げて、 docker-engine (のブリッジ) を作成し、さらに 複数個 vagrant のネットワークを増やしてみる。(e.g. public_network 追加) をやる。すべてそれを１台の仮想マシンで。

とかやっていると、いつの間にか仮想マシンのネットワークインターフェースがいくつも作られていて、たまにそれが悪さをしたりしなかったりなどするので、挙動を調べてみようと思い立った。

手始めに、どの IP アドレスを利用したらどのネットワークインターフェースからでていくのか。

# 1 ネットワークインターフェースの調べ方

```shell-session
% ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:ff:49:93:fa  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth0      Link encap:Ethernet  HWaddr 08:00:27:c3:24:cc  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fec3:24cc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:94961 errors:0 dropped:0 overruns:0 frame:0
          TX packets:54149 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:75648185 (75.6 MB)  TX bytes:4916555 (4.9 MB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:77:37:fa  
          inet addr:192.168.33.10  Bcast:192.168.33.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe77:37fa/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4445 errors:0 dropped:0 overruns:0 frame:0
          TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1007418 (1.0 MB)  TX bytes:1934 (1.9 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:888 (888.0 B)  TX bytes:888 (888.0 B)
```

-> inet_addr が、そのネットワークインターフェースに紐付いている IP.

# 2 どのネットワークインターフェースが使われる？

```
if IP belongs to NetworkInterface IPs; then
  consume the ip locally.
else
  (gateway, Networkinterface) is obtained.
    -> refer: `route` command.
  Send the IP request to the gateway via Networkinterface.
fi
```

ネットワークインターフェースの IP が指定されていたら、それは自身が即座に利用する。 (127.0.0.1 (aka localhost) -> ローカルに接続 はこれで実現)

そうでなかった場合には、 IP routing なるものが存在しているので、それを元に最初に LAN 内部でリクエストを飛ばすべき機器を取得し、そこへ向かってリクエストを投げる。 (デフォルトゲートウェイと呼ばれているものがこれ。つまりはルータ)

```shell-session
$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 docker0
192.168.33.0    *               255.255.255.0   U     0      0        0 eth1
```

# 3 で、それを知ると何が嬉しいの？

`arp-scan` とか、 LAN 内部の IP 一覧を指定したい時とか、次みたく実行する。

```shell-session
arp-scan --interface eth2 --localnet
```

例えば、 それぞれの eth が繋がっている先は違うので上記コマンドとかは違う結果が返ってくる。 (vagrant のネットワークを複数個定義した上で遊ぶと何かわかる。かも)