= [[vpn]] / LM: [2024-12-01 02:12:38]
~~NOCACHE~~
----
====== - wireguard [2024-12-01] ======
===== - 概要 ======
[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 程度まで遅延が増えたのは仕方ないのかもしかたないのかもしれない.
===== - インストール =====
サーバ・クライアント共に,net/wireguard-tools を入れるだけでOK.
% sudo portmaster -D net/wireguard-tools
% rehash # PATH をアップデートして,シェルで補完できるようにするため
===== - 設定 ======
前提:
* WireGuard インタフェース名:wg0
* サーバの外部インターネットインタフェース名:vtun0
* WireGuard の内部ネットワークは 192.168.100.0/24
==== - rc.conf に記述追加 ====
wireguard_enable="YES"
wireguard_interfaces="wg0"
==== - 設定 ====
=== - 鍵の作成 ===
WireGuard の設定をするには,ユーザ/パスワードではなく,公開鍵・秘密鍵 のペアを WireGuard 専用のコマンドで作成する必要がある.
鍵のペアは,サーバ・クライアントどちらで作成しても良い.
wg コマンドの後ろのキーワードが **genkey** と **pubkey** なので気をつける.
% 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 を指定しないと動かなかった./24 と書くべきかと思ったが,エラーが出ていた.
* ファイル設置場所:/usr/local/etc/wireguard/wg0.conf
[Interface]
PrivateKey = # サーバ用プライベートキーの中身を記載
# VPN インターフェースに割り当てる IP アドレス
Address = 192.168.100.1/24
# サーバーでリスンする UDP ポート
ListenPort = 51820
[Peer]
# Client A
PublicKey = # クライアント用パブリックキーの中身を記載
# 接続を許可するクライアントの VPN の IP アドレス
# サブネット単位でも指定可 ⇒ [172.16.100.0/24]
AllowedIPs = 192.168.100.2/32
[Peer]
# Client B
PublicKey = <別のclient.pubの中身> # クライアント用パブリックキーを指定
# 接続を許可するクライアントの VPN の IP アドレス
AllowedIPs = 192.168.100.3/32
=== - クライアント側 ===
[Interface] セクションに自分のアドレスと,今回のネットワークのサブネットである /24 を記載.PrivateKey は client.key の中身を記載する.[Peer] の PublicKey には,server.pub の中身を記載.この公開鍵と秘密鍵を使って通信の暗号化が行なわれている模様.
AllowedIPs に記載するアドレスには,VPN 経由で通信したいアドレスを記載していく.カンマ区切りで複数書いていくことも可能.AllowedIPs に記載することで,wg0 からデータが送られるよう,ルーティングテーブルが書き変わる.
例えば,今回の設定を行ない,netstat -rn でルーティングテーブルを見ると,以下のようになる.192.168.100.0/24 が wg0 から出るように設定されていることが分かる.
1:37 [0] skk% netstat -rn
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default xxx.xxx.xxx.xxx UGS em0
127.0.0.1 link#3 UH lo0
192.168.100.0/24 link#4 U wg0
192.168.100.2 link#3 UHS lo0
xxx.xxx.xxx.128/28 link#1 U em0
xxx.xxx.xxx.xxx link#3 UHS lo0
Endpoint には,通信先情報を書く.IP:Port の形で記載する.
* ファイル設置場所:/usr/local/etc/wireguard/wg0.conf
[Interface]
Address = 192.168.100.2/24
PrivateKey =
[Peer]
PublicKey =
AllowedIPs = 192.168.100.0/24
Endpoint = yyy.yyy.yyy.yyy:51820
=== - 起動及び確認 ===
サーバ → クライアント の順で起動する.
% sudo /usr/local/etc/rc.d/wireguard start
wg コマンドで,接続状況の確認ができる.peer セクションで latest handshake が表示されていなければ,うまく接続できていない.その場合は,鍵の対応が間違っていないか,良く確認すると良いかもしれない.
% w
interface: wg0
public key:
listening port: 50863
peer:
endpoint: yyy.yyy.yyy.yyy:51820
allowed ips: 192.168.100.0/24
latest handshake: 1 minute, 27 seconds ago
transfer: 7.39 GiB received, 361.80 MiB sent
通信できているかどうかは,ping 192.168.100.1 などすると良いだろう.
===== 参考 =====
* https://webprog.spg-games.net/2021-03-31/freebsd%E3%81%ABwireguard%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6vpn%E6%8E%A5%E7%B6%9A/
====== pptp ======
FreeBSD で pptp サーバーを立ち上げるなら,poptop と mpd がメジャーっぽい.
===== poptop =====
* ユーザランドで動作.FreeBSD 標準の ppp と連携する.クライアントは Unix 系か Windows のみ.Mac をクライアントには出来なさそう
===== mpd =====
* netgraph を利用.カーネル内で動作.poptop に比べ処理はそこそこ速いかも.Mac, Windows どちらをクライアントにしても普通に動作.
* ただし,Windows の挙動か Mac の挙動か分からないが,Mac からは pptp(mpd) サーバーに対して smb 接続が出来ない.ping も通らない.routing table は windows のものと変らないように見える.現状では,1 NIC に対して 2 IP を振ることで対処中.
==== FreeBSD 8.0Release 近辺での mpd5 ====
* arp の挙動がおかしいらしく,ip forward を上手く行えない.(proxy arp が上手く動作しないということな気がする) 以下のようなエラーが mpd の吐くエラーにある.
system: command "/usr/sbin/arp" returned 256
* 内容的には,arp -S しようとすると,なぜか 0 でなく 256 が返ってきちゃうということ.返り番号を見るプログラムは上手く動作しない模様.
* 以下のURLで報告されているので,そのうち解決されるかも.
* http://www.freebsd.org/cgi/query-pr.cgi?pr=140358
===== 参考 =====
* [[http://www.daily-labo.com/ygg14.html|FreeBSD+mpdによるブロードバンドルータの高速化]]
====== OpenVPN ======
* [[http://www.stackasterisk.jp/tech/systemConstruction/openVpn01_01.jsp|日本語OpenVPN 解説ページ]] -- &new{2008-01-04 (金) 23:52:26};
* [[http://freescitech.net/2/ovpn2_howto_ja.html|openvpn howto 日本語訳]] -- &new{2008-01-05 (土) 00:06:18};
* [[http://www-or.amp.i.kyoto-u.ac.jp/members/liang/oss/ovpn2_ether_ja.html|OpenVPN 2.0 Ethernet Bridging 日本語訳]] -- &new{2008-01-27 (日) 10:29:22};
====== ut-vpn ======
* packetix の open source 版.
===== 環境 =====
* リモートホストに samba で接続したいけど,できないので,vpn 接続する.
* samba ホストと vpn サーバが同一の場合,うまく動かない.
* virtualbox で samba サーバ上にホストを建てて,別の IP を振る.そのホストに対して VPN 接続し,sa\
mba ホストに接続する.
===== virtualbox での設定の注意 =====
* virtualhost で作成する NIC を promisous mode にしておく.
===== インストール方法 =====
* 適当にコンパイルする.
===== 設定 =====
* 普通に bridge として設定する.
===== FreeBSD 側での設定 =====
* 下記の設定を行ない,ip forward が行なわれるようにしておく.
# sysctl net.inet.ip.forwarding=1
* 下記を /usr/local/etc/rc.d/utvpnserver に書いておく。
#!/bin/sh
# PROVIDE: utvpnserver
# REQUIRE: samba
# KEYWORD: shutdown
. /etc/rc.subr
name=utvpnserver
rcvar=utvpnserver_enable
start_precmd=start_precmd
stop_postcmd=stop_postcmd
start_precmd()
{
/usr/bin/utvpnserver start
}
stop_postcmd()
{
/usr/bin/utvpnserver stop
}
load_rc_config ${name}
run_rc_command "$1"
----
このページへのアクセス
今日: {{counter|today}} / 昨日: {{counter|yesterday}}
総計: {{counter|total}}