ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

【未解決】複数のNICを持つCentOS 7.3/Scientific Linux 7.3などでSSH接続するとなかなか接続できない原因を探ったけどダメだった

最近困っているネタ。ちなみに未解決です。

起きた問題

  • VirtualBoxにインストールしたCentOS 7.3/Scientific Linux 7.3
  • 各OSは7.3の最新版、カーネルは「3.10.0-514.16.1.el7」を利用
  • 最初のNICにポートフォワーディングを設定してSSHアクセス
  • 「Connection closed」 or 「Connection reset」エラーとなり、しばらく接続できない

考えたこと

パッチのバグ

yum update後起きることが多かったので、Device Mapper、Network Manager、Systemd、Firewalldの何れかのパッチのバグかなと思って少しずつパッチを適用しては確認をしてみましたが、該当のパッチを当てなくても起動、再起動を繰り返すと症状が再現するのでこの線はないと判断しました。

NetworkManagerを無効にしたらどうか?

「NetworkManagerを無効にしたらどうかな」と思い、無効化してみました。するとip addr addコマンドでIPアドレスを割り当ててもさっぱり張り付きません。ifconfig ethX up/downコマンドも想定通り動かず、pingも通りませんでした。tcpdumpで調べるとそもそもパケットが来てないという状況。というわけで、Network Managerは元に戻しました。

NICの自動命名を無効に設定する

GRUB_CMDLINE_LINUX行にnet.ifnames=0を追加する」ことで実現できる方法です。NICの名前が接続方法によってユニークな名前(ensXXXとかenpXXXとか)にならなくなり、従来のethXみたいな形式に戻ります。 ただしこれをやると一見まともに動くように見えますが、再起動を繰り返すとIPアドレスを取得しなくなり、SSHアクセスできないし、その上ifconfig ethX up/downをいくらやろうがIPアドレスが設定されなくなり、泥沼にはまります。

もうやだこのOS

問題の起きる条件

NIC1はNATでポートフォワード設定を行っています。NIC2とNIC3はBondingをして使う予定なのでL2に接続しただけの状態です。CentOS 7はNetworkManagerがデフォルトで設定されているため、Upした状態になっています。

起きる問題

なかなか接続できない時はNAT接続のNICが後ろに来ているとき eth0がNAT接続のNIC、eth1とeth2がHost-Onlyを使っている場合です。

問題ないパターン

このように並んでいる時は問題ありません。

lo:
eth0:
eth1:
eth2:

なかなか接続できないパターン

IPアドレスが設定されているeth0が後ろに来るとなかなか接続できなくなります。このパターンだとPingはなかなか通らないです。

lo:
eth1:
eth2:
eth0:

NICの認識順が再起動を繰り返すとあべこべになることがあります。 ダメなパターンに陥ると、次のようになかなか接続できなくなることがあります。

問題は「Connection reset by peer」と言われたり、「Connection closed by remote host」と言われたりすることでしょうか。エラーが一定しないのはちょっと面倒くさかったです。

% ssh root@localhost -p 58022
ssh_exchange_identification: read: Connection reset by peer
% ssh root@localhost -p 58022
ssh_exchange_identification: Connection closed by remote host
% ssh root@localhost -p 58022
ssh_exchange_identification: Connection closed by remote host
% ssh root@localhost -p 58022
ssh_exchange_identification: Connection closed by remote host
% ssh root@localhost -p 58022
ssh_exchange_identification: read: Connection reset by peer
% ssh root@localhost -p 58022
ssh_exchange_identification: Connection closed by remote host

というかバージョン6まではこんな問題ではまらなかったんだけどなあ…相変わらずEL7系は慣れません。