自宅VPNの設置と運用

クラウドサービスの充実により、OneDriveやGoogleDrive、iCloud等により、自宅サーバを立ち上げてアクセスする必要性も少なくなりましたが、とはいえ、大容量なファイルや、多数のデータは、クラウドに置いておくと、容量が心配になります。

各サービスとも、1TBから2TB程度まで、ならそれなりに安価に契約できますが、数TBのデータを蓄積している当方では、Microsoft 365 Familyくらいしか、リーズナブルな価格で利用できるサービスがありません。

また、ちょっとしたWindowsアプリを使いたい場合に、PCを持ち出すのは割と面倒と思うこともあります。

そこで、自宅VPNサーバを立ち上げて、仮想マシンでWindowsを動かしておけば、ちょっとしたWindows利用は、スマホからVPN接続とリモートデスクトップ接続で利用できます。

最近はIKEv2への移行を検討し始める時期ではあるのですが、今のところは少し古い機器でも確実に繋がるL2TP/IPsecで構築します。そんな古い機器からVPN接続することなんてここ何年かは一度も無いんですけどね・・・。

さて、というわけで当方のネット環境を。

ひかり電話ホームゲートウェイがVPNサーバに対応している物なら良かったのですが、我が家に設置されているホームゲートウェイは、マンション内VDSLのため、旧式でVPNサーバ機能がありません。
ということで、ひかり電話に対応しつつ、LAN内からはIPv6 IPoEでアクセスしつつ、VPNアクセス時はIPv4で接続できる環境を構築します。

これにより、LANのサーバとPC間はLAN内のアクセスで高速アクセスかつ制限のないアクセスを実現しつつ、PPPoEルータはVPN接続以外の外部接続および内部へのアクセスを制限してルータとブリッジに徹することで、外部からLAN内のサーバやPCに対する攻撃を軽減させ、セキュリティの強化を見込んでいます。

まず、ひかり電話ルータではIPoEアクセスを設定します。
ひかり電話ルータのPPPoEブリッジを有効にしておきます。
DHCPサーバもひかり電話ルータで実現しています。
ただし、割り当てるIPアドレスの範囲を制限して、DHCPで割り当てないIPアドレスを固定でサーバやPPPoEルータに割り当てています。

PPPoEルータの構築はラズパイ4を使いました。ラズパイ4は基本的にDebianなので、Debianを使ってPCで構築しても良いと思います。
ラズパイ4は有線LANのみ使用します。PPPoEとLANアクセスを一つの有線LANポートで実現します。

まずはラズパイOSをインストールし、network-manager, firewalldをインストールします。

> apt install network-manager
> apt install firewalld

network-managerで固定IPの設定を実施した後、
/etc/dhcpcd.conf
にコメントで記載されているstatic設定もひとまず有効にします。
再起動してnetwork-manager利用による固定IP運用にします。

次にmmtuiを起動し、PPPoE登録のため、DSL設定をppp1として追加します。
PPPoEのユーザー名とパスワードも設定しておきます。
この状態でppp1のコネクションをupしてしまうと、eth0が占有されてしまい、LANアクセスができなくなるため、PPPoE ppp1のネットワークインタフェースをppp1として定義し、eth0をネットワークインタフェースppp1の親として共有させます。

> nmcli connection modify ppp1 connection.interface-name ppp1
> nmcli connection modify ppp1 connection.parent eth0

さらにフレッツのPPPoEマルチセッションを使用できるよう、

> nmcli connection modify ppp1 connection.multi-connect multiple

として、マルチセッション対応を設定しておきます。

これで、準備ができたので、PPPoE接続を開始し、接続状態を確認します。

> nmcli connection up ppp1
> nmcli connection show ppp1

接続できていることが確認できたら、起動時に自動で接続するようにします。

> nmcli connection modify ppp1 connection.autoconnect yes

続いてファイアウォールも設定してセキュリティを軽減します。
外部からL2TP/IPsecを使用するため、eth0をinternal, ppp1をexternalとして、ppp1からeth0経由でLAN内のサーバに構築するVPNサーバへのフォワードの設定をします。
インターネット接続はIPv6 IPoE経由で行うので、external側のIPマスカレードは無効にします。
また、LANからVPN経由で外部に応答するためにinternal側のIPマスカレードを有効にします。

> firewall-cmd --zone=internal --change-interface=eth0 --permanent
> firewall-cmd --zone=external --change-interface=ppp1 --permanent
> firewall-cmd --zone=external --add-forward-port=port=500:proto=udp:toport=vpnサーバのアドレス --permanent
> firewall-cmd --zone=external --add-forward-port=port=4500:proto=udp:toport=vpnサーバのアドレス --permanent
> firewall-cmd --zone=external --add-forward --permanent
> firewall-cmd --zone=external --remove-masquerade --permanent
> firewall-cmd --zone=internal --add-masquerade --permanent
> firewall-cmd --reload

最後にデフォルトルートを変更してPPPoEルータはインターネット接続にPPPoEを使用するようにします。
固定IP設定のstatic routerをコメントに戻して、ひかり電話ルータ側をゲートウェイとして使用せず、PPPoEで取得したゲートウェイがデフォルトゲートウェイになるように変更します。
これで、eth0のサブネット内のIPアドレスにアクセスする、つまり、LAN内のアクセスはeth0を使用し、LAN外にアクセスするときはPPPoEを使用するようになります。

続いてVPNサーバを立ち上げます。こちらは、DebianのPCサーバに構築します。PCサーバ上には、qemu kvmで仮想PCを立ち上げたりもしていますが、それらは省略。VPNサーバの立ち上げだけ行います。

strongSwan, xl2tpd, pppパッケージをインストール。

> apt install strongswan
> apt install xl2tpd
> apt install ppp

strongSwanを設定。個々の設定の意味はstrongSwanやopenswanの説明されているサイトを参照して下さい。

【/etc/ipsec.conf】
config setup

conn L2TP-PSK-noNAT
  forceencaps=yes
  authby=secret
  auto=add
  keyingtries=3
  ike=aes-sha1-modp2048 #端末によって対応していない場合は定義を増やします。
  esp=aes-sha1-modp2048
  rekey=no
  ikelifetime=8h
  keylife=1h
  keyexchange=ikev1 #ikev1でないとAndroid4.x以前は接続できない
  type=transport
  left=PCサーバのIPアドレス
  leftprotoport=17/1701
  right=%any
  rightprotoport=17/%any
  dpddelay=40
  dpdtimeout=130
  dpdaction=clear

conn L2TP-PSK-NAT
  rightsubnet=0.0.0.0/0
  also=L2TP-PSK-noNAT

include /var/lib/strongswan/ipsec.conf.inc

【/etc/ipsec.secrets】
PCサーバのIPアドレス : PSK "presharedkey" # :の前後にスペースがないとエラーになります。 presharedkey はある程度わからないよう決めておいてね。

【/etc/strongswan.conf】
charon {
  dns1 = 8.8.8.8 # DNSにはGoogle Public DNSを設定しています。
  dns2 = 8.8.4.4
  load_modular = yes
  plugins {
    include strongswan.d/charon/*.conf
  }
}

include strongswan.d/*.conf

【/etc/sysctl.conf】
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0

【/etc/xl2tpd/xl2tpd.conf】
[global]
access control = no
auth file = /etc/ppp/chap-secrets

[lns default]
exclusive = no
ip range = 割り当てる開始アドレス-割り当てる終了アドレス # DHCPで割り当てないかつ固定IPで使用していない範囲
local ip = PCサーバのアドレス
length bit = yes
refuse chap = yes
require authentication = yes
name = l2tp
pppoptfile = /etc/ppp/l2tpd-options

【/etc/ppp/l2tpd-options】
name l2tp
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
proxyarp
nodefaultroute
nobsdcomp
mtu 1280
mru 1280

【/etc/ppp/chap-secrets】
username l2tp password * # usernamepasswordはL2TPで接続するために使用するので決めておいて下さい

全て設定したら、設定を有効化します。

> sysctl -p
> systemctl disable strongswan
> systemctl enable strongswan-starter
> systemctl start strongswan-starter
> systemctl start xl2tpd

まあ、Android 4.xから接続する事もないし、WindowsもAndroid12も、iPhoneもIKEv2対応しているので、そろそろIKEv2への移行を準備します。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA