インフラ・DevOps
Armadillo – ホームラボ向けGleam製DNSサーバー
Armadillo – A DNS Server in Gleam for Homelab Use (github.com)
要約
Armadilloは、Gleamで書かれたホームラボ向けの自己ホスト型DNSサーバーです。ルーターに一度設定すれば、ネットワーク上のすべてのデバイスがローカルドメインを自動的に解決できます。ローカルレコードはDNSゾーンファイルに保存され、ETSにロードされて高速なクエリ解決を提供します。
全文翻訳
Armadilloは、ホームラボ向けの自己ホスト型DNSサーバーで、Gleamで書かれています。
armadillo.showcase.mp4 ルーターにDNSリゾルバーとして一度設定するだけで、ネットワーク上のすべてのデバイスがローカルドメインを自動的に解決します。
仕組み
DNSクエリが到着すると、サーバーはまずローカルレコードストアをチェックします。一致するレコードが存在すれば、設定されたIPですぐに応答します。一致するレコードがない場合、クエリは設定可能なアップストリームリゾルバーに転送され、応答はTTLによってキャッシュされ、クライアントに返されます。ローカルレコードはDNSゾーンファイルに保存され、起動時にETSにロードされます。実行時のすべてのクエリ解決はETSのみを介して行われ、クエリ処理中にゾーンファイルが読み込まれることはありません。
コンテナイメージ
ghcr.io/vshakitskiy/armadillo:latest で利用可能です。
| 変数 | デフォルト値 | 説明 |
| -------------- | ---------- | ---------------------------------------- |
| DNS_PORT | 53 | DNSサーバーがリッスンするポート |
| DNS_UPSTREAM | 8.8.8.8 | 未知のドメインのアップストリームリゾルバー |
| DNS_TTL | 300 | ゾーンレコードのデフォルトTTL(秒) |
| DNS_SOA_MINIMUM | 3600 | ネガティブキャッシュのSOA最小TTL(秒) |
| API_PORT | 3000 | Web UIおよびREST APIのポート |
| API_SECRET_KEY_BASE | random key | セッションCookieの署名に使用されるシークレット |
| ZONE_FILE | /data/local.zone | DNSゾーンファイルへのパス |
ゾーンファイルを再起動後も保持するには、/data にボリュームをマウントしてください。ゾーンファイルが存在しない場合は自動的に作成されます。
デプロイガイド
デプロイガイドは examples/ ディレクトリにあります。
Podman — Caddyをリバースプロキシとして使用するPodman Quadletによるsystemdサービス。
Docker Compose — Caddyをリバースプロキシとして使用するマルチコンテナアプリケーション。
ドメイン命名
サーバーは任意のドメイン文字列を受け入れます。ただし、.local は避けてください。.local はmDNS/Bonjour (RFC 6762) 用に予約されており、AppleデバイスはユニキャストDNSサーバーに.localクエリを送信しません。.lan や .internal が一般的な代替案です。
貢献
貢献やフィードバックを歓迎します。Issueやプルリクエストも歓迎します!プロジェクトには3つのパッケージがあります。serverはDNSリゾルバーとHTTP APIを実行し、clientはWeb UI、sharedは両方で使用されるモジュールを含みます。各パッケージは独立して開発されており、server/ で gleam run を、client/ で gleam run -m lustre/dev を実行します。開発中にローカルで環境変数を管理するには、direnv を推奨します。sudoなしでローカルのポート53にバインドするには、BEAMバイナリでsetcapを実行します。
```bash
# バイナリを見つける: $(which erl) -noshell -eval 'io:format("~s~n",[os:find_executable("beam.smp")]),halt().'
# > /path/to/beam.smp
sudo setcap cap_net_bind_service=+ep /path/to/beam.smp
```
VPNでの解決
VPNでDNS問題に再度遭遇した場合の個人的なメモ。
vlessのようなVPNをプロキシモードまたはトンネルモードで実行する場合、VPNが正しいDNSを介してドメインを解決することを確認することが非常に重要です。ルーターのIP 192.168.1.1にDNSサーバーが設定されていると仮定します。
xrayの場合、ルーターをDNSサーバーとして追加し、LAN IPを直接ルーティングします。
```json
{
"dns": {
"servers": [
{
"address": "192.168.1.1",
"port": 53
},
"1.1.1.1"
]
},
"routing": {
"rules": [
{
"ip": ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"],
"outboundTag": "direct"
}
]
}
}
```
sing-boxの場合、ローカルDNSサーバーにタグを付け、プライベートIPを介してルーティングします。
```json
{
"dns": {
"servers": [
{
"tag": "dns-local",
"address": "192.168.1.1",
"detour": "direct"
},
{
"tag": "dns-remote",
"address": "1.1.1.1",
"detour": "proxy"
}
],
"rules": [{"ip_is_private": true, "server": "dns-local"}],
"final": "dns-remote"
},
"route": {
"rules": [{"ip_is_private": true, "outbound": "direct"}]
}
}
```