OCN にぶら下がってる自宅に外から入るために IPoE ではなく PPPoE で IPv4 拾うために、仮想サーバー上に sshd server 立てている。
普段は ufw で port 塞いでおいて、必要なときだけ knockd 叩いて port 22 開けるようにしてるんだけど、knockd の自動起動がうまく行ってないという前からの懸案事項。
一応、/usr/lib/systemd/system/knockd.service 見ると
なぜか networking.service で ppp0 が接続確立する前に knockd.service が起動してしまうらしく、ppp0 がないとか言われて起動しない。
また、ppp0 の接続確立後に手動で knockd を起こした場合でも、何らかの原因で ppp0 の接続が切断すると knockd が落ちるんだけど、再度接続した際に自動で起動してくれない。
普段は ufw で port 塞いでおいて、必要なときだけ knockd 叩いて port 22 開けるようにしてるんだけど、knockd の自動起動がうまく行ってないという前からの懸案事項。
一応、/usr/lib/systemd/system/knockd.service 見ると
[Unit] Description=Port-Knock Daemon After=network-online.target Wants=network-online.target Documentation=man:knockd(1)ってなってるので、networking.service の起動を待った上で knockd.service は起動するはずなんだけど、
なぜか networking.service で ppp0 が接続確立する前に knockd.service が起動してしまうらしく、ppp0 がないとか言われて起動しない。
また、ppp0 の接続確立後に手動で knockd を起こした場合でも、何らかの原因で ppp0 の接続が切断すると knockd が落ちるんだけど、再度接続した際に自動で起動してくれない。
Microsoft Copilot 先生にお伺いを立ててみたところ、
質問:
回答:
ということで、
を作って、
質問:
Ubuntu で ppp0 が接続確立したら knockd -i ppp0 起こしたいんだけどどうしたら良い?
systemd で After=network-online.target になってるので、ppp0 起こしてる networking.service の終了待って、knockd 起動してるはずなんだけど、なぜか ppp0 接続前に knockd 起きようとしてるみたいで ppp0 がないので起動に失敗するし、あとで手動で起動しておいても、ppp0 の接続切れると knockd が落ちるし、ppp0 の接続が回復しても自動で起動しないんだ。
回答:
この問題は少し複雑ですが、いくつかの対処方法を試してみる価値があります。以下に提案をまとめました: 1. **サービス依存関係の見直し**: `knockd` を正しく起動するために、systemd のユニットファイルに依存関係を追加する必要があるかもしれません。具体的には、`ppp0` が確立されるまで待機する仕組みを構築する必要があります。 - `knockd.service` ファイルに `ExecStartPre` を追加して、`ppp0` が存在するかどうかを確認するコマンドを実行することができます(例: `ExecStartPre=/bin/bash -c 'until ip link show ppp0; do sleep 1; done'`)。 2. **接続状態の監視**: PPP 接続が確立したタイミングを検知するために、`/etc/ppp/ip-up.d/` スクリプトを利用することができます。`ip-up` スクリプトは PPP 接続が確立したときに自動的に実行されるので、このスクリプト内で `knockd` を起動するコマンドを追加することが可能です。 - `/etc/ppp/ip-up.d/knockd` のようなスクリプトを作成し、内容を以下のようにします: ```bash #!/bin/bash /usr/bin/knockd -i ppp0 ``` 3. **接続切断時の処理**: PPP 接続が切断された際に自動的に処理を行うためには、`/etc/ppp/ip-down.d/` スクリプトを利用できます。これにより、`knockd` を停止する処理を組み込むことができます。 4. **接続状態を監視するスクリプトの自動実行**: 上記の方法で解決できない場合、独自の監視スクリプトを作成し、`systemd` タイマーで定期的に実行することも考慮できます。このスクリプトでは `ppp0` の存在をチェックし、接続が確立している場合に `knockd` を再起動する仕組みを組み込むことができます。 一つずつ試していただき、挙動が安定するか確認するのが良いかと思います。もしさらに詳細が必要であれば教えてください、また別の方法を一緒に考えます!
ということで、
を作って、
sudo chmod +x /etc/ppp/ip-up.d/00knockdしてみたところ、
sudo poff dsl-provider sudo pon dsl-providerで knockd が自動的に終了・起動することを確認できた。
タグ
コメントをかく