先日、Raspberry Pi 4にRHEL9互換OSのRocky Linux 9をインストールしまして。
transixのIPv6 IPoE環境から、IPv4 PPPoE接続をしてみました。
固定IPアドレスの契約をしなくても、外出先からRaspberry Piにアクセスできるように。
Rustベースの新しいNo-IP 3 DUC(Dynamic Update Client)をRocky Linux 9で動かして、PPPoE接続したIPアドレスを自動登録できるようにしたいと思います。
目次
No-IP 3 DUCインストール手順 Rocky Linux 9版
どうもFedora Linux 38では、No-IP 2 DUCがdnfコマンドでインストール可能になっているようです。
一方、RHEL9互換のRocky Linux 9は、dnfコマンドによるインストールはまだできないようです。
今回、No-IP Ver. 2ではなく、Ver. 3を使用する理由は、systemdによるユニットに公式に対応しているためです。
つまり、No-IP DUCをデーモンとして動かしたい場合に、公式手順で動かすことができることが大きな理由になります。
Cargoによるビルド準備
いつも通り、No-IPのビルド環境をインストールしようと思います。Rocky Linuxの場合、インストール可能なdnfグループはこのあたりのようです。
「Develoment Tools」をインストール開始。
sudo dnf groupinstall -y "Development Tools"
しかし、今回インストールするNo-IP 3 DUCは、Rustベースでした。Develop Toolsに入っていない予感が。
改めて、rustとcargo、それと展開用のtarをインストールしました。
sudo dnf install -y rust cargo tar
Rustソースコード取得
ソースコードのtarボールをダウンロードさせて頂きます。(さてtarボールってなんでしょう
curl -o noip-duc_3.0.0-beta.7.tar.gz https://dmej8g5cpdyqd.cloudfront.net/downloads/noip-duc_3.0.0-beta.7.tar.gz
gz圧縮を展開し、tarアーカイブからファイルを復元しませう。
tar zxvf noip-duc_3.0.0-beta.7.tar.gz
しかしアーカイブはtar(伝説
昔と今が混在している感じがします(余談
うまくビルドできるのでしょうか?(混乱
ビルド
そういえば、Rustのビルドは私は初めてです。cargoでビルドするのですね。
cd noip-duc_3.0.0-beta.7
cargo build --release
最後のここが長いですね。リンクしている感じでしょうか。
target/releaseディレクトリに、リンクされた実行バイナリができました。
Raspberry Pi 4のRocky Linux 9にて、RustベースのNo-IP 3 DUCのビルドが成功したようです。
インストール
インストールは手動で行います。
sudo cp target/release/noip-duc /usr/local/bin
動作確認のため、手動でnoip-ducコマンドを実行しました。
既定では5分おきにIPアドレスが更新されるようです。
ヘルプを見たところ。正直、ヘルプが長くてちょっと引きました。
- -gオプションでホスト名
- -uオプションでユーザ名
- -pオプションでパスワード
最低限、この3つを指定すると、no-ipプロセスが5分おきにIPアドレスを更新してくれるようです。
ビルドしたnoip-ducコマンドで、確かにDynamic DNS No-IPのIPアドレスを登録できるようになりました。
デーモン化
最後に、systemdでNo-IP 3 DUCを自動起動して、No-IP Dynamic DNSのIPアドレスを自動更新できるように設定したいと思います。
noip-ducファイルの置き場所ですが、公式設定では/usr/bin/noip-ducに置くのですね。
そして設定ファイルは/etc/default/noip-ducファイルになります。
# /usr/bin/noip-duc作成
sudo cp /usr/local/bin/noip-duc /usr/bin/
# noip-ducユニットファイルを作成
sudo cp debian/service /etc/systemd/system/noip-duc.service
# /etc/default/noip-duc設定ファイル作成
cat << EOF | sudo tee /etc/default/noip-duc
## /etc/defaults/noip-duc (Debian) or /etc/sysconfig/noip-duc (RedHat, Suse)
## or anywhere you like.
NOIP_USERNAME=
NOIP_PASSWORD=
## Comma separated list of hostnames and group names
NOIP_HOSTNAMES=
## Less common options
#NOIP_CHECK_INTERVAL=5m
#NOIP_EXEC_ON_CHANGE=
#NOIP_HTTP_TIMEOUT=10s
## ip methods: aws, http, http-port-8245, static:<IP>
#NOIP_IP_METHOD=dns,http,http-port-8245
#NOIP_LOG_LEVEL=info
## Daemon options should not be set if using systemd. They only apply when `--daemon` is used.
#NOIP_DAEMON_GROUP=
#NOIP_DAEMON_PID_FILE=
#NOIP_DAEMON_USER=
EOF
# 作成した/etc/default/noii-duc設定ファイルを編集
sudo vi /etc/default/noip-duc
次の3つの設定を行う感じです。
- NOIP_USERNAMEにユーザ名を入力
- NOIP_PASSWORDにパスワードを入力
- NOIP_HOSTNAMESにホスト名をカンマ区切りで入力
設定を保存しましたら、最後にsystemdのユニットを有効化します。
sudo systemctl daemon-reload
sudo systemctl enable noip-duc.service --now
以上で、noip-duc.serviceユニットがsystemdにより自動起動して。
/etc/default/noip-duc設定ファイルをもとに、/usr/bin/noip-ducが自動起動する動作になります。
ジャーナルの確認
systemdのunitということで、journalctlコマンドでログ、ジャーナルを確認できます。
sudo journalctl -x -u noip-duc.service --no-pager |less
# >ボタンで最後尾に移動
# bボタンでページ戻り、スペースでページ送り
PPPoE接続とNo-IP DUCとの連携は
今回、PPPoE接続はNetworkManagerを使用させて頂きました。
以前の、rp-pppoeやpppoeconfを使用した接続では、接続のタイミングでスクリプトを動かすことも可能でした。
一方、NetworkManagerはsystemdのユニットに組み込まれており、連携させるとすると、systemdの仕組みの中で行う必要がありそうです。
今のところ連携はせず、noip-duc.serviceユニットは動かした状態にします。次の動きになります。
- PPPoE接続すると、インターネット接続の経路がppp0になり、No-IPにppp0のアドレスが登録される
- PPPoEを切断すると、インターネット接続の経路がeth1に戻り、IPv6 IPoEの共有アドレスが登録される
まあ逆に考えると、切断している状況を、No-IPに登録したIPアドレスから判別できるため、かえって良いかなとも考えています。
以上で、Raspberry Pi 4で起動したRocky Linux環境から、No-IP 3 DUCによるDynamic DNSのIPアドレスの自動更新が可能になりました。
No-IP 3 DUCはRustベースですが、Cargoによるビルドと、systemdによるユニット化により、デーモン化しても問題なくDynamic DNSのIPアドレスを既定で5分おきに更新できるようになりました。
次はサーバのホスティング化を取り上げたいと思います。