差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| vpn [2024/11/29 17:35] – skk | vpn [2024/12/01 02:14] (現在) – skk | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | [[vpn]] / LM: [2024-11-29 17:35:35] | + | = [[vpn]] / LM: [2024-12-01 02:12:38] |
| ~~NOCACHE~~ | ~~NOCACHE~~ | ||
| ---- | ---- | ||
| - | ====== wireguard | + | ====== |
| - | ===== 概要 ====== | + | ===== - 概要 ====== |
| - | [2024-11-29] の時点で,L3 VPN で問題なければ,WireGuard がメジャーな模様.FreeBSD 12 か 13 くらいから,本体の src tree にもマージされてた模様. | + | [2024-11-29] の時点で,L3 VPN で問題なければ,WireGuard がメジャーな模様.OpenVPN や softether などと比べても設定はとても簡単に感じる.FreeBSD 12 か 13 くらいから,本体の src tree にもマージされてた模様. |
| + | |||
| + | ただし,L3 VPN しかできないので,VPN 経由で外部インターネットに接続したい場合は,NAT など自分で設定しなければならない.FreeBSD での NAT 設定については,TBA 参照. | ||
| + | |||
| + | また,今回僕の環境では問題にならなかったが,UDP で通信を行なっているようなので,UDP の通信に問題があるようなら,接続ネットワークの設定を確認する必要があるかもしれない. | ||
| 使ってみたところ,そこそこの速度で使えてるような気がする.計測はしてない. | 使ってみたところ,そこそこの速度で使えてるような気がする.計測はしてない. | ||
| 5ms 程度の遅延のサーバ上に WireGuard サーバをたてたところ,20ms 程度まで遅延が増えたのは仕方ないのかもしかたないのかもしれない. | 5ms 程度の遅延のサーバ上に WireGuard サーバをたてたところ,20ms 程度まで遅延が増えたのは仕方ないのかもしかたないのかもしれない. | ||
| - | ===== インストール ===== | + | ===== - インストール ===== |
| サーバ・クライアント共に,net/ | サーバ・クライアント共に,net/ | ||
| + | <code bash> | ||
| % sudo portmaster -D net/ | % sudo portmaster -D net/ | ||
| + | % rehash # PATH をアップデートして,シェルで補完できるようにするため | ||
| + | </ | ||
| - | ===== 設定 ====== | + | ===== - 設定 ====== |
| 前提: | 前提: | ||
| - | * コマンドは wg | + | * WireGuard インタフェース名:wg0 |
| + | * サーバの外部インターネットインタフェース名:vtun0 | ||
| + | * WireGuard の内部ネットワークは 192.168.100.0/ | ||
| - | 1. rc.conf に記述追加 | + | ==== - rc.conf に記述追加 |
| < | < | ||
| wireguard_enable=" | wireguard_enable=" | ||
| 行 26: | 行 34: | ||
| </ | </ | ||
| - | 2. 設定ファイル | + | ==== - 設定 ==== |
| - | 2.1 サーバ側 | + | === - 鍵の作成 === |
| + | WireGuard の設定をするには,ユーザ/ | ||
| + | |||
| + | 鍵のペアは,サーバ・クライアントどちらで作成しても良い. | ||
| + | |||
| + | wg コマンドの後ろのキーワードが **genkey** と **pubkey** なので気をつける. | ||
| + | |||
| + | <code bash> | ||
| + | % wg genkey server.key # サーバ用秘密鍵 | ||
| + | % wg pubkey < server.key > server.pub # サーバ用公開鍵 | ||
| + | % wg genkey client.key | ||
| + | % wg pubkey < client.key > client.pub # クライアント用公開鍵 | ||
| + | </ | ||
| + | |||
| + | === - サーバ側 === | ||
| + | [Interface] セクションに,サーバ側の設定を記載.PrivateKey は,作成したサーバ用秘密鍵を指定.Address には,自分のアドレスである 192.168.100.1,及びそのサブネットマスクを指定する.ListenPort は適当に指定すれば良い. | ||
| + | [Peer] は,接続してくるクライアントに関する情報を記載する.複数のクライアントを指定する場合は,[Peer] セクションを複数作成する.AllowedIPs は,接続してくるクライアントのアドレスを記載する.この際,サブネットは気にせず /32 を指定しないと動かなかった./ | ||
| + | |||
| + | * ファイル設置場所:/ | ||
| + | |||
| + | < | ||
| + | [Interface] | ||
| + | PrivateKey = < | ||
| + | # VPN インターフェースに割り当てる IP アドレス | ||
| + | Address = 192.168.100.1/24 | ||
| + | # サーバーでリスンする UDP ポート | ||
| + | ListenPort = 51820 | ||
| + | |||
| + | [Peer] | ||
| + | # Client A | ||
| + | PublicKey = < | ||
| + | # 接続を許可するクライアントの VPN の IP アドレス | ||
| + | # サブネット単位でも指定可 ⇒ [172.16.100.0/ | ||
| + | AllowedIPs = 192.168.100.2/ | ||
| + | |||
| + | [Peer] | ||
| + | # Client B | ||
| + | PublicKey = < | ||
| + | # 接続を許可するクライアントの VPN の IP アドレス | ||
| + | AllowedIPs = 192.168.100.3/ | ||
| + | </ | ||
| + | |||
| + | === - クライアント側 === | ||
| + | [Interface] セクションに自分のアドレスと,今回のネットワークのサブネットである /24 を記載.PrivateKey は client.key の中身を記載する.[Peer] の PublicKey には,server.pub の中身を記載.この公開鍵と秘密鍵を使って通信の暗号化が行なわれている模様. | ||
| + | |||
| + | AllowedIPs に記載するアドレスには,VPN 経由で通信したいアドレスを記載していく.カンマ区切りで複数書いていくことも可能.AllowedIPs に記載することで,wg0 からデータが送られるよう,ルーティングテーブルが書き変わる. | ||
| + | |||
| + | 例えば,今回の設定を行ない,netstat -rn でルーティングテーブルを見ると,以下のようになる.192.168.100.0/ | ||
| + | |||
| + | < | ||
| + | 1:37 [0] skk% netstat -rn | ||
| + | Routing tables | ||
| + | |||
| + | Internet: | ||
| + | Destination | ||
| + | default | ||
| + | 127.0.0.1 | ||
| + | 192.168.100.0/ | ||
| + | 192.168.100.2 | ||
| + | xxx.xxx.xxx.128/ | ||
| + | xxx.xxx.xxx.xxx | ||
| + | </ | ||
| + | |||
| + | Endpoint には,通信先情報を書く.IP: | ||
| + | |||
| + | * ファイル設置場所:/ | ||
| + | |||
| + | < | ||
| + | [Interface] | ||
| + | Address = 192.168.100.2/ | ||
| + | PrivateKey = < | ||
| + | |||
| + | [Peer] | ||
| + | PublicKey = < | ||
| + | AllowedIPs = 192.168.100.0/ | ||
| + | Endpoint = yyy.yyy.yyy.yyy: | ||
| + | </ | ||
| + | |||
| + | === - 起動及び確認 === | ||
| + | |||
| + | サーバ → クライアント の順で起動する. | ||
| + | |||
| + | <code bash> | ||
| + | % sudo / | ||
| + | </ | ||
| + | |||
| + | wg コマンドで,接続状況の確認ができる.peer セクションで latest handshake が表示されていなければ,うまく接続できていない.その場合は,鍵の対応が間違っていないか,良く確認すると良いかもしれない. | ||
| + | |||
| + | <code bash> | ||
| + | % w | ||
| + | interface: wg0 | ||
| + | public key: < | ||
| + | listening port: 50863 | ||
| + | |||
| + | peer: < | ||
| + | endpoint: yyy.yyy.yyy.yyy: | ||
| + | allowed ips: 192.168.100.0/ | ||
| + | latest handshake: 1 minute, 27 seconds ago | ||
| + | transfer: 7.39 GiB received, 361.80 MiB sent | ||
| + | </ | ||
| - | 2.2 クライアント側 | + | 通信できているかどうかは,ping 192.168.100.1 などすると良いだろう. |
| + | ===== 参考 ===== | ||
| + | * https:// | ||