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
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"

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