VPNを構築してやりたいこと
外出先から自宅内に設置している機器(サーバ、ルータ、NAS)に接続できるようにする。
簡単な接続イメージは下記のようになります。
iPhone —– インターネット回線 —– NAT —– (自宅LAN) —– 自宅内(NAS、サーバ、ルータ)
参考環境
- NURO光(プロバイダ回線):192.168.0.1
- FreeBSD 14.1 :192.168.0.10
- NAS:192.168.0.2
※IPアドレスの情報も記載しています。
前提条件
- DDNSによる名前解決済みであること
- UDPポート500番(ISAKMP)のポートが開放されていること
- UDPポート1701番(L2TP)のポートが開放されていること
- UDPポート4500番(IPSec NAT Traversal)が開放されていること
参考サイト
FreeBSDでL2TP/IPSec VPNサーバを構築する – IPSec編
FreeBSD on Raspberry Pi 3でVPN(L2TP+IPsec)サーバーを構築する
strongSwan 5.8.0 の systemd ユニット変更に対応する
構築時に使用したソフト類
- strongswan
- mpd5
strongswan 導入
pkg install strongswan
strongswan 設定
vi /usr/local/etc/strongswan.conf
charon {
load_modular = yes
# Added by Santosh : STARTS
filelog {
charon {
path = /var/log/charon.log
time_format = %b %e %T
# loggers to files also accept the append option to open files in
# append mode at startup (default is yes)
append = no
# the default loglevel for all daemon subsystems (defaults to 1).]
default = 1
flush_line = yes
}
stderr {
# more detailed loglevel for a specific subsystem, overriding the
# default loglevel.
ike = 4
knl = 4
}
}
libimcv {
plugins {
imv-scanner {
closed_port_policy = yes
tcp_ports = 22
udp_ports = 500 4500
}
}
}
plugins {
include strongswan.d/charon/*.conf
}
}
include strongswan.d/*.conf
strongswan 5.9系より、「swanctl.conf」を使用しての設定となっています。
vi /usr/local/etc/swanctl/swanctl.conf
connections {
L2TP-NAT {
local_port = 4500
remote_port = 4500
proposals = aes256-sha2_256-modp3072,default
local {
auth = psk
}
remote {
auth = psk
}
children {
L2TP-NAT {
mode = transport
esp_proposals = aes256-sha2_256-modp3072,default
remote_ts = 0.0.0.0/0
}
}
}
}
# Include config snippets
include conf.d/*.conf
事前共有鍵の設定
vi /usr/local/etc/ipsec.secrets
# ipsec.secrets - strongSwan IPsec secrets file
: PSK "hogehoge"
mpd5(L2TP)の導入
cp /usr/local/etc/mpd5/mpd.conf.sample /usr/local/etc/mpd5/mpd.conf
vi /usr/local/etc/mpd5/mpd.conf
startup:
log +ipcp +ipv6cp +lcp +link +auth +ecp +ccp
default:
load l2tp_server
l2tp_server:
set ippool add pool_l2tp 192.168.0.250 192.168.0.254
create bundle template B_l2tp
set iface enable proxy-arp
set iface enable tcpmssfix.
set ipcp ranges 192.168.0.10/24 ippool pool_l2tp
set ipcp dns 192.168.0.10 8.8.8.8
set ipcp enable vjcomp
set bundle enable compression.
set ccp enable mppc
set mppc enable e40
set mppc enable e128
set mppc enable stateless
create link template L_l2tp l2tp
set link action bundle B_l2tp
set link mtu 1400
set link keep-alive 10 60
set link no pap chap eap
set link enable chap-msv2
set link enable chap
set link enable multilink
set link enable acfcomp protocomp
set auth enable system-acct
set l2tp self 0.0.0.0
set l2tp enable length
set l2tp disable dataseq
set link enable incoming
ログイン時に使用するユーザーIDとパスワードの設定
vi /usr/local/etc/mpd5/mpd.secret
USERID "PASSWORD"
chmod 600 /usr/local/etc/mpd5/mpd.secret
strongswan 自動起動
strongswanのサービスを自動起動させる設定
vi /etc/rc.conf
strongswan_enable="YES"
mpd5 自動起動
mpd5のサービスを自動起動させる設定
vi /etc/rc.conf
mpd_enable="YES"
パケット転送設定
インタフェースから別のインタフェースへパケットを転送させる設定です。
vi /etc/rc.conf
gateway_enable="YES"
arpproxy_all="YES"
FreeBSD 14.1 から「arpproxy_all=”YES”」を設定しないとパケットの転送が出来ないです。
strongswan 5.8系の設定
strongswan 5.8系の場合は、「ipsec.conf」を使用して設定する。
また、5.9系の場合は、「swanctl.conf」の設定となるため、注意が必要です。
vi /usr/local/etc/ipsec.conf
config setup
conn L2TP-NAT
rightsubnet=0.0.0.0/0
also=L2TP-PSK-NAT
conn L2TP-PSK-NAT
forceencaps=yes
authby=secret
auto=add
keyexchange=ikev1
keyingtries=3
ike=aes256-sha256-ecp521,aes256-sha256-modp2048,aes256-sha256-modp1024,aes256-sha1-modp1024,aes128-sha1-modp1024,aes128-sha1-modp2048
esp=aes256-sha256,aes256-sha1,aes128-sha1-modp2048
rekey=no
ikelifetime=8h
lifetime=1h
type=transport
left=192.168.0.10 # サーバのIPアドレス
leftprotoport=17/1701
right=%any
rightsubnet=0.0.0.0/0
rightprotoport=17/%any
dpddelay=40
dpdtimeout=130
dpdaction=clear