🙌

Microuter-N300,OpenWrt,WireGuard,Site-to-Site

2022/01/02に公開

基本自分用の備忘録 作成中完成度60%
記憶で書いているところもあるので順番や表記が間違っている可能性あり

初OpenWrt、初WireGuardのワシがMicrouter-N3002台を購入して4日くらいかけて・・・拠点間VPN構成を達成した時のメモ

一人で拠点間VPNを作る場合、めったに行かない場所だと原因究明が難しいのでできれば一発できめたいところ、今回フレッツ網での接続だった為、1つの回線だけでVPN構成を作ることができたので稼働確認までとれた後本番構成に移行させることができた。念のため何かあったらリモートで操作できるように工夫しておいたが

購入したもの

  • Microuter-N300 2台

構築手順

事前準備

2台とも以下の準備をしておく

  • 電源を入れる
  • 起動したらMicrouter-N300のwifiに接続する(初期のキーはgoodlife)
  • パソコンにIPアドレスが割り振られたらそのゲートウェイのIPにWEBアクセスする
  • WEBが表示されたらEnglishを指定
  • パスワードを設定
  • Microuter-N300のLANポートをインターネット接続する
  • プラグインをインストールする
    • APPLICATIONSのPlug-insを開く
    • Luciをインストール
    • luci-app-ddnsをインストール
    • luci-app-wireguardをインストール

サーバ側の設定

公式のマニュアルに沿って設定してみる

1.Preparation

のちほどコマンドで利用する値をOSの変数にセットする

# Configuration parameters
WG_IF="vpn"
WG_PORT="51820"
WG_ADDR="192.168.9.1/24" #サーバ側のインターフェイスかつ、VPN間のネットワークアドレスに使うものを設定する
WG_ADDR6="fdf1:e8a1:8d3f:9::1/64"

2.Key management

対となる秘密鍵と公開鍵をサーバー側とクライアント側の2組と事前共有鍵を作成する
OSの変数に作成した秘密鍵、公開鍵、共有キーをセットする

# Generate keys
umask go= #新規ファイルの初期パーミッション設定 (go=の意味わかってない)
wg genkey | tee wgserver.key | wg pubkey > wgserver.pub #カレントディレクトリにファイル作成される
wg genkey | tee wgclient.key | wg pubkey > wgclient.pub
wg genpsk > wgclient.psk
 
# Server private key
WG_KEY="$(cat wgserver.key)"
 
# Pre-shared key
WG_PSK="$(cat wgclient.psk)"
 
# Client public key
WG_PUB="$(cat wgclient.pub)"

3.firewall

# Configure firewall
uci rename firewall.@zone[0]="lan" #ゾーンの名前設定(たぶん初期と同じ)
uci rename firewall.@zone[1]="wan"
uci del_list firewall.lan.network="${WG_IF}" #すでに設定があれば消す
uci add_list firewall.lan.network="${WG_IF}" #WireGuadのインターフェイスをLANゾーンにする。
uci -q delete firewall.wg #すでに設定があれば消す
uci set firewall.wg="rule" #WireGuadのサービス受付用のファイヤウォール設定
uci set firewall.wg.name="Allow-WireGuard"
uci set firewall.wg.src="wan"
uci set firewall.wg.dest_port="${WG_PORT}"
uci set firewall.wg.proto="udp"
uci set firewall.wg.target="ACCEPT"
uci commit firewall #設定をコミットする
/etc/init.d/firewall restart #設定の繁栄する

4.network

# Configure network
uci -q delete network.${WG_IF} #すでに設定があれば消す
uci set network.${WG_IF}="interface" #WireGuardのインターフェイスを作成
uci set network.${WG_IF}.proto="wireguard"
uci set network.${WG_IF}.private_key="${WG_KEY}"
uci set network.${WG_IF}.listen_port="${WG_PORT}"
uci add_list network.${WG_IF}.addresses="${WG_ADDR}"
uci add_list network.${WG_IF}.addresses="${WG_ADDR6}"
 
# Add VPN peers
uci -q delete network.wgclient #WireGuardのインターフェイスに対向側の設定をする
uci set network.wgclient="wireguard_${WG_IF}"
uci set network.wgclient.public_key="${WG_PUB}"
uci set network.wgclient.preshared_key="${WG_PSK}"
uci add_list network.wgclient.allowed_ips="${WG_ADDR%.*}.2/32" #インターフェイスと同一ネットワークとする
uci add_list network.wgclient.allowed_ips="${WG_ADDR6%:*}:2/128"
uci commit network #設定をコミットする
/etc/init.d/network restart #設定の繁栄する

クライアント側設定

公式のマニュアルに沿って設定してみる

1. Preparation

# Configuration parameters
WG_IF="vpn"
WG_SERV="SERVER_ADDRESS" #サーバーのグローバルIPもしくはDNSを設定する。後で変更できるので仮のものでも良い
WG_PORT="51820"
WG_ADDR="192.168.9.2/24" #インターフェイスと同一ネットワークとする。Add VPN peersで設定したIPアドレスと同じ
WG_ADDR6="fdf1:e8a1:8d3f:9::2/64"

2. Key management

マニュアルでは新たに鍵を作成しているがサーバ側設定で2組作っているので不要
サーバー側設定で作成したキーを後ほどコマンドで利用するために変数にセットする

秘密鍵と公開鍵で混乱するが、秘密鍵は自身に公開鍵は相手側に設定すると考えれば良い
keyは秘密鍵(private key)
pubは公開鍵(public key)
pskは事前共有鍵(Pre-shared key)

# Client private key
WG_KEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" #サーバ側設定で作成したクライアントの秘密鍵(wgclient.key)
 
# Pre-shared key
WG_PSK="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" #サーバ側設定で作成した事前共有鍵(wgclient.psk)
 
# Server public key
WG_PUB="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" #サーバ側設定で作成したサーバの公開鍵(wgserver.pub)

3. Firewall

# Configure firewall
uci rename firewall.@zone[0]="lan"
uci rename firewall.@zone[1]="wan"
uci del_list firewall.wan.network="${WG_IF}"
uci add_list firewall.wan.network="${WG_IF}"
uci commit firewall
/etc/init.d/firewall restart

4. Network

後からわかったことだが、このマニュアルの設定はクライアント側からのすべての通信をVPN経由にさせるといった設定になる。よってWireGuadのインターフェイスのゾーンもWANになっている。
それぞれの拠点がインターネット接続できる環境であれば後からゾーンをLANに変更しても良い。
allowed_ips="0.0.0.0/0"になっていることで、すぐさまパケットがWireGuadのインターフェイスにながれてVPNが確立できるが、後程対向の拠点のネットワークにallowed_ips=を絞った場合は、その接続先のネットワークに定期的に通信させておくような工夫が必要だと思われる。(でないと停電とかで再起動した後VPNが確立されないままになる。)

# Configure network
uci -q delete network.${WG_IF}
uci set network.${WG_IF}="interface"
uci set network.${WG_IF}.proto="wireguard"
uci set network.${WG_IF}.private_key="${WG_KEY}"
uci add_list network.${WG_IF}.addresses="${WG_ADDR}"
uci add_list network.${WG_IF}.addresses="${WG_ADDR6}"
 
# Add VPN peers
uci -q delete network.wgserver
uci set network.wgserver="wireguard_${WG_IF}"
uci set network.wgserver.public_key="${WG_PUB}"
uci set network.wgserver.preshared_key="${WG_PSK}"
uci set network.wgserver.endpoint_host="${WG_SERV}"
uci set network.wgserver.endpoint_port="${WG_PORT}"
uci set network.wgserver.route_allowed_ips="1"
uci set network.wgserver.persistent_keepalive="25"
uci add_list network.wgserver.allowed_ips="0.0.0.0/0"
uci add_list network.wgserver.allowed_ips="::/0"
uci commit network
/etc/init.d/network restart

経路、NAPT設定

作成途中

今回わかったこと

Microuter-N300

  • ポート一つでも拠点間VPNさせることができる
  • wanゾーンに抜けるときはポートマスカレードされるが、firewallのNAT設定でポートマスカレードさせないようにすることができる

WireGuard

  • フレッツNGN網のipv6経由でも接続できる
  • 各拠点の秘密鍵と公開鍵は、対になっていればどこで生成しても良い
  • 3拠点などでメッシュ構成?にする場合はallowed_ipsで振り分けすることで対応できそう
  • マニュアルがコマンドだけで分かりにくいと感じたが、GUIで設定することもできるのだろうけど、コマンドのほうがやっぱり早そうだ

よく使う操作

作成途中

Discussion