初めに
今回、さくらのクラウドでサーバのクローンを作ってみました。よく考えずに、全く設定を変えずにストレージ内容そのままのクローンをつくると外部から接続できなくなったときの対応した手順です。
暫定対応
とりあえずSSHが繋がらないと話にならないので、ブラウザでさくらのクラウドの管理画面にアクセスし、該当するサーバのコンソールにアクセスする。
コンソール画面にアクセスし、まず ufw を確認、OpenSSHがあり、sshdも動いているので問題なし。
ufw app list
ping 等をしてみるとどこにもアクセスできないので、netstat -r で確認すると、何も設定されていない。なので、管理画面のサーバの情報を参考に、route コマンドで設定しようとすると、eth0 がないとのメッセージが出る
route add -net XXX.YYY.ZZZ.0 netmask 255.255.255.0 eth0
SIOCADDRT: No such device
疑問に思いつつ ifocinfg -a で確認すると、eth0 がなく、eth1 がある。試しに eth1 に設定すると外部から無事sshなどのアクセスができるようになった。
route add -net XXX.YYY.ZZZ.0 netmask 255.255.255.0 eth1
route add defalt gw XXX.YYY.ZZZ.1 eth1
とりあえずの危機は脱したが、まだ eth0 はない。
eth0の設定
ネットワークインターフェースの設定ファイルを確認すると、クローン前の情報のままだった。eth0に正しいアドレスに書き換えて再起動する。
vi /etc/network/interfaces
reboot
でも相変わらず、eth1に割り当たる。なので、dmesg で起動時のログを確認すると以下のように、eth0 が eth1 にリネームされていることがわかった。
[ 2.075860] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 2.573261] systemd-udevd[299]: renamed network interface eth0 to eth1
この原因についてネット上を検索してみると、Macアドレスが競合してる可能性が考えられるらしい。というので、udevのルールファイル
/etc/udev/rules.d/70-persistent-net.rules
を見るとしっかり eth0 にクローン前の、eth1 には、ifconfig -a で確認できるMACアドレスになっていました。NICは一つしかつかわないので、eth0 に、正しいMACアドレスを設定。
# PCI device 0x1af4:/sys/devices/pci0000:00/0000:00:03.0/virtio0 (virtio-pci)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="9c:a3:ba:aa:bb:cc", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
こでで再起動すれば無事、eth0で使えるようになった。
蛇足
ついでにホストネームの変更(/etc/hostname)と、名前解決(/etc/hosts)も直しておく。
結論
ストレージの内容そのままにクローンのサーバをつくると。元の設定が競合して問題になることがある。当然といえば、当然の話なのだが、今回はうっかりしていました。
理由を考えると、AWSのEC2のDuplicationと同じ感覚でクローン操作したのが一因かもしれない、AWSの場合、IPアドレスはデフォルトではDHCPで設定されるのでとりあえず繋がっていた。もっとも、AWSのEC2はコンソールにアクセスはできないので、SSHが繋がらなくなると直接手を出せなくなってしまいます。ブートに使うEBSを、他のEC2にマウントして編集という技もありますが。