日誌(2026-01-04)
Firewallのミスで投稿があいた
2日にWebサーバーを設置し初めての投稿をしました. 「せっかくだし日誌を投稿していこう」と考えていたのですが早速1日空けてしまいました. 三日坊主ですらなかったですね.
昨日はDjangoのAdminページへのアクセスを制限しようとしたらFirewallをおかしくしてしまいWebサーバにアクセスできなくなっていました.
DjangoというのはWebサイトを配信してくれるようなものです.このDjangoではWebサイト全体の制御のために管理者(Admin)用のページが用意されるのですが そこに簡単にアクセスできると脆弱性になりそうに思えたのでローカルネットからのみアクセス可能という設計でした.
しかしなんと,昨日外部からアクセスできることに気がついちゃったのです.この解決に昨日と今日の半分を使った気がします.
管理者ページに入れた原因は複雑なルーティング
原因は複雑なルーティングのせいでした.
その時の構成では,ネットワークの出入りを監視するコンテナを用意し,基本的に全てのパケットはそこを通過するようになってました.
外部 (203.0.113.5)
↓ DNAT
ホスト (160.251.139.58)
↓ DNAT
network-gw (10.68.2.2)
↓ DNAT + Masquerade
nginx (10.68.2.3) <~ 送信元: 10.68.2.2 に書き換わる
そうなるとどうしてもDNATが2段くらいになり,Masqueradeによって接続元が全部そのネット監視コンテナのIPに書き変わっていたのです.
送信元が全部コンテナIP,つまり内部ネットのIPになるわけですから,Adminページにも入れちゃうというわけでした.
コンテナを通すのを諦めてホストで監視
原因が複雑なルーティングによる多段のDNATだったので解決策もいくらか出てきます.
その中で一番単純で簡単で確実なのがネットの通信を監視するコンテナを撤廃することです. ホストでFirewallの設定をし,ルーティングを調整すれば本来なくてもいいコンテナです.
個人的にはあったほうが,設定の引継ぎなりバックアップ,ロールバック,環境の分離による問題発生時の被害の封じ込めなど, それなりにメリットは感じてました.
特に大事だったのがロックアウト対策です.管理者なのに設定に失敗してサーバーから締め出されアクセスできない,なんてなるのはごめんです. これはSSH接続をコンテナに回さないようにすることで成していました. これでコンテナ内でFirewallの設定を間違えてもロックアウトされることはほぼほぼないはずです.
とはいえだいぶ開発も進行していて,現在はFirewallの設定を更新するプログラムに,SSHなどの接続が切れてないかをチェックする機能を実装しました. これによって,このプログラムからFirewallを更新する場合は基本的にロックアウトはされないはずです.
逆に言えば,横着してこのプログラムを介さずにFirewallを変更したら,ロックアウトされかねません.
横着や「まぁええか」が引き起こす問題は少なくないから,きっといずれロックアウトされそうですね.
ともあれ,コンテナを取っ払い,ホストでFirewallの設定やルーティングの設定をして,シンプルな構成にしました.
外部 (203.0.113.5)
↓
ホスト (160.251.139.58)
↓ Incus network forward
nginx (10.68.2.3) <~ 送信元: 203.0.113.5 のまま
これでNginxによるブロックが効きます.
Netmakerのインストール方法は実質的にDockerのみ
サーバではNetmakerも回しているのですが,ちょっと複雑な構成をしててDocker in LXCになってます. これが気持ち悪かったので解消したかったんですよね.
また,解消する動機も増えました.それはCoreDNSの分離です.
現在,NetmakerのDNS機能が多段のNAT超えの影響やWindows環境での非サポートで使えない状況でした. ですが,コンテナの識別にもVPN内でのデバイスの識別にもDNSはあったほうが便利です. であれば,自分でCoreDNSを立ててしまおうということです.
Netmakerの公式の声明では依存関係の多さからDocker Installを勧めていますが, 僕の状況では,リバースプロキシとDNSは自前で用意になりそうなのでBinary Installでも良いと判断しました.
ところが,調べてみると公開されてるnetmaker-uiが古く(0.19), 新しいバージョンのはどこだ?というIssueも上がっていました. そのIssueへの公式の返答は半年たっても無い様子です.
「Docker ImageのバージョンがNetmakerのバージョンに合わせて書き換えられてるだけで,内部ではVersion 0.19を使っているかも」と思い Netmaker 1.4 + netmaker-ui 0.19 で入れてみましたが,UIが全く違いました.
ということで,残念ながらNetmakerのBinary Installは諦めました. おそらく最新のNetmakerにあうnetmaker-uiは公開されていないのでしょう. netmaker-uiが必要な場合はDocker以外の方法は今のところなさそうです.
あるいは,netmaker-uiのDockerコンテナから持ってくるか.でも,そこまでするメリットは基本的にない気がします.
これを突き詰めて調べるだけで今日は終わりました.
CoreDNS
何度か挑戦し,セルフホストを諦めてたDNS.Wireguardを使ってるとやっぱりほしいので再挑戦です.
とはいえ,昔と違い僕にはClaude Codeがいる.何とかなる気がします.
浅知恵を武器に変えてくれる.それが昨今のLLMの一面な気がします.まぁもろい武器でもあるけど.
今日は下準備をして終えました.本格的には明日以降ですね.でも,だいぶ先延ばしにしちゃいそうです. 他にやることもあるし,なくても何とかなるし,やっても自分の力にあまりならないし...
その他,細々とした作業
ネット監視用のコンテナをなくしたときに,何故かNginxを動かしてるコンテナから他のコンテナへのアクセスができなくなりました. ちゃんとした理由は今も不明です.
とりあえずNginxコンテナのネットワークを再起動したら治りました.
後はfail2banのバグでログを読み込んでないという致命的なバグがあったことですね.これはネット監視コンテナを消した後にアクセスのテストをしてて なぜかBanされる状況でされず判明しました.単純に設定ミスでした.