Ubuntu 16.04でNo-IPのダイナミックDNSサービスを使ってみた
背景
MacをPXEサーバにしてExpress5800/S70タイプRBにUbuntu16.04をインストールしてみた · hnakamur’s blog at githubで自宅サーバを起動したのですが、固定グローバルIPアドレスは持っていないので、ダイナミックDNS (DDNS) サービスを使うことにしました。
DDNSの無料サービスでオススメな3つの「ieServer」「mydns」「No-IP」の特徴と利用手順をまとめてみたを参考に「No-IP」を使ってみました。
アカウント登録
https://www.noip.com/ でメールアドレス、ユーザ名、パスワードを入力してサインアップし、確認のHTMLメールが届いたら[Activate Account]ボタンをクリックすればOKです。
ホストの登録
https://www.noip.com/ の右上の[Sign In]を押し、ユーザ名かメールアドレスとパスワードを入力してサインインします。サインイン後は https://my.noip.com/ に遷移します。
ホストの登録は新サイトの画面左の[Dashboard]を選んで、画面中央の[Quick Add]で[Hostname]を希望のホスト名を入力、[Doman]で使いたいドメインを選択して[Add Hostname]ボタンを押せばOKです。
あるいは画面左の[Dynamic DNS]の[Hostnames]メニューを選び、[Add Hostname]ボタンを押す方法でもOKです。この場合は[Add Hostname]というタイトルのポップアップが開きます。
[Hostname]に希望のホスト名を入力し、[Domain]は使いたいドメインを選びます。 [Record Type]はAのままでOKで、[IPv4 Address]にも自動で現在のグローバルIPアドレスが入力されているのでそのままでOKです。[Add Hostname]ボタンを押すと追加完了です。
なお、試していませんが、[Record Type]の[More Records]ボタンを押すと、以下の4つのラジオボタンが表示されました。
- DNS Host (A)
- DNS Alias (CNAME)
- Web Redirect
- AAAA (IPv6)
また、その下には “Manage your Round Robin, TXT, SRV and DKIM records.” という文が書かれており、 “Manage” の部分がリンクになっていました。これを押すと https://www.noip.com/members/dns/ のManage Hostsページに遷移しました。 no-ip は管理画面をリニューアル中で、こちらは旧画面のようです。 https://my.noip.com/#!/ の画面上部にある [Use Old Site] というリンクでも旧サイトのManage Hostsページが開きました。
新サイトの[Dynamic DNS]の[Hostnames]メニューで画面右に “Free Hostnames expire every 30 days. Enhanced Hostnames never expire. Upgrade to Enhanced” と書いてあるのですが、 Why did my free hostname expire or get deleted? | Support | No-IP の説明によれば無料サービスでも30日毎に更新していれば消えないようです。
IPアドレス自動更新用のクライアントnoip2をセットアップ
http://www.noip.com/ の画面上部の [Download] リンクをクリックすると、アクセスしているブラウザからOSを自動判定して、そのOS用のクライアントのダウンロードページが開きます。私の場合は Dynamic DNS Update Client (DUC) for Mac のページが開きました。
下の方にスクロールして [Other Downloads] の [Linux] をクリックして Dynamic DNS Update Client (DUC) for Linux - No-IP を開きます。
Installation のセクションに “UBUNTU USERS: You may install this with the apt-get command, see this guide” という文があり guide のリンクをクリックすると How to Install the Linux Dynamic Update Client on Ubuntu に遷移しました。このページの手順に従ってセットアップすればOKでした。
sudo -s
でパスワードを入力してrootになって以下のコマンドを実行します。
cd /usr/local/src
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
tar xf noip-duc-linux.tar.gz
cd noip-2.1.9-1/
make install
noip-2.1.9-1 のディレクトリ内を見るとソースファイルは noip2.c の1つでした。中を見てみるとライセンスはGPLv2 or laterです。ざっと見た感じでは不正な通信はしてなさそうでした。
インストール後以下のコマンドを実行して設定ファイルを作成します。以下のコマンドは全てrootで実行しています。
/usr/local/bin/noip2 -C
プロンプトが表示されたらNo-IPのユーザ名、パスワードと登録したホスト名を入力します。すると /usr/local/etc/no-ip2.conf に設定ファイルが作られます。viで中を見てみると一部テキスト、一部バイナリのファイルでした。
あとは /usr/local/bin/noip2
でデーモンが起動するのですが、systemdのサービスとして登録したいので、unitファイルを作りました。
ソースのディレクトリにdebian, gentoo, redhat用のinit.d用のスクリプトとmac用の自動起動スクリプトがありました。 redhat.noip.sh
を見ると、起動は /usr/local/bin/noip2
で、終了は killproc noip2 -TERM
で行っていました。
Ubuntuで試したら killproc
は無かったので killall
で代用しました。
以下のコマンドでunitファイルを作成します。
cat <<'EOF' > /etc/systemd/system/noip2.service
[Unit]
Description=No-IP.com DDNS client
After=network.target auditd.service
[Service]
ExecStart=/usr/local/bin/noip2
ExecStop=/usr/bin/killall -TERM /usr/local/bin/noip2
Restart=on-failure
Type=forking
[Install]
WantedBy=multi-user.target
EOF
作成したファイルをsystemdに読み込ませます。
systemctl daemon-reload
以下のコマンドでサービスの起動とOS起動時の自動起動設定を行います。
systemctl start noip2
systemctl enable noip2
ちなみに、 mac.osx.startup
では noip2 -S
の出力からpidを取得して noip -K $pid
で停止していました。こんな感じです。
for i in `noip2 -S 2>&1 | grep Process | awk '{print $2}' | tr -d ','`
do
noip2 -K $i
done
journalctlでログを見てみると以下のようなログが出ていました。
$ sudo journalctl | grep noip2
5月 02 10:54:07 express noip2[1082]: v2.1.9 daemon started with NAT enabled
5月 02 10:54:07 express noip2[1082]: xxxx.ddns.net was already set to xx.xx.xx.xx.
実際はxxxx.ddns.net はNo-IPで登録したホスト名と選択したドメインでxx.xx.xx.xxは自宅サーバのグローバルIPアドレスが出力されていましたが、セキュリティ上伏せています。
ポートフォワーディング設定
Ubuntuサーバを固定IPに設定
変更前の /etc/network/interfaces
は以下のようになっていました。
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto enp0s25
iface enp0s25 inet dhcp
enp0s25
の設定を Static IP Address Assignment を参考に固定IPにしました。
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto enp0s25
iface enp0s25 inet static
address 192.168.0.201
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 192.168.0.1
systemctl restart networking
で反映しました。
ip a
で確認すると、変更前にDHCPで発行されたIPアドレス 192.168.0.9
と上記で設定した固定アドレス 192.168.0.201
の両方が表示されました。
sshで作業していたのですが、以下のコマンドで消そうとしたらハマりました。
root@express:/etc/network# ip a del 192.168.0.9 dev enp0s25
Warning: Executing wildcard deletion to stay compatible with old scripts.
Explicitly specify the prefix length (192.168.0.9/32) to avoid this warning.
This special behaviour is likely to disappear in further releases,
fix your scripts!
packet_write_wait: Connection to 192.168.0.9: Broken pipe
コンソールからログインして ip a
で確認すると enp0s25
の inet
の行は両方共消えていました。
sudo systemctl restart networking
でネットワークを再起動して ip a
を実行すると inet
の行は固定IPの1行になりました。
上で表示されたWarningによると、正しくは以下のようにするべきだったようです。
ip a del 192.168.0.9/32 dev enp0s25
AirMacユーティリティでポートフォワーディング設定
Finderで「アプリケーション/ユーティリティ/AirMac ユーティリティ」を起動し、 Time Capsuleをクリックして開くポップアップの「編集」ボタンを押します。
「ネットワーク」タブで「ルーターモード」を「DHCPとNAX」にしておきます。
先程固定IPを 192.168.0.201
にしたのは「DHCPの範囲」が 192.168.0.2〜192.168.0.200
なので範囲外の値を選んだからです。なお、この範囲は「ネットワークオプション…」ボタンを押して変更可能です。
ポート設定の下の「+」ボタンを押すとポップアップが開くのでポートフォワーディングの設定を追加します。 ファイアウォール・エントリー・タイプは「IPv4ポートマッピング」固定で、ドロップダウンが disabled の状態になっていました。
プライベートIPアドレスは上記で設定したExpress5800の固定IPを入力します。
パブリックUDPポート、パブリックTCPポート、プライベートUDPポート、プライベートTCPポートにはフォワーデング元と先のポートを転送したい内容に応じて設定します。今回はTCPでsshのポートを指定しました。 なお、この記事では書いてないですが、パスワードアタック攻撃を回避するため事前にsshdは鍵認証のみ許可しパスワード認証は許可しない設定に変更しています。
ちなみにポートの範囲を指定して転送できるように AirMac Extreme (802.11n) ベースステーションを設定するによるとポートの入力欄は空白を開けずに XXX-YYY
のように書けば範囲も指定できるそうです。
設定を追加したら「保存」ボタンを押してポップアップを閉じ、「アップデート」ボタンで反映します。
おわりに
これでインターネットから自宅サーバにsshでログイン出来るようになって便利になりました。