CentOS6・7のifcfg他設定ファイルについて

#1. とりあえず
まず非常によくある「/etc/sysconfig/network-srciprts/にifcfgが無い!」って状況の対処法。
DHCPサーバが使用できる環境ならNetworkManagerがあろうとなかろうと以下の記述が入ったifcfg-eth0さえあれば大抵動く。

```ifcfg-eth0.min
DEVICE=eth0
BOOTOPROTO=dhcp
```

これにONBOOT=yesを加えて再起動するなりifup eth0なりすればとりあえずNICは使える。
更にNetworkManagerが有効ならばGUIのネットワーク設定画面でプロファイルを開いて、何も書き換えずに"適用"をクリックするとifcfg-eth0がNetworkManager使用下でのデフォルト設定に書き換わります。
以下は書き換わったifcfgの例。

```ifcfg-eth0.nm
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
UUID=********-****-****-****-************
```

もしくはnmcuiなりnmtuiなりGUI設定で接続プロファイルを作成し、適切にリネームした後ifcfgに"DEVICE=xxxx"を足す。

#2. NetworkManagerについて
以下のページが分かりやすい
[RHEL7 系のネットワーク設定 – ゴミ箱](https://53ningen.com/rhel7-networking/)
[RHEL7/CentOS7 NetworkManager徹底入門](https://www.slideshare.net/enakai/rhel7-network-managerv10)

NetworkManagerは接続をコネクションとデバイスに分けており、コネクションの紐付けにUUIDを使っている。このコネクションは明示しない限りデバイスと関連づけられておらず、GUI設定画面からデバイスに関連付けられる方法は無い。
(MACアドレスで関連付けられるけど、カード交換した時に問題になるじゃん…)
ifcfgに"DEVICE=xxxx"を足しましょう。

NetrworkManagerはコネクションと呼ばれる接続プロファイルとNICを示すデバイスを区別する等、ネットワークを動的に設定する仕組みを取り入れてます。(デバイスが明示されていない限り接続時に自動でデバイスを選択する)

コネクションの紐付けにはUUIDを使用しているため、NetworkManager由来のインターフェースで設定を作成するとUUIDが付与される。
コネクションは"nmcli connection"、デバイスは"nmcli device"で確認可能。

```
# nmcli c
名前                UUID                                  タイプ          デバイス 
システム enp6s0     ********-****-****-****-************  802-3-ethernet  enp6s0   
イーサネット接続 1  ********-****-****-****-************  802-3-ethernet  --       
# nmcli d
デバイス    タイプ    状態      接続            
enp6s0      ethernet  接続済み  システム enp6s0 
virbr0      bridge    切断済み  --              
lo          loopback  管理無し  --              
virbr0-nic  tap       管理無し  --  
```

便利な一方で適当に設定してるとifcfg-有線接続_1みたいなデバイスを明示しないプロファイルがたくさん生まれてしまって従来のifcfg-eth0みたいな設定に慣れていると結構困ります。また、ifcfg以外の設定ファイルを勝手に書き換えてしまったり、新しい機能があるのに中途半端に従来のネットワークスクリプトと互換性があるためにこんがらがります。

#3. 代表的な設定の解説
|設定|説明|
|:---|:---|
|NAME|nmcliのコネクション名、GUI設定画面のプロファイル名等|
|UUID|ifcfgとNetworkManagerのコネクションとの関連付けを行う|
|DEVICE|NICとの紐付けを行う|
|TYPE|Ether, Wireless, InfiniBand, Bridge, Bond, Vlan, Team, TeamPort等から選択する。無いなら無いでEtherが選択されるはず。少なくともifupスクリプトはEtherとみなす。|
|ONBOOT|OS起動時にNICを起動させるか|
|BOOTPROTO|DHCPを使用する場合は"dhcp"、静的に設定する場合は"static"もしくは"none"|
|IPADDR|IPアドレス(静的設定)|
|PREFIX|サブネットマスク(プレフィックス表記)|
|GATEWAY|このNICのゲートウェイアドレス|
|DNS1|DNSサーバのアドレス。以下DNS2、DNS3と続けられる。|
|IPV4_FAILURE_FATAL|IPv4の接続失敗によりNICの起動失敗とみなすか。noならIPv6の接続が試行される。|
|DEFROUTE|GATEWAYをデフォルトゲートウェイにするか。普通は1つyesにすべきだけど複数あってもうまくやってくれたはず。|
|PEERDNS|/etc/resolv.confにDHCPサーバから取得した情報を反映するか|
|PEERROUTES|デフォルトゲートウェイ情報をDHCPサーバから取得するか|
|IPV6INIT|IPv6を使うか|
|USERCTL|root以外のユーザーにオン/オフを許可するか|
|NM_CONTROLLED|NetworkManagerにこの設定を制御させるか|

#4. 設定ファイル類
覚えている限りでは以下の通り
・NetworkManagerの設定
/etc/NetworkManager/NetworkManager.conf
・NIC個別設定
/etc/sysconfig/network-scripts/ifcfg-xxxx
・名前解決系
/etc/hosts
/etc/hostname
/etc/networks
/etc/resolv.conf
・ルーティング系
/etc/sysconfig/network-scripts/route-****
/etc/sysconfig/network
・その他
/etc/udev/rules.d/70-persistent-net.rules


##/etc/NetworkManager/NetworkManager.conf
ネットワークマネージャ全体の設定。通常はいじる必要なし、詳細は下記参照。
[NetworkManager.conf：NetworkManagerリファレンスマニュアル]
(https://developer.gnome.org/NetworkManager/stable/NetworkManager.conf.html)

ただし/etc/resolv.confの変更を抑制するために、ifcfgのPEERDNSでなく、このファイルのmainセクションに"dns=none"に追加する方法がある。
[CentOS 7のネットワーク管理基礎（前編） | Think IT（シンクイット）](https://thinkit.co.jp/story/2014/12/25/5412?page=0%2C1)

##/etc/sysconfig/network-scripts/ifcfg-xxxx
NIC個々の設定を行う。詳細は前述の通り。

##/etc/hosts
IPアドレスとホスト名の照合を行う。一番左のホスト名が正式なホスト名で、以降はエイリアスとなる。

##/etc/hostname
ホスト名を変更したい場合はこのファイルを編集する(CentOS7)。
[CentOS 7 の Hostname を変更する - Qiita](https://qiita.com/n-oshiro/items/d18ab37bce2b25b2d5b0)

##/etc/networks
静的ドメイン、まずいじらない。以下は初期状態の一例

|ドメイン|アドレス|
|:---|:---|
|default|0.0.0.0|
|loopback|127.0.0.0|
|link-local|169.254.0.0|

##/etc/resolv.conf
DNS問い合わせ先

|設定|説明|
|:---|:---|
|nameserver|ネームサーバーのIPアドレス|
|domain|ドメイン名|
|search|検索リスト|


##/etc/sysconfig/network-scripts/route-xxxx
NIC毎のルーティング設定を行う。デフォルトゲートウェイの優先順序はifcfg-xxxx>route-xxxx>/etc/sysconfig/networkだったはず。
設定方法はIPコマンド引数形式とネットマスクディレクティブ形式があります。
###IPコマンド引数形式
(dev xxxxは省略可能)

```
default via 192.168.0.1 dev xxxx
10.1.1.0/24 via 10.1.1.1 dev xxxx
```

###ネットマスクディレクティブ形式

```
ADDRESS0=0.0.0.0
NETMASK0=0.0.0.0
GATEWAY0=192.168.0.1 
ADDRESS1=10.1.1.0
NETMASK1=255.255.255.0
GATEWAY1=10.1.1.1
```

##/etc/sysconfig/network
ルーティング設定、CentOS7では非推奨だったと思う。
(そもそもCentOS7.2ではファイルが無かった)
CentOS6でのホスト名の変更はこちらで行う。

|設定|説明|
|:---|:---|
|NETWORKING|システム起動時にネットワークを有効にするか|
|HOSTNAME|ホスト名|
|GATEWAY|デフォルトゲートウェイアドレス|
|GATEWAYDEV|記載されたデバイスのゲートウェイアドレスをデフォルトにする|

##/etc/udev/rules.d/70-persistent-net.rules
NICとMACアドレスの結合をudevが行う。
カードを交換した場合にはここも見ておいた方が良い。

#5. テンプレート
一応各種ファイルのテンプレートを残しておく。
他の設定を弄りたい場合は[nm-settings-ifcfg-rh](https://people.freedesktop.org/~lkundrak/nm-docs/nm-settings-ifcfg-rh.html)を読んで適宜設定しましょう。

##NMあり、DHCP設定

```ifcfg-eth0.nm-dhcp
NAME="System eth0"
UUID=********-****-****-****-************
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
```

##NMあり、静的設定

```ifcfg-eth0.nm-static
NAME"System eth0"
UUID=********-****-****-****-************
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
```

##NMなし、DHCP設定

```ifcfg-eth0.nonm-dhcp
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
```

##NMなし、静的設定

```ifcfg-eth0.nonm-static
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
```

#6. 備考
CentOS6の場合、GUI設定画面で"全てのユーザーに利用可能"にチェックしないと~/.gconf/system/networking/connections/以下にxml形式で設定が保管される(読みづらい)。
流石にCentOS7では改善されていて、/etc/sysconfig/network-scripts/以下にifcfg-xxxxで置かれるようになり、他の設定とは"USERS=xxxx"で区別される。

IPADDR、PREFIXは接尾に数字を付与することで増やすことも可能。
従来のIPエイリアス使うよりこちらの方が便利そう。というかnmcliではifcfg-xxxxとifcfg-xxxx:0は区別されてない。

PREFIX/NETMASK/NETWORK/BROADCAST辺りの設定の話
[RHEL6: PREFIX overrides NETMASK in `ifcfg - piyolian](http://piyolian.blogspot.com/2013/03/rhel6-prefix-overrides-netmask-in-ifcfg.html)

#7. 要調査検証
ゲートウェイやDNS設定はどのファイルが優先される?
PEERDNS、PEERROUTES、NM_CONTROLLEDの挙動
DEVICEが同じifcfgが複数ある場合の挙動
エイリアス(ifcfg-eth0:0等)とクローンってNetworkManagerではもうサポートされてない?
->一応エイリアスは有効っぽいけどnmcliでの挙動が怪しい…。素直に複数IP記載するか、どうしてもエイリアス使いたいならNetworkManager切った方が良さそう。
[インターフェース設定ファイル](http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/s1-networkscripts-interfaces.html)
[「ifconfig eth0:?」は古い！CentOS/RHELでのIPエイリアスの設定方法 - 旅モバ](https://www.tabimoba.net/entry/2013/11/28/205403#.XLa31Oj7RaQ)

#8. 最後に
この辺の情報がまとまったページが無かったので頭の整理がてら作成
補足・訂正・改善あればコメントお願いします。