BeagleBoneBlackにUbuntuをクリーンインストールし、無線LANを接続したところ、外部のネットワークに接続できないという問題が発生。
linuxの初歩的な問題なのか、ネットで調べてもなかなか適当な解決方法が見つけられず、個人的に結構悩んでしまった問題なので記録として残しておきます。
症状
BeagleBoneBlackにインストールした直後のUbuntu16.04LTSが、ローカルネットワークに接続できるが、外部ネットワーク(yahooやgoogleなど)に接続できないといった症状です。
正確にいうと、pingでIPで外部ネットワークを指定すると接続できるのですが、ドメイン(www.yahoo.co.jpやgoogle.com)で指定すると、全て「172.x.x.x」という間違ったIPで接続が割り当てられてしまうという症状です。(一応、良くわからない接続先には繋がっているっぽい?)
困ったことにapt-get updateでlinuxをアップデートしようとしても「172.x.x.x」に接続されてしまい、アップデートできません。
※ちなみに、172.x.x.xは自宅のグローバルIPではありません。
原因
ローカルネットワークには接続できるので、同じネットワークのPCからSSH接続で遠隔操作は可能です。という事で、ネットワークドライバやルーターが原因ではなさそうです。
ネットでいろいろ調べてみると、これはDNSに対し名前解決が出来ていない事が原因だろうという事が分かりました。
解決方法
解決の手掛かりになったのがこちらのサイト。
「インストールした直後のLinux(Redhat,CentOS系)が外に繋げない(名前解決してくれない。yumできない)。」
解説しているlinuxのディストリビューションがubuntuではありませんから、微妙にフォルダ名が違いますが、ほぼ書いてある内容通りで解決できました。
原因は/etc/resolv.confに記載されたnameserver。
まず、sudo vi /etc/resolv.confと入力して編集画面を表示させます。
※viはlinuxのテキストエディタ。使い方は独特なのでググってください。
中身を見ると、nameserverが127.0.0.1となっています。127.0.0.1は自分自身を示す仮想的なIPアドレスです。これを「nameserver 8.8.8.8」と編集すれば良いらしい。
※8.8.8.8はGoogleのpublic DNS
編集したら保存してviを終了させます。
外部へ接続
さっそくpingで接続してみます。
今度はyahooとgoogleに接続してみましたが、接続先によってIPが変わっています。
アップデートも試してみましたが、こちらもOK!無事、ネットワークに接続できるようになりました。
設定が保存されない問題が発生
無事、ネットワークに接続できるようになったのですが、linuxを再起動するとnameserverの値が127.0.0.1に戻ってしまうという新たな問題が発生しました。
どうやら/etc/resolv.confは直接編集しても再起動で元に戻されてしまうようなのです。
この原因を解決するには、/etc/resolv.confを編集するのではなく、
/etc/resolvconf/resolv.conf.d/head
をviで開き、「nameserver 8.8.8.8」と編集&保存します。
最後に、
sudo resolvconf -u
と入力して設定を反映します。
これで再起動しても設定が保存されるのでそのまま外部にアクセスできるようになりました。
コメント