とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

【Raspberry Pi3+CentOS7】NIC2枚差しの設定をした

はじめに

Raspberry Pi3+CentOS7の環境にSoftEtherVPNを設定したときの自分用メモです。

なぜNICを2枚差したのか?

SoftetherVPNの公式にはVPN専用のNICを追加した方が良いと書いてあり、言われるがママ素直にRaspberry PiにUSB-NICを1つ追加しました。
3.6 ローカルブリッジ - SoftEther VPN プロジェクト

まあ当然、追加しただけでは正しく動作しないのでネットの情報を鵜呑み参考にしながら設定を行いました。


以下、作業メモです。

Raspberry Piのネットワーク

192.168.30.40  12:34:56:11:11:11  eth0 (Raspberry Piに元からあるLANポート)
192.168.30.50  ab:cd:ef:22:22:22  eth1 (USB-NIC)

DHCPで固定アドレスを割り当ててます。

問題の発生

WindowsコマンドプロンプトからARPテーブルを確認したところ、

> arp -a
インターネット アドレス 物理アドレス   
192.168.30.40           12-34-56-11-11-11
192.168.30.50           12-34-56-11-11-11

あれ??
異なるIPアドレスに対して同じMACアドレスが割当たってます。
正解は以下の通りです。

192.168.30.40         12-34-56-11-11-11
192.168.30.50         ab-cd-ef-22-22-22

では、ネットワークの設定が正解になるように対応を行います。

異なるIPアドレスMACアドレスが同じになる原因

eth1で受けた通信をeth0から返信しているため。

//tcpdumpコマンドで確認済です。
//ログは省略。

対応方法の概要

NICを2枚を差したときに発生するありがちな問題のようで、マルチホーミング設定を行います。
http://d.hatena.ne.jp/hirose31/20120822/1345626743
http://takumicloud.jp/blog/2015/11/30/nw/
http://ibucket.blogspot.jp/2010/07/centos.html

手順

$cat  /etc/iproute2/rt_tables

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep

100     subroute-eth1   <- 追加
$ ip rule add from 192.168.30.50 table subroute-eth1 prio 100
$ ip route add table subroute-eth1 192.168.30.0/24 dev eth1 scope link proto kernel
$ ip route add table subroute-eth1 default via 192.168.30.1 dev eth1

反映されているか確認します。

$ ip route show table subroute-eth1
default via 192.168.30.1 dev eth1
192.168.30.0/24 dev eth1 proto kernel scope link
$ ip rule
0:      from all lookup local
100:    from 192.168.30.50 lookup subroute-eth1
32766:  from all lookup main
32767:  from all lookup default

OSの再起動対応

以下ファイルを作りCentOSの再起動で設定が消えないようにします。
/etc/sysconfig/network-scripts/{rule,route}-eth1

手作業でファイルを作ると間違う可能性があるので、
CentOS7ではnmcliコマンドを使うのを推奨されていますが、
何故か、nmcliコマンドでポリシーベースの設定は出来ないようです(注意、2015年の古い情報です)
https://www.centos.org/forums/viewtopic.php?t=50400
https://mano.xyz/2033/

nmcliコマンドで設定が可能なら誰か教えて欲しい・・・

しかたないので今回は以下のファイルを手作業で作りました。

$ cat /etc/sysconfig/network-scripts/route-eth1
192.168.30.0/24 dev eth1 src 192.168.30.50 table subroute-eth1
default via 192.168.30.1 dev eth1 table subroute-eth1
$ cat /etc/sysconfig/network-scripts/rule-eth1
from 192.168.30.50 table subroute-eth1 priority 100

NetworkManager-config-routing-rulesの起動

CentOS7をMinimalで構築している場合は以下パッケージをインストールして起動します。

$ yum install NetworkManager-config-routing-rules
$ systemctl enable NetworkManager-dispatcher
$ systemctl start NetworkManager-dispatcher

こうしないと /etc/sysconfig/network-scripts/{rule,route}-eth1 の設定がネットワークに反映されません。

NetworkManagerの再起動

$ systemctl restart NetworkManager

再起動後の設定を確認する

$ ip route show table subroute-eth1
default via 192.168.30.1 dev eth1
192.168.30.0/24 dev eth1 scope link src 192.168.30.50
$ ip route
default via 192.168.30.1 dev eth0 proto static metric 100
192.168.30.0/24 dev eth0 proto kernel scope link src 192.168.30.40 metric 100
192.168.30.0/24 dev eth1 proto kernel scope link src 192.168.30.50 metric 101
$ ip rule
0:      from all lookup local
100:    from 192.168.30.50 lookup subroute-eth1
32766:  from all lookup main
32767:  from all lookup default

その他

VPN接続はパケット転送をおこなわなくても出来るはずなので無効化しています。

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

VPN接続

SoftEtherの設定、サービス起動(systemctlコマンド)とファイヤウォールの設定(firewall-cmd)を行って、Android端末からVPN接続出来ることを確認できました。
めでたしめでたし

最後に

CentOSWindowsと比べるとネットワークを細かく制御できる分めんどうですね。
少しずつ勉強します、めでたしめでたし、



と終わりたいところですが、
OSを再起するとNICを認識する順序によってVPN接続できなくなります、ググるCentOS界隈ではよくある現象でNICの名前(ifcgf-eth0, ifcfg-eth1)を固定する設定が必要になります。
おいおい初見殺しだな


(参考)
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/appe-Consistent_Network_Device_Naming
RHEL7のNICのネーミングルール - めもめも
mrwk update: systemd-udevdによるNIC命名とbiosdevnameがまざって混乱する件
CentOS7におけるNIC命名ルール - 雑木林