Linux ネットワーク

LPIC 学習記録として

# 用語

## ソケット

[`$ netstat`](#-netstat) で表示されるソケット情報の「ソケット」とは、プロセス間通信（**IPC**: Inter-Process Communication）を行うためのエンドポイント（接続点）を指す。

具体的には **IPアドレス** + **ポート番号（プロトコル）** の組み合わせがソケットとして定義されることが多い。

Linux では `/proc/` ディレクトリの [仮想ファイル](https://qiita.com/AsahinaKei/items/09ee7ce55b1a0be01ff0#%E4%BB%AE%E6%83%B3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0) として管理される。

## デフォルトゲートウェイ

パケットの宛先がルーティングテーブル中で見つからない場合に使用される送信先。

ルーティングテーブル `destination` が `0.0.0.0` として設定される。 

## NetworkManager

ネットワーク設定を簡単に管理するための [デーモン](https://qiita.com/AsahinaKei/items/e354a3814639aeac4138#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9--%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3)。

無線 LAN、イーサネット接続、VPN など、さまざまなネットワークインターフェースを [`$ nmcli`](#-nmcli) によって統合して管理できる。

## DISCARD

ネットワーク機器やソフトウェアのテストやデモ用途で使用されるプロトコル。

ポート番号は `9`。

送信されたデータをそのまま捨て（discard）、レスポンスは一切返さない。

送信処理が正常にできているかだけを確認したいとき（受信結果は無視）や、パケットを大量に送り、スループット（一定時間内に処理できる量）を測定したい時などに利用される。

# 設定ファイル

## `/etc/services`

ポート番号と [サービス](https://qiita.com/AsahinaKei/items/e354a3814639aeac4138#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9--%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3) の対応関係が記述されたファイル。

[ポート番号](https://qiita.com/AsahinaKei/items/627f0076fecc107ac686#transport-%E5%B1%A4%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88) はコンピュータ（ホスト）内でアプリケーションを識別するために使用される。

```console:エントリ
サービス  ポート番号/プロトコル  別名
```

```conf:/etc/services
tcpmux		1/tcp
echo		7/tcp
echo		7/udp
discard		9/tcp		sink null
discard		9/udp		sink null
systat		11/tcp		users
daytime		13/tcp
daytime		13/udp
netstat		15/tcp
...
```

別名はスペース区切りで複数定義することができる。

`sink` や `null` は [DISCARD](#discard) プロトコルの別名。

## `/etc/hostname`

自身のマシンの持つホスト名が記述された設定ファイル。

マシンに対して １ つしか存在しないため、`/etc/hosts` で設定されるホスト名、別名と区別して canonical hostname （正規ホスト名）と表現されることがある。

ホスト名はネットワーク上で通信相手を識別するために利用される。

```conf:/etc/hostname
my_server
```
[`$ hostname`](#-hostname) で変更することができる。

## `/etc/hosts`

IP アドレスとホスト名の対応関係が記述された設定ファイル。

`/etc/hostname` と異なり、自身のホスト以外の情報も含まれている。

小規模なネットワークにおける名前解決に利用されるが、管理に手間がかかるため、大規模なネットワークでは [DNS](https://qiita.com/AsahinaKei/items/aa97c398e832d9a22e92) が利用される。

```conf:/etc/hosts
127.0.0.1 localhost
127.0.1.1 my_server

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
```

## `/etc/hosts.allow` / `/etc/hosts.deny`

**TCP Wrappers** と呼ばれるアクセス制御システムで使用される設定ファイル。

特定の [サービス](https://qiita.com/AsahinaKei/items/e354a3814639aeac4138#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9--%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3) に対する接続を許可または拒否するために使用される。

```conf:/etc/hosts.allow, /etc/hosts.deny
サービス名: ホスト
サービス名: IPアドレス
```

`/etc/hosts.allow` が読み込まれた後に `/etc/hosts.deny` が読み込まれる。どちらにも記載がないものは **許可** になる。

そのため許可するものを `/etc/hosts.allow` に記載しておき、`/etc/hosts.deny` では全てを拒否対象としておく設定が一般的。

```conf:全てを拒否対象にする（/etc/hosts.deny）
ALL: ALL
```

## `/etc/network/interfaces`

Debian 系のディストリビューションにおけるネットワークのインターフェース設定ファイル。

IP アドレスに関わる設定やデフォルトゲートウェイなどの設定が行われる。

## `/etc/sysconfig/network-scripts/`

Red Hat 系ディストリビューションにおけるネットワークの設定ファイルが配置されたディレクトリ。


## `/etc/resolv.conf`

参照先の [DNS](https://qiita.com/AsahinaKei/items/aa97c398e832d9a22e92) サーバの設定ファイル。

```conf:/etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
search example.com
options timeout:1 attempts:2
```

DHCP や [NetworkManager](#networkmanager) が自動的にファイルを更新するため、手動で変更しても上書きされることがある。

**`nameserver`**

使用する DNS サーバを指定する。

```conf
nameserver 8.8.8.8
nameserver 8.8.4.4
```

このように複数設定した場合は上から順に使用される。

**`domain`**

ローカルドメイン名を指定する。ドメインを含まないホスト名を検索する場合に検索対象となる。
`domain` と `search` はどちらか一方しか設定することはできず、両方が記述された場合、より下に記述された設定が使用される。

```conf
domain example.com
```

**`search`**

検索対象のドメインをリスト形式で記述する。
`search` を設定しておくと、ホスト名以降のドメイン（ドット `.` 以降の部分）が無くても、補完して名前解決をしてくれる。例えば `example` というホスト名を解決しようとしたとき、`example.com` や `example.local` をサーチドメインに設定しておくことでこれらのドメインが検索対象に追加される。

```conf
search example.com example.local
```

と設定しておくと、`example` というホスト名に対して、まず `example.com` が、次に `example.local` の名前解決を試みることになる。

**`options`**

タイムアウト時間や最大再試行回数などの DNS クエリに関する設定を追加する。

## `/etc/nsswitch.conf`
Name Service Switch

名前解決の順序を制御する設定ファイル。

例えば、ホスト名を名前解決する際に、最初に [`/etc/hosts`](#etchosts) ファイルを確認し、その後 DNS サーバに問い合わる、などの順序が設定できる。

`files` となっている項目は、ローカルファイルが最初に検索対象になる。

```conf:/etc/nsswitch.conf
passwd:         files systemd
group:          files systemd
shadow:         files systemd
gshadow:        files systemd

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis
```

**`passwd`**

ユーザ情報に関する設定。
ユーザ名をユーザ ID（**UID**）へ変換する際に利用される。

```conf
passwd:         files systemd
```

となっていた場合、最初に `files`（[`/etc/passwd`](https://qiita.com/AsahinaKei/items/59c380a98c65d0aef887#etcpasswd)）、次に [systemd](https://qiita.com/AsahinaKei/items/e354a3814639aeac4138#systemd) が検索される。

**`group`**

グループ情報に関する設定。
グループ名をグループ ID（**UID**）へ変換する際に利用される。

**`shadow`**

ユーザーのパスワード情報に関する設定。
ユーザーのパスワードが格納されたファイルを指定する。
`files` は [`/etc/shadow`](https://qiita.com/AsahinaKei/items/59c380a98c65d0aef887#etcshadow) のこと。

**`hosts`**

ホスト名解決に関する設定。
ホスト名（`hostname`）を IP アドレスに変換する際に利用される。

```conf
hosts:          files dns
```

となっていた場合、ホスト名を解決する際は [`/etc/hosts`](#etchosts) ファイル → DNS サーバの順に検索が行われる。

## `/etc/systemd/resolved.conf`

[systemd](https://qiita.com/AsahinaKei/items/e354a3814639aeac4138#systemd) の サービスの一つである `systemd-resolved.service` で DNS 名前解決に利用される設定ファイル。

[`/etc/resolv.conf`](#etcresolvconf) に依存しない仕組みになっている。

```conf:/etc/systemd/resolved.conf
[Resolve]
#DNS=
#FallbackDNS=
#Domains=
#DNSSEC=no
#DNSOverTLS=no
#MulticastDNS=no
#LLMNR=no
#Cache=no-negative
#CacheFromLocalhost=no
#DNSStubListener=yes
#DNSStubListenerExtra=
#ReadEtcHosts=yes
#ResolveUnicastSingleLabel=no
#StaleRetentionSec=0
```

# コマンド

## `$ host`

[DNS](https://qiita.com/AsahinaKei/items/aa97c398e832d9a22e92)  の問い合わせを行うためのツール。

ホスト名の IP アドレス解決や、逆引き（IP アドレスからホスト名）に利用される。

```console:IP アドレスを問い合わせる
$ host ホスト名
```

```console:ホスト名を問い合わせる（逆引き）
$ host IPアドレス
```

## `$ dig`
Domain Information Groper（grope=探る）

[DNS](https://qiita.com/AsahinaKei/items/aa97c398e832d9a22e92) サーバに問い合わせを行い情報を取得するツール。

[`$ host`](#-host) よりも詳細な情報が取得できる。

```console:IP アドレスを問い合わせる 
$ dig ホスト名
```

```console:ホスト名を問い合わせる （逆引き）
$ dig IPアドレス
```

## `$ hostname`

```console:現在のホスト名を確認する
$ sudo hostname
```

```console:ホスト名を変更する
$ sudo hostname 新ホスト名
```

`$ hostname` によるホスト名の変更は一時的なもので、再起動によって変更が元に戻ってしまう。恒久的に変更したい場合、[`$ hostnamectl`](#-hostnamectl)を実行する必要がある。


## `$ hostnamectl`

```console:ホスト名を表示する
$ hostnamectl
$ hostnamectl status
```

```console:恒久的にホスト名を変更する
$ sudo hostnamectl set-hostname 新ホスト名
```

## `$ ping` / `$ ping6`

指定された宛先に対して [ICMP](https://qiita.com/AsahinaKei/items/627f0076fecc107ac686#icmp) Echo Request（パケット） を送信し、そのホストから応答（Echo Reply）があるかどうかで接続を確認するためのツール。

```console:指定した宛先に ICMP パケットを送信する
$ ping ホスト名
$ ping IPアドレス
```

```console:送信パケット数を指定する（count）
$ ping -c パケット数 ホスト名 # デフォルトは Ctrl + C で終了するまで延々と送り続ける
```

```console:送信間隔を指定する（interval）
$ ping -i 秒数 ホスト名 # デフォルトは 1 秒
```

IPv6 では `$ ping6` を使用する。利用方法は `$ ping` と同じ。

## `$ traceroute` / `$ traceroute6`

```console:指定された宛先までの経路を調査する
$ traiceroute ホスト名
$ traiceroute IPアドレス
```

IPv6 では `$ traceroute6` を使用する。

※ 仕組みついては [こちら](https://qiita.com/AsahinaKei/items/627f0076fecc107ac686#traceroute%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF)

## `$ tracepath` / `$ tracepath6`

```console:指定された宛先までの経路を調査する
$ tracepath ホスト名
$ tracepath IPアドレス
```

IPv6 では `$ tracepath6` を使用する。


## `$ nmap`
Network Mapper

ネットワークのスキャンを行うためのツールで、オープンポートの検出（**ポートスキャン**）、サービスの確認、OSの推定などを行うことができる。

ネットワーク管理者がセキュリティ診断やトラブルシューティングに利用するほか、攻撃者が脆弱性を探るためにも使われる。

```console:ポートスキャンを行う（オープンしているポートを調べる）
$ nmap IPアドレス
```

```console:OS を推定する
$ nmap -O IPアドレス
```

## `$ nc`
netcat

ネットワーク接続を確立し、データの送受信を行うためのツール。

様々な用途に使用することができる。

- ポートスキャン
    - 指定した IP アドレスのポートが開いているか確認する
- TCP / UDP 通信
    - サーバーとクライアント間でデータを送受信する
- 簡易 Web サーバー
    - 一時的に HTTP サーバーを起動する
- ファイル転送
    - リモートマシンとの間でファイルを転送する

| オプション | 説明 |
|:-|:-|
| `-l` | 指定したポートをリッスンする（listen） |
| `-p ポート番号` | 使用するポート番号を指定する（port） |
| `-v` | 詳細情報を表示する（verbose） |
| `-n` | ホスト名ではなく IP アドレスを使う（numeric） |
| `-z` | 接続テストのみ。データ送受信しない。（zero-I/O）<br>ポート番号をスペース区切りで複数指定できる。 |
| `-u` | UDP を使用する（デフォルトはTCP） |

`-p` オプションはクライアント側の送信元ポートを指定する。サーバ側のリッスン用ポートの指定には `-l` を使用する。

```console:基本構文
$ nc [-option] ホスト名 ポート番号
$ nc [-option] IPアドレス ポート番号
```

```console:80番ポート（HTTP）と443番ポート（HTTPS） の状態を確認する
$ nc -zv example.com 80 443
```

クライアントとサーバ側でそれぞれ利用することができる。

```console:サーバ側でリッスンする
$ nc -l -p ポート番号
```

```console:クライアント側でデータを送信する
$ nc サーバのIPアドレス サーバのポート番号
```



## `$ ip`

ネットワーク設定を管理するための標準コマンド。

従来の `$ ifconfig`、`$ route`、`$ netstat` などに換わる新しいツール（`iproute2` パッケージ）として提供される。

```console:基本構文
$ ip 操作対象 サブコマンド オプション dev デバイス名
$ ip 操作対象 サブコマンド オプション # デバイス名を省略するとすべてのインターフェースが対象
```

| 操作対象 | 説明 |
|:-|:-|
| `addr` | IPアドレス |
| `link` | [データリンク層](https://qiita.com/AsahinaKei/items/627f0076fecc107ac686#network-interface-%E5%B1%A4%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0) のインターフェース |
| `route` | [ルーティング](https://qiita.com/AsahinaKei/items/627f0076fecc107ac686#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0) |
| `neigh` | [ARP テーブル](https://qiita.com/AsahinaKei/items/627f0076fecc107ac686#arp) |
| `tunnel` | トンネル設定 |

<br>

| サブコマンド | 説明 |
|:-|:-|
| `show` | 表示する |
| `add` | 追加する |
| `del` | 削除する |
| `set` | 設定する |
| `up` | 有効化する |
| `down` | 無効化する |

**`$ ip addr`**

```console:すべてのインターフェースの IP アドレスを表示する
$ ip addr show
```

```console:特定のインターフェースの IP アドレスを表示する
$ ip addr show インターフェース名
```

```console:IP アドレスを追加する
$ ip addr add IPアドレス dev インターフェース名
```

```console:IP アドレスを削除する
$ ip addr del IPアドレス dev インターフェース名
```

**`$ ip link`**

```console:ネットワークインターフェースの統計情報を表示する
$ ip -s link
$ ip -s link show
$ ip -s link show dev インターフェース名
```

`RX` = Receive（受信）
`TX` = Transmit（送信）

```console:ネットワークインターフェースを有効化する
$ ip link set up dev インターフェース名
$ ip link set dev インターフェース名 up
$ ip link set インターフェース名 up
```

```console:ネットワークインターフェースを無効化する
$ ip link set down dev インターフェース名
$ ip link set dev インターフェース名 down
$ ip link set インターフェース名 down
```

**`$ ip route`**

```console:ルーティングテーブルを確認する
$ ip route show
```

```console:ルーティングテーブルを追加する（特定のルートを追加する）
$ ip route add IPアドレス via ゲートウェイのIPアドレス dev インターフェース名
```

PCに設定されるゲートウェイは、ルータの場合「ネクストホップ」と呼ばれる。

```console:デフォルトゲートウェイを設定する
$ ip route add default via IPアドレス dev インターフェース名
```

```console:ルーティングテーブルを削除する（特定のルートを削除する）
$ ip route del IPアドレス
```

```console:デフォルトゲートウェイを削除する
$ ip route del default via ゲートウェイのIPアドレス
$ ip route del default
```

**`$ ip neigh`**

```console:ARP テーブルを表示する
$ ip neigh show
```

※[ARP テーブル](https://qiita.com/AsahinaKei/items/627f0076fecc107ac686#arp)

```console:ARP テーブルを追加する
$ ip neigh add IPアドレス lladdr MACアドレス dev インタフェース名
```

```console:ARP テーブルを削除する
$ ip neigh del IPアドレス lladdr MACアドレス dev インターフェース名
$ ip neigh del IPアドレス dev インターフェース名
```

## `$ curl`
Client URL

URL を指定してネットワークからデータを取得、送信するコマンド。

[HTTP](https://qiita.com/AsahinaKei/items/627f0076fecc107ac686#http)(S)、[FTP](https://qiita.com/AsahinaKei/items/627f0076fecc107ac686#ftp)、[SMTP](https://qiita.com/AsahinaKei/items/627f0076fecc107ac686#smtp) など、さまざまなプロトコルをサポートしている。

```console:URL のデータを取得
$ curl URL
```

```console:取得データをローカル環境にファイルとして保存する（output）
$ curl -o ファイル名 URL
```

```console:ネットワーク上のファイルをローカル環境（カレントディレクトリ）に保存する（output）
$ curl -O URL
```

```console:指定した URL からのリダイレクトに従う
$ curl -L URL
```

```console:HTTP ヘッダーだけ取得する
$ curl -I URL
```

```console:POST リクエストでデータを送信する（data）
$ curl -d 送信データ URL
```

```console:HTTPリクエストメソッド（GET、POST、PUT、DELETE など）を指定する
$ curl -X リクエストメソッド URL
```

```console:HTTP ヘッダーを追加で指定する（header）
$ curl -H ヘッダー情報 URL
```

## Net-Tools

1990年代の設計による古いネットワークに関するツール群（パケーじ）。

新しいコマンドに置き換わり、メンテナンスがされていない可能性があるため現在では **非推奨*。

Linux ディストリビューションによっては標準搭載されていない。

### `$ ifconfig`
Interface Configuration

:::note info
現在では、より新しく高機能な `$ ip` を使用することが推奨されている。
:::

ネットワークインターフェースの設定や状態を確認するコマンド。

```console:アクティブなネットワークインターフェースの状態を表示する
$ ifconfig
```

```console:すべてのネットワークインターフェースの状態を表示する
$ ifconfig -a
$ ip a # 推奨
```

```console:特定のネットワークインターフェースの状態を表示する
$ ifconfig インターフェース名
```

```console:ネットワークインターフェースを有効化する
$ ifconfig インターフェース名 up
$ ip link set インターフェース名 up # 推奨
```

```console:ネットワークインターフェースを無効化する
$ ifconfig インターフェース名 down
$ ip link set インターフェース名 down # 推奨
```



### `$ ifup` / `$ ifdown`
interface up / interface down

```console:有効化する
$ ifup ネットワークインターフェース名
```

```console:無効化する
$ ifdown ネットワークインターフェース名
```

### `$ netstat`
Network Statistics

:::note info
現在では、より新しく高機能な `$ ss` を使用することが推奨されている。
:::

開いているポート、アクティブな接続、ルーティングテーブル、インターフェースの状態などネットワークの統計情報を表示する。

Net-Tools（`$ ifconfig`、`$ route` などと同じ、古いツール群）の一部。

```console:ネットワークの統計情報を表示する
$ netstat
```

接続待ちの状態（state）を `LISTEN`、接続が確立した状態を `ESTABLISHED` で表現する。

| オプション | 説明 |
|:-|:-|
| `-a`<br>`--all` | すべての [ソケット](#ソケット) 情報を表示する |
| `-l`<br>`--listening` | 接続待ちのソケット情報を表示する |
| `-p`<br>`--program` | ソケット、ポートをオープンしているプロセスを表示する |
| `-t`<br>`--tcp` | TCP 接続用ソケットのみ表示する |
| `-u`<br>`--udp` | UDP 接続用ソケットのみ表示する |
| `-i`<br>`--interface` | ネットワークインターフェースの状態を表示する<br>`$ ip -s link` と同じ |
| `-r`<br>`--route` | ルーティングテーブルを表示する<br>`$ ip route show` と同じ |

### `$ route`

:::note info
現在では、より新しく高機能な `$ ip` を使用することが推奨されている。
:::

ルーティングテーブルを表示したり、操作することができる。

Net-Tools（`$ ifconfig`、`$ netstat` などと同じ、古いツール群）の一部。
 
```console:ルーティングテーブルを表示する
$ route # ホスト名で表示する
$ route -n # IP アドレスで表示する
```

| オプション | 説明 |
|:-|:-|
| `-n` | ホスト名ではなく IP アドレスを表示する（numeric） |
| `add` | 新しいルートを追加する |
| `del` | ルートを削除する |
| `default` | デフォルトゲートウェイを設定する |
| `netmask` | サブネットマスクを指定する |

```console:デフォルトゲートウェイを設定する
$ route add default gw デフォルトゲートウェイ
```


## `$ nmcli`

[NetworkManager](#networkmanager) の制御を行うコマンド。

```console:基本構文
$ nmcli 操作対象 サブコマンド
```


| 操作対象 | 説明 |
|:-|:-|
| `general` | NetworkManager の管理 |
| `device` | ネットワークインターフェースの表示、管理 |
| `connection` | ネットワーク接続の管理（接続の確立、編集、切断） |
| `networking` | ネットワークの状態を表示、機能の有効化、無効化 |
| `radio` | ワイヤレスデバイス（Wi-Fi、Bluetooth）の管理 |
| `agent` | ネットワークの認証エージェントを管理 |
| `monitor` | ネットワークの状態を監視 |

```console:NetworkManger の状態を表示する
$ nmcli general status
```

```console:ホスト名を表示する
$ nmcli general hostname
```

```console:インターフェースの状態を表示する
$ nmcli device
$ nmcli device status
```

```console:利用可能な Wi-Fi ネットワークのリストを表示する
$ nmcli device wifi list
```

```console:Wi-Fi ネットワークに接続する
$ nmcli device wifi connect "SSID" password "パスワード"
```

```console:指定したネットワークインターフェースを切断する
$ nmcli device disconnect インターフェース名
```

```console:現在設定されているネットワーク接続情報を表示する
$ nmcli conection show
```

```console:ネットワーク機能全体を無効化する
$ nmcli networking off
```

```console:ネットワーク機能全体を有効化する
$ nmcli networking on
```

```console:ネットワークのイベントを監視する
$ nmcli monitor
```