【Linux】NW確認・変更コマンド【RHEL】

せんとくん

![20180516182359.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/fd1fb7e2-949b-6fcf-8e71-1862067302ef.jpeg)
やら赤帽少年のネットワーク関連の設定・確認方法です。

バージョン7からNetworkManagerの利用が推奨されているようですが、7以前のようにファイル編集でも設定はできます。

→(更新2025)RHEL9でnmcliでの設定方法も追加しました。まだまだ7を使っているところも多いかと思いますので、設定方法は残しておこうと思います。

<br>

# ■HOSTNAME確認・設定

```
# hostnamectl
```
でカーネルやらOS情報やらまとめて見れます。

```bash:出力例
[root@host01 /]# hostnamectl
Static hostname: host01
Icon name: computer-vm
Chassis: vm
Machine ID: 07346a5e12704a78a073eb9f111d5765
Boot ID: 848c64cbc5d942d2a7064fbf42540590
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-693.el7.x86_64
Architecture: x86-64
```
ホスト名設定
```
# hostname ホスト名
```
で変更できますが、再起動すると元に戻ります。
設定ファイルとしては`/etc/hostname`があるのですが、ここが反映されません。
恒久的に変更する場合は、

```
# hostnamectl set-hostname --static ホスト名
```
で設定。これで`/etc/hostname`にも反映されます。また、

```bash:/etc/sysconfig/network
HOSTNAME=ホスト名
```
と記載しても反映されます。クラウドでのオーダーなんかだとデフォでこのファイルに記載されている場合があります。まあどっちゃでもいいでしょう。

# ■基本IP設定
## ファイル編集 ※RHEL7で確認
「NetworkManagerなんか必要ねぇんだよ！」て人もいると思うので、従来の方法も載せときます。
→RHEL9ベースでは非推奨なので注意。nmcli使ってください。

```
# ip a
```
でアドレスなどの確認。インストールすればifconfigも使えますが、慣れればこっちの方が楽ですし、nmcliコマンドのほうが詳細に表示できます。

`/etc/sysconfig/network-scripts/ifcfg-eth0`
を編集して設定。eth0は該当するデバイス名です。
NICが追加されるとそのデバイスの名前をつけた設定ファイルを作成しないといけません。そこは面倒ですね。
よくわからんパラメータが沢山ありますが、基本的に以下のパラメータがあれば大丈夫かなと。 

```bash:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes           #OS起動時に有効化
TYPE=Ethernet
BOOTPROTO=none       #直接IPを指定
IPADDR=192.168.1.100
PREFIX=24
NM_CONTROLLED=NO     #NetworkManagerを使用しない
```
IPv6使わない場合は項目ごと削除で大丈夫です。
PREFIXの箇所は、
`NETMASK=255.255.255.0`
のように記述することもできます。

また、IPエイリアスを設定したい場合は
`IPADDR1=192.168.1.111`
`PREFIX1=24`
のように追記することで設定できます。

デフォルトゲートウェイの設定は
`GATEWAY=192.168.1.1`
`DEFROUTE=yes`
と追記することで設定はできるのですが、NICが複数あったりする場合は以下のファイル1つに記述しておく方がいいです。

```bash:/etc/sysconfig/network
GATEWAY=192.168.1.1
```
ファイル編集後、サービス再起動
```
# systemctl restart network
```

## NetworkManager使用
サービス起動
```
# systemctl start NetworkManager
```
設定はnmcliコマンドか、TUI設定ツールのnmtuiを使う方法があります。

### ・nmcliコマンド
IFの確認
```
# nmcli
```
```bash:出力例
[root@host01 ~]# nmcli
ens160: 接続済み to ens160
"VMware VMXNET3 Ethernet Controller"
ethernet (vmxnet3), 00:50:56:8D:FF:13, hw, mtu 1500
ip4 デフォルト
inet4 192.168.1.100/24
inet6 fe80::250:56ff:fe8d:ff13/64

lo: 管理無し
"lo"
loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536

既知のデバイスに関する情報を取得するには、"nmcli device show" を使用します。
アクティブな接続プロファイルの概要を取得するには、"nmcli connection show" を使用します。

使用方法の詳細情報については、nmcli(1) と nmcli-examples(5) の man ページを参照してください。
```

ご丁寧にオプションの説明書いてくれてる...
<br>
詳細確認したい場合は以下
```
# nmcli device show
# nmcli connection show
```
認識済のeth0のIP/GW設定

```
# nmcli c modify eth0 ipv4.addresses 192.168.1.100/24 ipv4.method manual ipv4.gateway 192.168.1.1
```

DNS参照先設定
```
# nmcli c modify eth0 ipv4.dns 192.168.1.10
```
connection状態更新
```
# nmcli connection reload
```
ここでの設定は
RHEL7では`/etc/sysconfig/network-scripts/ifcfg-eth0`、
RHEL9では`/etc/NetworkManager/system-connections(後述)`に反映されます。

### ・nmtuiで設定
nmtui起動
```
# nmtui
```
設定項目みながらポチポチして接続の編集やホスト名変更が可能です。
![20180516182549.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/526de7ef-beaa-f0ef-0543-9afdefdb4b54.jpeg)
<br>

# ■Bonding設定
複数NICを使ってLAGのインターフェースを組む場合です。チーミングだのbondingだのLAGだの名称を統一してくれ(小声)

## ・bondingモジュールのインストール
ない場合はあまりないと思うが、なければインストール
```
# modprobe --first-time bonding
```

## ・bondingの種類
一応種類をまとめておきます。

`mode=0 : balance-rr`
⇒ラウンドロビンによる負荷分散。bondingを組んでいるすべてのインタフェースで受信。

`mode=1 : active-backup`
⇒active/backupの方式。activeポートが使用できなくなると、backupポートがactiveポートになる。

`mode=2 : balance-xor`
⇒送信元/宛先情報を元に負荷分散。情報はxmit_hash_policyによって設定。bondingを行っているすべてのインタフェースで受信。

`mode=3 : broadcast`
⇒すべてのインタフェースから同じパケットを送信。bondingを行っているすべてのインタフェースで受信。

`mode=4 : 802.3ad`
⇒LACP(Link Aggregation Control Protocol:リンクアグリゲーションの接続を確立させるプロトコル)を使用。情報はxmit_hash_policyによって設定可能。
送信元/宛先情報を元に負荷分散を行い、受信はLACPでネゴシエーションが取れたインタフェースで行う。＝対向のSWでもLACPを有効にする必要がある。

`mode=5 : balance-tlb`
⇒スレーブインタフェースの負荷によって負荷分散され、送信。bondingを行っているすべてのインタフェースで受信。

`mode=6 : balance-alb`
⇒スレーブインタフェースの負荷によって負荷分散され、送信。受信は負荷に応じて変更。
<br></br>

## ・設定
### コンフィグファイル編集 ※RHEL7
nmcliを推奨で、RHEL9ではできなくなっています。
スレーブはファイル名とDEVICEの値以外は両方同じ設定。↓
```bash:/etc/sysconfig/network-scripts/ifcfg-eth0,eth1
DEVICE=eth0(1)
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes
```
```bash:/etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
TYPE=Bond
BONDING_MASTER=yes
ONBOOT=yes
BOOTPROTO=none
NM_CONTROLLED=no
BONDING_OPTS="mode=1 miimon=100 primary=eth0 updelay=10000"
```
mode4なら、`BONDING_OPTS="mode=4 lacp_rate=1"`。
ちなみにVLANを設定したい場合は、`/etc/sysconfig/network`に`VLAN=yes`を追記してVLANを有効化した上で、
ifcfg-XXXファイル名に.VLAN番号をつけて作成。(このファイルにVLAN=yesを入れてもよい。)↓
```bash:/etc/sysconfig/network-scripts/ifcfg-bond0.1111
DEVICE=bond0.1111
TYPE=Bond
BONDING_MASTER=yes
ONBOOT=yes
BOOTPROTO=static
NM_CONTROLLED=no
IPADDR=10.11.0.2
PREFIX=24
IPV6INIT=no
VLAN=yes
```

### nmcliコマンドで設定
bondインターフェース作成
```
# nmcli connection add type bond con-name bond0 ifname bond0 mode 802.3ad miimon 100  lacp-rate fast ipv4.method disabled ipv6.method ignore
```
※この物理IFを親にしてVLANIFをつけたい場合、methodを`disabled/ignore`を指定する必要がある。(dhcp等で自動でIPを取りに行ってしまうため)

https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/configuring_and_managing_networking/configuring-nested-vlans-using-nmcli-commands_configuring-vlan-tagging


bondIFへ物理IFを参加させる
```
# nmcli connection add type ethernet port-type bond con-name bond0-slave0 ifname eth0 master bond0
# nmcli connection add type ethernet port-type bond con-name bond0-slave1 ifname eth1 master bond0
```

### (option)VLANインターフェース作成
VLANタグを設定したい場合
`vlan.parent`パラメータが実際にどの物理 or bondIFにVLANを乗せるかを決める.
con-nameおよびifnameは慣習的に`IF名.VLANID`
```
# nmcli connection add type vlan con-name bond0.1000 ifname bond0.1000 vlan.parent bond0 id 1100
```
VLANIFにアドレス付与し、有効化
→ホストにアドレスが付与され、外部から接続可能。また、VLAN1000のタグ通信となる
```
# nmcli connection modify bond0.1000 ipv4.addresses 192.168.100.1/24 ipv4.method manual ipv4.gateway 192.168.100.254
# nmcli connection up bond0.1000
```

## ・確認
全体確認↓
```
# ip -d link show type bond
```

```
# nmcli c show
NAME          UUID                                  TYPE      DEVICE
bond0.1000    03546718-01c0-4aaa-b6e7-99493a25b937  vlan      bond0.1000
bond0         12cc0647-7f21-49f0-93b2-6575db5680fc  bond      bond0
bond0-slave0  442d2cf7-79d7-4ee6-bdf2-2f2c3f252c62  ethernet  eth0
bond0-slave1  f7557663-9a3f-4d88-99f9-cb8a1b608c31  ethernet  eth1
lo            934e6c01-31ee-4ec6-b5a4-6148543e3040  loopback  lo
eth0          0cb0f677-f411-3e6b-885b-ed6ddc51ffc8  ethernet  --
eth1          0655f372-afcd-3302-9d8d-f99cc59481ce  ethernet  --
```

```
# ls /proc/net/bonding/
bond0  bond1  bond2
```
IFの詳細確認
eth0と1でActive/Standby(mode1)でeth0をprimaryにしてbond0を組んでいる場合↓
```bash:/proc/net/bonding/bond0
[root@host01 ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 10000
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 68:05:ca:e0:b4:1e
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 68:05:ca:e0:b4:1f
Slave queue ID: 0
[root@host01 ~]#
```
eth0と1でmode4でbond0を組んでいる場合↓
```bash:/proc/net/bonding/bond0
[root@host01 ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

802.3ad info
LACP rate: fast
Min links: 0
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: b4:96:91:c1:XX:XX
Active Aggregator Info:
        Aggregator ID: 9
        Number of ports: 2
        Actor Key: 21
        Partner Key: 32769
        Partner Mac Address: 00:23:04:ee:XX:XX

Slave Interface: eth0
MII Status: up
Speed: 25000 Mbps
Duplex: full
Link Failure Count: 88
Permanent HW addr: b4:96:91:c1:XX:XX
Slave queue ID: 0
Aggregator ID: 9
Actor Churn State: none
Partner Churn State: none
Actor Churned Count: 1
Partner Churned Count: 2
details actor lacp pdu:
    system priority: 65535
    system mac address: b4:96:91:c1:XX:XX
    port key: 21
    port priority: 255
    port number: 1
    port state: 63
details partner lacp pdu:
    system priority: 8192
    system mac address: 00:23:04:ee:XX:XX
    oper key: 32769
    port priority: 32768
    port number: 257
    port state: 63

Slave Interface: eth1
MII Status: up
Speed: 25000 Mbps
Duplex: full
Link Failure Count: 5
Permanent HW addr: b4:96:91:c1:XX:XX
Slave queue ID: 0
Aggregator ID: 9
Actor Churn State: none
Partner Churn State: none
Actor Churned Count: 0
Partner Churned Count: 0
details actor lacp pdu:
    system priority: 65535
    system mac address: b4:96:91:c1:XX:XX
    port key: 21
    port priority: 255
    port number: 2
    port state: 63
details partner lacp pdu:
    system priority: 8192
    system mac address: 00:23:04:ee:XX:XX
    oper key: 32769
    port priority: 32768
    port number: 16641
    port state: 63
[root@host01 ~]#
```


# ■Bridge設定
仮想ブリッジ ⇒ ホストLinux上に仮想的なL2スイッチを構成する機能
ホスト上の物理NICを仮想ブリッジに接続し、L2スイッチを経由してVMを外部ネットワークに接続できます。(VMには、外部ネットワークと同じサブネットのIPアドレスをアサインする)

通信フローとしては、
`VMの仮想NIC ⇒ ホスト側のTAPデバイス ⇒ 仮想ブリッジ ⇒ ホスト側の物理NIC ⇒ 外部NW`

同じ仮想ブリッジに接続されたVM同士は、仮想ブリッジを経由して通信することが可能。

## ・設定
### コンフィグファイル編集 ※RHEL7
ホストサーバにもアドレスを振る場合はここ。↓
```bash:/etc/sysconfig/network-scripts/ifcfg-br2222
DEVICE=br2222
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.11.10.200
PREFIX=24
```
物理NICと仮想ブリッジを接続する。
bondingの場合、ブリッジファイルをここで指定↓
```bash:/etc/sysconfig/network-scripts/ifcfg-bond0.2222
DEVICE=bond0.2222
TYPE=Bond
BONDING_MASTER=yes
ONBOOT=yes
BOOTPROTO=none
NM_CONTROLLED=no
IPV6INIT=no
BRIDGE=br2222
```
bondingでない場合はifcfg-ethXの物理IFのファイルで`BRIDGE=brXXXX`を指定すればよい。


### nmcliで設定

bridgeIF作成・有効化

```
# nmcli connection add type bridge con-name br0 ifname br0
```

既存のIFを作成したブリッジに接続する
ここではVLANIF(bond0.1000)を作成したbr0ブリッジに接続している

```
# nmcli connection modify bond0.1000 master br0
```

有効化
```
# nmcli connection up br0
```

ifnameは存在する接続したいIF,masterは作成したbridgeIFを指定する

## ・確認
```
$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.b026286cdb90       no              bond0.1000
```
brctlコマンドがない場合は
```
# ip -d link show type bridge
```

# (OMAKE)■nmcliコマンドリスト
サクッと設定したい時用のリスト

```
物理NICx2(eth0,eth1)
   ↓
bond0  ← trunk (VLAN 1101, 1102)
   ├─ bond0.1101  ← ホスト用、IPあり（192.168.110.10）
   └─ bond0.1102  ← VM用、IPなし
          ↓
        br0.1102  ← VMが接続
```

## ① bond0 の作成
```
# nmcli connection add type bond con-name bond0 ifname bond0 mode 802.3ad miimon 100 lacp-rate fast ipv4.method disabled ipv6.method ignore
# nmcli connection add type ethernet con-name bond0-slave1 ifname eth0 master bond0
# nmcli connection add type ethernet con-name bond0-slave2 ifname eth1 master bond0
```
#bondIF自体にアドレスを振らない場合、methodをv4:disabled/ignoreに指定

## ② VLAN 1101（ホスト用）を定義
vlan1101でホスト自体にSSHアクセスできるようにする
```
# nmcli connection add type vlan con-name bond0.1101 ifname bond0.1101 vlan.parent bond0 id 1101
# nmcli connection modify bond0.1101 ipv4.method manual ipv4.addresses 192.168.110.10/24
# nmcli connection modify bond0.1101 ipv6.method ignore
# nmcli connection up bond0.1101
```

## ③ VLAN 1102（VM用）を作成
VMがVLAN1102で通信する。ホスト自体は1102のアドレスは持たない。
```
# nmcli connection add type vlan con-name bond0.1102 ifname bond0.1102 vlan.parent bond0 id 1102
```

## ④ Bridge br0.1102 を作成して、bond0.1102 を 接続
```
# nmcli connection add type bridge con-name br0.1102 ifname br0.1102
# nmcli connection modify bond0.1102 master br0.1102
```
## ⑤ IFを起動
```
# nmcli connection up bond0.1102
# nmcli connection up br0.1102
```

## (option) VM 側の接続（virt-manager/virt-install）
br0.1102をVMのNICにブリッジ接続
VM側のIPを設定
libvirt 用の virtual network を定義(任意)

## 確認
```:nmcli connection show
NAME              UUID                     TYPE      DEVICE
bond0             ...                      bond      bond0
bond0-slave0      ...                      ethernet  eth0
bond0-slave1      ...                      ethernet  eth1
bond0.1101        ...                      vlan      bond0.1101
bond0.1102        ...                      vlan      bond0.1102
br0.1102          ...                      bridge    br0.1102
virbr0            ...                      bridge    virbr0
```

```:nmcli device status
DEVICE        TYPE      STATE                   CONNECTION
eth0          ethernet  接続済み                 bond0-slave0
eth1          ethernet  接続済み                 bond0-slave1
bond0         bond      接続済み                 bond0
bond0.1101    vlan      接続済み                 bond0.1101
bond0.1102    vlan      接続済み                 bond0.1102
br0.1102      bridge    接続済み                 br0.1102
lo            loopback  接続済み (外部)           lo
virbr0        bridge    接続済み (外部)           virbr0
```

また、NeworkManagerの設定が反映されるファイルは`/etc/NetworkManager/system-connections`ディレクトリに各IFごとにファイルで分かれている
```:/etc/NetworkManager/system-connections/bond0.nmconnection
[connection]
id=bond0
uuid=12cc0647-7f21-49f0-93b2-6575db5680fc
type=bond
interface-name=bond0

[bond]
lacp_rate=fast
miimon=100
mode=802.3ad

[ipv4]
method=disabled

[ipv6]
addr-gen-mode=default
method=ignore

[proxy]
```

# ■静的経路の追加
```
# route add -net 192.168.99.0/24 gw 192.168.0.254 eth0
```
`route add -net IPアドレス/サブネット gw 宛先ルータアドレス 発信するデバイス名`
で一時的に追加できます。また<font color="Blue">ip route</font>コマンドでも設定できますが、これらは再起動すると消えます。
<br>
恒久的に追加する場合は以下。ファイルで既に指定しているので、dev eth0は省略できます。
```bash:/etc/sysconfig/network-scripts/route-eth0
192.168.9.0/24 via 192.168.0.254 dev eth0
```

nmcliでのStaticRoute設定
```
# nmcli c modify eth0 ipv4.routes 192.168.122.0/24 10.10.10.1
```

ルーティングテーブル確認。
```
# ip route
```
<br>

# ■パケットキャプチャ
tcpdumpが入っていればパケットのキャプチャを取得できます。
```
# tcpdump -i eth1 port 53 -nn -s 0 -tttt
```
eth1インターフェースを通過するポート53のトラフィックをキャプチャし、その内容をタイムスタンプ付きで表示


# ■DNS設定
ifcfgファイルに記述することもできますが、`/etc/resolv.conf`に記述するのが一般的です。
```bash:/etc/resolv.conf
nameserver 10.70.71.107
nameserver 10.70.71.108
```

nmcliでの参照先設定
```
# nmcli c modify eth0 ipv4.dns 192.168.1.10
```

名前解決の確認
```
# nslookup
```
コマンドがない場合は、yumなどで`bind-utils`をインストールするか、
`dig`,`host`コマンドでも名前解決を調べられます。

```
dig -b 192.168.0.1 @10.0.0.1 www.google.co.jp +tries=1
```
192.168.0.1を送信元として、DNSのクエリを10.0.0.1のDNSサーバーに送信し、www.google.co.jpドメインのIPアドレスを取得しようとする。
+tries=1のオプションでDNSサーバーへのクエリ再試行の回数を1回のみの試行でドメインのIPアドレスを取得します。

参照先のDNSサーバを指定し、アドレスだけ返して欲しい場合は以下
```
# dig +short @参照先DNSサーバIP XXX.com
```

v6で確認したい場合は以下
```
# dig +short AAAA XXX.com
```

# ■CONNECTION状態
必須級。
```
# netstat -nplt
```
`-n`: IPアドレスとポート番号を数値形式で表示。DNSの逆引きなどは行われず、IPアドレスとポート番号をそのまま表示。
`-p`: 各接続やソケットに紐付いているプログラム名（プロセス名）を表示。ポート番号とプロトコルの組み合わせをプロセスにマッピングするために使用。
`-l`: リスニング（Listen）状態のソケットや接続を表示。つまりローカルマシンが他のマシンからの接続を受け入れるために待機しているポート。
`-t`: TCP接続を表示
`-u`: UDP接続を表示

<br>
後継としてssコマンドもある。

```
# ss -antp
```
`-a`：LISTEN,NOLISTEN両方の情報を表示。-lでListenのみ
`-n`：アドレスやポートを数値で表示
`-t`：TCP接続を表示
`-u`：UDP接続をｈｙ
`-p`：プロセス名を表示

<br>
ポートの確認であれば、ncコマンドも便利

```
# nc -vz 127.0.0.1 80
```
`-v`は詳細、`-z`はデータを対象ポートに送信しない




# ■HTTPS通信確認
```
# openssl s_client -connect xxxx.com:443
```
`openssl s_client`: OpenSSLコマンドでSSL/TLSクライアントを起動
`-connect xxxx.com:443`: 接続先のホスト名とポート番号を指定

このコマンドを実行すると、指定されたホストとポート上のサーバーに対してSSL/TLS接続が試みられる。
接続が成功すると、サーバーの証明書情報や使用されるSSL/TLSバージョンなどの詳細な情報が表示される。

ちなみに証明書ファイルの内容を表示したい場合は以下
```
# openssl x509 -in xxxx.crt -text -noout
```

# ■cURL確認
```
# curl "http://xxxx.com/zzz"
```
`-L`:リダイレクトがあればリダイレクト先の情報を取得
`-s`:進捗状況を非表示。-sSとすることが多い
`-S`:エラーは表示。-sSとすることが多い
`-v`:詳細ログを出力
`-I`:HTTPレスポンスヘッダを取得
`-k`:SSL接続で証明書エラーをスキップ
`-O`:ダウンロード

```
# curl --max-time 3 -o /dev/null -s -w "%{http_code}\n" https://www.yahoo.co.jp
```
HTTPステータスコードのみ返してくれる。200 = 成功

```
# curl ifconfig.me
```
使用しているグローバルアドレスを確認できるコマンド