ansibleguy.infra_wireguard
Ansible Role - WireGuard サイト間 VPN
WireGuard サイト間 VPN 設定を展開するための役割です。
テスト済み:
- Debian 11
- Raspbian 11
- Debian 12
インストール
# 最新版
ansible-galaxy role install git+https://github.com/ansibleguy/infra_wireguard
# galaxy からインストール
ansible-galaxy install ansibleguy.infra_wireguard
# カスタムロールパスへのインストール
ansible-galaxy install ansibleguy.infra_wireguard --roles-path ./roles
# 依存関係のインストール
ansible-galaxy install -r requirements.yml
python3 -m pip install -r requirements.txt
コントリビューション
自由に行ってください:
PR を開く
ディスカッションを始める
問題を報告 => 下のトラブルシューティングガイドを確認した後に!
使用方法
簡単な Ansible GUI が欲しいですか?私の Ansible WebUI をチェックしてください。
例
詳細な設定例とその結果をいくつか紹介します:
設定
複数のホストまたはホストグループにまたがる WireGuard トポロジーを定義できます。
ロールは、現在のターゲットホストが参加しているトポロジーのみをフィルタリングして設定します。
これらのピアキーは、Ansible インベントリのホスト名と一致する必要があります!
wireguard:
restart_on_change: true # 変更があった場合に wg サービスを再起動する
topologies:
dc_nl:
type: 'single'
peers:
srv02:
Endpoint: 'srv02.wg.template.ansibleguy.net'
Address: '10.100.0.1/30'
srv03:
Endpoint: 'srv03.wg.template.ansibleguy.net'
Address: '10.100.0.2/30'
ホストキー ファイルを暗号化するために 'ansible-vault' を使いたいかもしれません:
ansible-vault encrypt roles/ansibleguy.infra_wireguard/files/keys/some_file.key
実行
プレイブックを実行します:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml
もし暗号化されたキーを使用している場合は:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml --ask-vault-pass
便利な タグ もいくつかあります:
- base
- config
- tunnels
- purge
特定のトポロジーだけをプロビジョンしたい場合は、実行時に次の変数を設定できます:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e only_topo=TOPOLOGY_KEY
機能
パッケージインストール
- WireGuard
- Resolvconf (名前解決)
設定
トポロジーをマッピングすることにより簡易設定
サポートされるトポロジー:
キー
- トポロジー内の各ホストの公開/秘密鍵ペアを生成 (WGは公開鍵でピアを特定します)
- 一貫性のためにキーをコントローラーに書き込みます
ルーティング
- ルーティングは管理するのはあなた自身です!自動追加された WG ルートを有効にすることもできますし、カスタムのアップ/ダウンスクリプトを追加することもできます。
デフォルト設定:
- ファイルに秘密鍵を保存
- ルートの自動追加を無効化 (ロックアウト防止 & カスタマイズ)
- インスタンス識別子を伴う syslog ロギングを有効化
- 変更時に wg サービスを再起動
デフォルトのオプトイン:
- 追加のセキュリティのために PSK を使用
- 孤立したトンネルの削除
デフォルトのオプトアウト:
- 名前解決のオーバーライドのための 'resolvconf' のインストール
- トラフィック転送 (ルーターのように)
機能:
- サービスの再起動/開始が失敗した場合の最後のログの表示
- 動的ピアの自動接続
情報
注意: このロールは現在、Debian ベースのシステムのみをサポートしています。
注意: ロールのほとんどの機能はオプトインまたはオプトアウトできます。
利用可能なすべてのオプションについては、メインデフォルトファイル内のデフォルト設定を確認してください!
警告: あなたが提供するすべての設定/変数が有効性をチェックされるわけではありません。不適切な設定はロールを壊す可能性があります!
警告: WireGuard のアップ/ダウンスクリプトは、トンネルサービスが立ち上がるときに実行されます;トンネル接続ではありません。
ルートやメトリックの計画/設定の際にこのことを考慮する必要があります。
情報: トポロジー名は短めに保つべきです。特別な文字を使用しないように努力してください => 自動的に削除されます ('_'、'='、'+'、'.'、'-' 以外) ので、キーは有効なインターフェース名になります!
情報: インターフェースにはプレフィックスが付加されます:(提供された場合は変更可能)
- シングル => wgs_
- スター => wgx_
- メッシュ => wgm_
情報: テストの実行方法はこちらに記載されています。
情報: ホストキーはデフォルトでロールの 'files' ディレクトリに保存されます。
このキー用ディレクトリは 'controller_key_store' 変数を使って変更できます!
情報: OPNSense ファイアウォールを使用している場合は、ansibleguy.opnsense Ansible コレクションを使用してそれらの WireGuard トンネルを管理できます。
トラブルシューティング
接続に問題がある場合は、以下の手順に従って問題の原因を特定してください:
1. VPN はアクティブですか?
wg show all
違う場合:
接続を確立できません - 設定ミスやネットワークの問題かもしれません(_ファイアウォールがトラフィックをブロックしている_)
WireGuard ログを確認してください:
# この例では 'wgs_ts2' が WireGuard トンネルインターフェース guy@srv:~# journalctl -u wg-quick@wgs_ts2 > -- ジャーナルはセッションの最初から最後まで表示します -- > Feb 08 16:12:31 test-ag-wg-s3 systemd[1]: wgs_ts2 の WireGuard 起動中... > Feb 08 16:12:31 test-ag-wg-s3 wireguard_wgs_ts2[10698]: [#] ip link add wgs_ts2 type wireguard
- トンネルを誤って設定した場合に表示される可能性のある一般的なエラーメッセージ:
- エラー:
RTNETLINK answers: Address already in use
- 問題: 各トンネルは一意のポートを使用してリッスンする必要があります。重複したポートが割り当てられているか、カスタムなものに設定し忘れたかもしれません。
- エラー:
failure in name resolution
- 問題: サービスが接続しようとしている dns ホスト名が(正しく)設定されていないか、ターゲットホストが DNS 解決に一般的な問題を抱えています。
- エラー: トンネルは設定され、サービスは実行されていますが、接続が確立されていません。
- 問題: 接続ポートがファイアウォールでブロックされている可能性があります。
- エラー:
- トンネルを誤って設定した場合に表示される可能性のある一般的なエラーメッセージ:
2. トンネル経由でトラフィックは流れていますか?
リモート WireGuard トンネルの IP(設定では 'Address')に ping を送ります。
重要: 使用するソース IP を指定してください!
# .2 はリモート WG-IP; .1 はローカルの IP
ping 10.0.1.2 -I 10.0.1.1
もしそうでない場合:
トンネルが本当に動作していることを確認してください!
キーが一致するか確認してください =>
wg show all
は両側で「同じ」公開鍵を表示するはずです:guy@srv1:~# wg show all > interface: wgx_tx1 > public key: FJgEWygMdiqRcTvij3PiXOtPJNtTENQkv301l2PGhwY= > ...
guy@srv2:~# wg show all > ... > peer: FJgEWygMdiqRcTvij3PiXOtPJNtTENQkv301l2PGhwY= > ...
一致しないキーを再生成するには、コントローラーの 'files' ディレクトリから削除し、サーバーでロールを再実行してください。
3. トンネル経由でトラフィックはルーティングされていますか?
これは、リモートサブネットを接続するためのトンネルにのみ適用されます。
もう1つの ping を使ってテストしますが、今回はローカルサブネット(_WG-IPではない_)を使用します。
# 172.30.1.1 はリモートの 'subnet'; 172.20.0.1 はローカルのもの
ping 172.30.1.1 -I 172.20.0.1
# 実行経路を詳しく知るために traceroute も実行できます:
traceroute 172.30.1.1
もしやる気があれば、リモートホストで tcpdump を実行して、トンネルを通じてトラフィックが流れているか確認できます。
# この例では 'wgs_ts2' が WireGuard トンネルインターフェース
guy@srv:~# tcpdump -i wgs_ts2
> tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
> wgs_ts2 でリッスン中
> 17:00:07.336550 IP 10.0.1.2 > 10.0.1.1: ICMP echo request, id 38770, seq 1, length 64
> 17:00:07.336695 IP 10.0.1.1 > 10.0.1.2: ICMP echo reply, id 38770, seq 1, length 64
もしそうでない場合:
ファイアウォールがホスト間のトラフィックをブロックしていないか確認してください。
IPTables/NFTables などは、受信トラフィックと転送トラフィックの両方を許可する必要があります。
ルーティング設定にエラーがないか確認し、'running config' と比較してください:
# 「簡単な」概要を表示 ip route show all # すべてのルートを表示 ip route show table all # 不要なブロードキャスト/ローカルルートを削除するためのコマンド ip route show table all | grep -vE '^(broadcast|local)\s'
ホストがトラフィックの転送をサポートしている必要があります!
設定 'wireguard.support.traffic_forwarding' が有効になっていることを確認してください。
ターゲットネットワークが 'AllowedIPs' に追加されていない場合があります。
これはスターとメッシュのトポロジーでは必要です!
4. まだ問題がある場合
ロールの問題/バグまたは他の特殊なケースかもしれません => GitHub Issues を自由に開いてください!
トラブルシューティングの結果を問題に提供してください。
Role to configure WireGuard Site-to-Site tunnels - topology-based
ansible-galaxy install ansibleguy.infra_wireguard