ラズパイでSoftEtherを用いてL2レイヤーをVPN接続する
背景
自宅に wifi 接続できない HDD レコーダーがあった。が、家庭内で LAN ケーブルは伸ばしたくない。 別にPXE ブートさせたい。かつ wifi で行いたいマシンがあった。
つまりWifi-イーサネットコンバーターが欲しい。 商品もありますが作ってみたかった。
ラズパイをイーサネットコンバーターにする場合、内部的に DHCP を建てる設定例があったが、 できれば同一ネットワークでコンバーターが透過的に動作するようなものが欲しかった。 手軽に使える SoftEther でレイヤー 2 カスケードする設定で接続した。
ネットワーク構成
SoftEther のクライアント、サーバー共にラズベリーパイをGenPi64でセットアップして利用。 ただ nmcli( NetworkManager の CLI ツール )が使えれば他構成でもセットアップできそう。
HDDレコーダー or PXEブートしたいマシン => SoftEtherクライアント => SoftEtherサーバー => Internet
という形で外部に出れるようにする。
SoftEther サーバーではイーサネットインターフェースのみの運用とし、tap デバイスをブリッジする構成にした。
方針としては、基本的に使わない機能は off、必要に応じて有効にする。
- 仮想ハブ名: VpnHub1
- ダイナミック DNS 機能、DDDS: Off
- VPN Azure クラウド: off
- IPsec/L2TP/L2TPv3 サーバー機能の設定: off
- OpenVPN/MS-SSTP サーバー機能設定: off
- SecurNAT 機能、DHCP サーバー機能は使わない。
- カスケード接続は使う*(レイヤ 2 カスケード接続になる)
- SoftEther のサーバー/クライアント共に [ローカルブリッジ設定]=>[eth0] と物理インターフェースでブリッジを行う
環境
サーバー/クライアントともに共通
- Gentoo Linux
- Raspberry Pi 4B, 3B/B+ 64-bit Lite
- 2021/08/10 ころセットアップ
- 下記の手順は OS セットアップは済んだ状態からのもの
イーサネットコンバーターになる SoftEther クライアントでの事前作業
PC => eth => wifi => SoftEther サーバー => インターネット と接続するので、
- wifi のセットアップ
- eth の設定の無効化 を行う。
手順
ネットワークデバイス名を確認。GenPi64 では
- wlan0 が wifi
- eth0 がイーサネット というインターフェース名だった。
nmcli dev status
wifi をオンにして IP アドレスを確認。
sudo nmcli d wifi connect <ssid> password <pass> ifname wlan0
ip a
wifi 側の IP アドレスで ssh し直したのち eth の IP アドレスを無くす
sudo nmcli connection mod "有線接続 1" connection.autoconnect no
sudo reboot
ラズパイを再起動、wifi 経由で ssh、eth0 がアクティベートされない事を確認。
nmcli dev status
SoftEther 設定*( サーバー/クライアント共通 )
DDns、NAT トラサーバル、IPv6 の無効化。 デーモンを停止してから行う。
OS側IPv6のオフ
echo -e '\nnet.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.d/40-ipv6-off.conf
設定ファイルの編集でDDNS, IPv6, NATトラバーサルのオフ
DDNS機能のオフのためには設定ファイルの編集が必要になる
6.3 VPN Server / VPN Bridge の管理コマンドリファレンス (サーバー全体編)
ダイナミック DNS 機能を無効にするには、VPN Server の設定ファイルを編集します。
"declare root" ディレクティブ内に "declare DDnsClient" ディレクティブがあります。
この中にある "bool Disable" の値を true に設定して VPN Server を再起動することにより、ダイナミック DNS 機能が無効になります。
sudo vpnserver stop
sudo vi /usr/vpnserver/vpn_server.config
変更箇所
- DDnsClient.Disabled を true
- ServerConfiguration.DisableIPv6Listener true
- ServerConfiguration.DisableNatTraversal true
Ansibleでの設定をした際に、Ansibleのlineinfileが文字コードをWindowsの改行コードに変えた事があった。ただしSoftetherのデーモンが起動すると文字コードとインデントを修正してくれていた。
バッチファイルを作成して一気に設定を流し込む
SoftEther の設定箇所が多いのでバッチファイルを作成し、 下記のように、 /IN: オプションの引数にわたして実行する。この例では setup.txt に処理を記載していっている。
sudo vpncmd localhost /SERVER /IN:setup.txt
バッチファイルの内容は vpncmd で接続した後に行う処理を書いたものになる。
設定方法については 【Centos7】SoftEther Server 構築手順【L2TP/IPsec】を参考にした。
setup.txt 内の下記の の箇所は、それぞれ異なるものに変更すること。
- ServerPasswordSet
- HubCreate VpnHub0_dummy /PASSWORD:
- HubCreate VpnHub1 /PASSWORD:
- UserPasswordSet HubUser1 /PASSWORD:
setup.txt のサンプル
KeepDisable
OpenVpnEnable no /PORTS:1194
SstpEnable no
VpnAzureSetEnable no
VpnOverIcmpDnsEnable /ICMP:no /DNS:no
ListenerCreate 44444
ListenerDelete 443
ListenerDelete 992
ListenerDelete 1194
ListenerDelete 5555
HubDelete DEFAULT
HubCreate VpnHub0_dummy /PASSWORD:<password>
HubCreate VpnHub1 /PASSWORD:<password>
IPsecEnable /L2TP:yes /L2TPRAW:no /ETHERIP:no /PSK:ipsecvpn /DEFAULTHUB:VpnHub0_dummy
Hub VpnHub0_dummy
SetEnumDeny
SetMaxSession 1
Offline
Hub VpnHub1
SetEnumDeny
SetMaxSession 1
OnLine
NatDisable
DhcpDisable
UserCreate HubUser1 /GROUP:none /REALNAME:none /NOTE:none
UserPasswordSet HubUser1 /PASSWORD:<password>
vpnserver をスタートしてから実行
sudo vpnserver start
sudo vpncmd localhost /SERVER /IN:setup.txt
以降、接続ポートは 44444 になるので下記のように接続する。
sudo vpncmd localhost:44444 /SERVER
下記コマンドで変更した内容を確認する。
- HubList
- ListenerList
- IPsecGet
- NatGet
- SecureNatStatusGet
- UserList
ここまでがSoftEtherの基本的なセットアップ。
SoftEther クライアント特有の設定
VpnHub1 で「カスケード接続の管理」から Proxy(SoftEtherサーバ) にレイヤー 2 でカスケードする。
- 3.6 ローカルブリッジ
- 3.4.11 カスケード接続機能 の機能を使う。 手順としては
- ServerPasswordSet で SoftEther サーバーのパスワードを設定し台帳にメモ。
- BridgeCreate で SoftEther の仮想ハブとイーサネットの物理ポートを接続する*(物理ポート配下のデバイスと SoftEther の仮想ハブが接続される)
- CascadePasswordSet で HubUser1 のユーザーパスワードをセット
ServerPasswordSet <password>
BridgeCreate VpnHub1 /DEVICE:eth0
Hub vpnHub1
CascadeCreate cascade_proxy /SERVER:<プロキシーサーバーのIPアドレス>:44444 /HUB:VpnHub1 /USERNAME:HubUser1
CascadePasswordSet cascade_proxy /PASSWORD:<password> /TYPE:standard
CascadeOnline cascade_proxy
SoftEther サーバー特有の設定
ServerPasswordSet で SoftEther サーバーのパスワードを設定し台帳にメモ。 ローカルブリッジの設定を行い、物理デバイスを eth0 に紐付ける(tap デバイスは作らない)
ServerPasswordSet <password>
BridgeCreate VpnHub1 /DEVICE:eth0
SoftEther の通常の使用ポート
接続できる方法を多く用意するためだろうか、デフォルトで開くポートがいくつかある。
ポート | 用途 |
---|---|
TCP 443 | SSL 用 |
TCP 992 | TELNET over SSL (Telnets) |
TCP 1194 | OpenVpn |
TCP 5555 |
失敗のメモ
sudo nmcli d disconnect eth0 だと再起動後、eth0 が有効になったため、 nmcli connection mod “有線接続 1” connection.autoconnect no を用いるようにした。
SoftEtherのヘルプ
sudo vpncmd localhost /SERVER /CMD 'help'
参考
VPN サーバー構築(SoftEther VPN Server) Linux での VPN クライアントの CLI での接続方法が参考になった。
【Centos7】SoftEther Server 構築手順【L2TP/IPsec】 この人すごい。CLI での設定例が非常に参考になる。
3.6 ローカルブリッジ オフィシャルページの説明。これがやりたい。
SoftEther VPN サーバのローカルブリッジをコマンド操作だけで設定する方法 今回の私の目的、イーサネットコンバーターだと、wifi インターフェースだけ IP アドレスがあれば良く、イーサネットインターフェースには IP アドレスは不要なので参考になった。 「tap デバイスは不要」という点は非常に参考になった。確かにそうだ。
6.2.3 vpncmd コマンド起動時のコマンドラインパラメータ 処理の自動化の参考になった。
sudo vpncmd localhost /SERVER /IN:setup.txt
のようにする事でバッチ処理が可能。
SoftEherVPN で TAP デバイスとのブリッジが失敗する場合 上記の方法では tap デバイスを使わなくても済んだが、使うようになったら参考にする。
ESXi 上の仮想マシンに SoftEther VPN Server を入れる際の注意点 プロミスキャス・モードでリッスンできる必要がある
Android から接続 L2TP/IPsec サーバを構築してアンドロイド端末で VPN を利用する