ふと、OpneWRTをインストールしたルータを手に入れたので、AzureにS2S VPNのトンネルをはってみた。
OpenWRTルータにLinux向けのipsec実装である「strongswan」を使うと簡単にできた。
忘れないようにメモしておく。
構成は次の通り。
Azure側のVPN GWはデフォルトのまま作成して、接続を作成する際に、接続先はFQDNであるxxxx.plala.jpを指定し、PSキーは"1qaz2wsx3edc"をセットした。ローカルネットワークゲートウェイも合わせて作成。
Azure側の具体的な設定方法などは、MS Learnや次の本の6章を見るなどすればすっきり分かるはず。
んでもってあとは自宅側のネットワーク設定をごちゃごちゃと次のようにやった。
ぷららのDDNSを使っているので、インターネットからONUへはxxx.plala.jpでアクセスできるようになっている。Azure側の VPN GWの設定でFQDN指定できるので便利。別に試すだけならIPアドレス指定でもいいが、固定IPアドレスでない場合は何らかのDDNSを使うのがよさそう。
OpenWRT機器(bufferloのWHR-HP-G301NH)はONUの内側にあるので、AzureからのVPNパケットはONUでドロップせずにOpenWRT機器までなんとか届けないといけない。我が家のONUにはVPN通信だけ通すような「VPNパススルー機能」はないので、192.168.1.31をDMZ指定して、インターネットからのセッションは全部OpwnWRT機器に流すようにした。
あとはOpenWRT機器(Wi-Fiルータ)の設定だけ。
ネットには先人の知恵があるのでググってみるとナイスなサイトがあった。ここに書いてあることをほぼそのままやればいいだけだった。
次のパッケージをインストール。
- strongswan-minimal
- ip-full
- kmod-ip-vti
- vtiv4
# opkg update
# opkg install strongswan-minimal ip-full kmod-ip-vti vtiv4
そして、/etc/ipsec.confと、/etc/ipsec.secretを次のように編集した。
- /etc/ipsec.conf
# ipsec.conf - strongSwan IPsec configuration file
# basic configuration
config setup
# strictcrlpolicy=yes
# uniqueids = no# Add connections here.
## for Azure VPN GW (site-tosite VPN)
conn azure-s2svpn
ikelifetime=28800s
keylife=3600s
lifebytes=102400000
authby=secret
keyexchange=ikev2auto=start
type=tunnel
ike=aes256-sha1-modp1024,aes256-sha256-modp1024,aes128-sha1-modp1024,aes128-sha256-modp1024,3des-sha1-modp1024
esp=aes256-sha1,aes256-sha256,aes128-sha1,aes128-sha256,aes128-sha1,3des-sha1
# pfs=no
mark=42
mark_in=42
mark_out=42
left=192.168.1.31
leftsubnet=192.168.1.0/24,192.168.10.0/24
leftid=192.168.1.31
leftauth=psk
leftfirewall=yesright=21.23.24.25
rightsubnet=10.0.0.0/16
rightid=21.23.24.25
rightauth=psk
rightfirewall=yes
- /etc/ipsec.secret
# /etc/ipsec.secrets - strongSwan IPsec secrets file
192.168.1.31 21.23.24.25 : PSK "1qaz2wsx3edc"
あと、次のファイルも編集した。
- /etc/strongswan.conf
# strongswan.conf - strongSwan configuration file
#
# Refer to the strongswan.conf(5) manpage for details
#
# Configuration changes should be made in the included filescharon {
install_routes=no
install_virtual_ip=no
load_modular = yes
plugins {
include strongswan.d/charon/*.conf
}
}include strongswan.d/*.conf
最後に、/etc/sysctl.confに次追記してカーネルパラメータも変更した。
- /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
そして値を反映するために次のコマンドを実行した。
# sysctrl -p
設定ファイルの準備はできたので、次のコマンドを実行してVPNトンネルをはることに成功した。
# ip tunnel add vti0 local 192.168.1.31 remote 21.23.24.15 mode vti key 42
# sysctl -w net.ipv4.conf.vti0.disable_policy=1
# ip link set vti0 up
# ip route add 10.0.0.0/16 dev vti0
# ipsec restart
そして、OpenWRT機器(Wi-Fiルータ)にPCを接続し、
ping 10.0.1.100
を実行すると応答が返ってきた。接続成功である。
VPNが繋がっているかどうかは、ipsec statusall を実行した結果で確認できる。
「1 up」となっていれば接続成功している。
※メモ
VPN GWのパブリックIPアドレスが変わったときは、/etc/ipsec.confと/etc/ipsec.secretのIPアドレスを書き換えて次を実行すれば繋げられる。
(ipsec reset がダメな場合は ipsec stop; ipsec start で)
# ip tunnel change vti0 local 192.168.1.31 <remote 変更後のIPAddr> mode vti key 42
# ipsec restart