SoftetherVPN ServerをIPoE(IPv6)環境で動かす
January 29, 2023
linux AlpineLinux目次
はじめに
自宅ネットワークをIPoE接続に変えたところ、IPv4のIPマスカレードがPPPoE接続の時のようには使えなくなり、ポート開放が必要なL2TP/IPsec方式によるvpnが使えなくなってしまいました。
ちなみに、PPPoE接続の時は、こんなかんじでSoftEtherVPNを使ってL2TP/IPsec方式によるvpnが利用できていました。
L2TP/IPsec方式では、UDPポート500番と4500番を利用しており、スマホ等のvpnクライアントでは、このポート番号が変更不可なため、vpnクライアントから自宅内のvpnサーバに接続するためには、IPマスカレードでUDPポート500番と4500番を開放する必要がありました。PPPoE接続のときはこれが当たり前のように出来ていたのですが、IPoE接続では使えるポート番号に制約があり、残念ながら500番と4500番ポートは使用できず、L2TP/IPsec方式のvpnは諦めざるを得ません。
IPoE接続では、使用するポート番号を自由に変更できるvpn方式でなければならない訳ですが、この目的に合致しているのがOpenVPNです。幸いなことに、SoftetherVPNでもOpenVPNを利用することが可能です。
せっかく自宅をIPoE接続にしたのですから、クライアントからSoftetherVPNサーバまで全てをIPv6で接続する通すのがいちばんスッキリしているのですが、筆者のクライアント(スマホ)はOCNモバイルONEで、残念ながらOCNモバイルONEは本記事執筆時点ではIPv6が使えません。そこで、IPv4クライアントからIPv4 over IPv6でHGWを通過し、IPv4でSoftetherVPNサーバに接続するようにします。MNOはIPv6使えるでしょうし、格安MVNOでもIPv6が使えるところもあるようなので、IPv6対応のモバイル環境が利用できれば、本記事にような方法ではなく直接IPv6で接続するのが吉だと思います。
本記事ではSoftetherVPNのOpenVPN接続によるvpnサーバをdocker composeで立ち上げて、IPoE環境(IPv4 over IPv6)でvpnを利用する方法を解説します。
SoftetherVPNのインストールと設定
SoftetherVPNをdocker composeでインストールします。インストール元はAlpine Linuxです、他のLinuxディストリビューションの場合、適宜変更が必要の可能性があります。
【参考】
https://eidera.com/blog/2017/08/31/construction_vpn_server_in_one_minute/
1分でVPNサーバを構築する
インストール
$ git clone https://github.com/eidera/softethervpn-docker
$ cd softethervpn-docker
ディレクトリ構成
./softethervpn-docker/
README.md
build/
Dockerfile
docker-compose.yml
vpnserver/
vpn_server.config
version: '3'
services:
vpn:
container_name: vpn
build:
context: .
dockerfile: ./build/Dockerfile
args:
SOFTETHER_URL: "https://jp.softether-download.com/files/softether/v4.22-9634-beta-2016.11.27-tree/Source_Code/softether-src-v4.22-9634-beta.tar.gz"
HUB_NAME: 名前を決める
HUB_PASSWD: パスワードを決める
USER_NAME: 名前を決める
USER_PASSWD: パスワードを決める
COMMON_SECRET: 共通キー文字列を決める
restart: always
volumes:
- vpn_data:/usr/vpnserver
- ./vpnserver/vpn_server.config:/usr/vpnserver/vpn_server.config
ports:
- '5555:5555/tcp'
- '500:500/udp'
- '4500:4500/udp'
- '55504:55504/udp'
volumes:
vpn_data:
ポートは4つ開けていますが、目的は以下の通りです。
- 500/udpと4500/udpはL2TP/IPsec方式でIPv4接続するため
- 55504/udpはOpenVPN方式でIPv6接続するため
- 5555:5555/tcpは「SoftEther VPN サーバー管理」と接続するため
55504番ポートは筆者宅のIPoE接続時のIPv4 over IPv6の空きポートであり、接続条件により利用可能なポート番号に適宜変更が必要です。利用可能なポート番号の調べ方はHGW(ホームゲートウェイ)の設定を参照。
FROM amazonlinux:2017.03
RUN yum install -y gcc make ncurses-devel openssl-devel readline-devel wget
ARG SOFTETHER_URL="https://jp.softether-download.com/files/softether/v4.22-9634-beta-2016.11.27-tree/Source_Code/softether-src-v4.22-9634-beta.tar.gz"
ARG HUB_NAME="DefaultHub"
ARG HUB_PASSWD="DefaultHubPassword"
ARG USER_NAME="DefaultUser"
ARG USER_PASSWD="DefaultUserPassword"
ARG COMMON_SECRET="commonsec"
RUN cd / && \
mkdir -p softether_vpn && \
cd softether_vpn && \
wget ${SOFTETHER_URL} && \
tar zxvf *.tar.gz && \
cd $(tar ztvf *.tar.gz| head -n1 | awk '{print $NF}') && \
cp -f src/makefiles/linux_64bit.mak Makefile && \
make && \
make install && \
make clean && \
rm -rf /softether_vpn
RUN /usr/vpnserver/vpnserver start && \
sleep 5 && \
vpncmd /SERVER localhost /ADMINHUB:DEFAULT /CMD HubCreate ${HUB_NAME} /PASSWORD:${HUB_PASSWD} && \
vpncmd /SERVER localhost /ADMINHUB:${HUB_NAME} /CMD UserCreate ${USER_NAME} /GROUP:none /REALNAME:none /NOTE:none && \
vpncmd /SERVER localhost /ADMINHUB:${HUB_NAME} /CMD UserPasswordSet ${USER_NAME} /PASSWORD:${USER_PASSWD} && \
vpncmd /SERVER localhost /ADMINHUB:${HUB_NAME} /CMD IPsecEnable /L2TP:yes /L2TPRAW:no /ETHERIP:no /PSK:${COMMON_SECRET} /DEFAULTHUB:${HUB_NAME} && \
vpncmd /SERVER localhost /ADMINHUB:${HUB_NAME} /CMD SecureNatEnable && \
vpncmd /SERVER localhost /ADMINHUB:${HUB_NAME} /CMD NatEnable && \
vpncmd /SERVER localhost /ADMINHUB:${HUB_NAME} /CMD DHCPEnable && \
/usr/vpnserver/vpnserver stop
CMD /usr/vpnserver/vpnserver execsvc
EXPOSE 500/udp 4500/udp
vpnserver/vpn_server.configファイルを修正
# Software Configuration File
# ---------------------------
#
# You may edit this file when the VPN Server / Client / Bridge program is not running.
#
# In prior to edit this file manually by your text editor,
# shutdown the VPN Server / Client / Bridge background service.
# Otherwise, all changes will be lost.
#
declare root
{
...
declare ListenerList
{
declare Listener0
{
bool DisableDos false
bool Enabled false ← ポート443での待ち受けを無効化※Apacheと競合するため
uint Port 443
}
declare Listener1
{
bool DisableDos false
bool Enabled false ← ポート992での待ち受けを無効化
uint Port 992
}
declare Listener2
{
bool DisableDos false
bool Enabled false ← ポート1194での待ち受けを無効化
uint Port 1194
}
declare Listener3
{
bool DisableDos false
bool Enabled true
uint Port 5555
}
}
...
declare ServerConfiguration
{
...
string OpenVPN_UdpPortList 55504 ← 筆者宅の場合
...
}
...
}
VPNサーバ起動
$ docker compose up -d
SoftEther VPN サーバー管理
VPN Serverマネージャのインストール(Windows11)
SoftEther VPNにはGUIでサーバを管理できるツールが用意されています。公式サイトからツールをダウンロードします。
https://www.softether-download.com/ja.aspx?product=softether
SoftEtherダウンロードセンター
例えば、Windows11上でサーバを管理する場合は、
ダウンロードするソフトウェアを選択:SoftEther VPN(Freeware)
コンポーネントを選択:SoftEther VPN Server Manager for Windows
プラットフォームを選択:Windows
CPU を選択:Intel(x86 and x64)
を選択し、出てきたファイルリストから一番新しいバージョンのインストーラーをダウンロードすればよいでしょう。本記事執筆時点での最新ビルドはコレ。
softether-vpnserver_vpnbridge-v4.41-9782-beta-2022.11.17-windows-x86_x64-intel.exe
インストーラーをダブルクリックして起動し、「SoftEther VPN サーバー管理マネージャ(管理ツールのみ)」を選択肢インストールします。
余談ですが、「サーバー管理マネージャ」って名前ヘンですね。訳すると「サーバ管理管理」だし。
SoftEtherVPN Serverマネージャの設定
SoftEtherVPN Serverマネージャを起動します。これで、linux上にインストールしたSoftEther VPN ServerをWindows11等のクライアントOS上のGUIで管理できます。
SoftEtherVPN Serverマネージャを起動したら、「新しい接続設定(N)」をクリックし、linux上にインストールしたSoftEtherVPN Serverとの接続を確立させます。
「新しい接続設定の作成」で、
接続先ホスト名:(SoftEther VPN Serverをインストールした PC のIPアドレス)
接続先ポート番号:5555
を指定し、接続設定を作成します。接続の際、パスワードを聞かれますので、SoftEther VPN Serverをインストールした PC のルートのパスワードを入力してください。 SoftEther VPN Serverとの接続が確立すると、以下のウィンドウが表示されます。
ここで、「仮想HUBの作成(C)」ボタンをクリックし、仮想HUBを作成します。 仮想HUBの新規作成ウィンドウが開きます。
仮想HUB名:docker-compose.ymlのHUB_NAMEで指定した名前
パスワード:docker-compose.ymlのHUB_PASSWDで指定した文字列
を指定して、「OK」をクリックします。仮想HUBの管理ウィンドウが開きます。
このように、「SoftEtherVPN Serverマネージャ」により、linuxで稼働させたSoftEther VPN サーバーをクライアントOS(Windows11)のGUIで管理出来るようになります。
OpenVPNクライアント設定ファイルの取得
SoftEtherVPN Serverマネージャから、
接続(C)>OpenVPN/MS-SSTP設定
により、「OpenVPN/MS-SSTP VPNサーバー機能設定」を開きます。
「OpenVPNサービスを提供するUDPポート」がvpnserver/vpn_server.configファイルで指定した値になていることを確認します。
次に、「OpenVPNクライアント用のサンプル設定ファイルを生成(C)」をクリックし、設定ファイルのサンプルをダウンロードします。zipファイルになっています。
zipファイル中に
hhhhhhhhhhhh_openvpn_remote_access_l3.ovpn
このような名前のファイル(名前にl3が含まれていて拡張子が.ovpn)を後でvpnクライアントの設定の際に使用するので保管しておいてください。このファイルはとても重要で、悪意の第3者に渡ってしまうと、自宅サイトが乗っ取られてしまうかもしれません。取り扱いに注意しましょう。
クライアント設定ファイルのファイル名は何でも良いのですが、クライアントからvpnサーバを選択する際の名前になりますので、わかりやすい名前に変更しておけばいいでしょう。例えばsoftether_vpn_v4.ovpnとか。
クライアント設定ファイルは拡張子は.ovpnですが中身はふつうのテキストファイルです。このファイルをテキストエディタで開きremote行に自宅vpnサーバのアドレスとポート番号が意図した通りであるかを確認しておきましょう。
remote vpn999999999.v4.softether.net 55504
自宅vpnサーバのアドレスがvpn999999999.softether.netとなっていたらvpn999999999.v4.softether.netに変更しておきましょう。今回の設定では、IPV4 over IPv6によりIPv4でサーバと接続します。
ダイナミックDNS
vpnを利用する場合、vpnクライアントから自宅に立てたvpnサーバを指定する必要があります。HGW(ホームゲートウェイ)で配布されたIPアドレスを確認し、そのアドレスをvnpクライアントで指定すればそれで済むのですが、IPアドレスは未来永劫固定な訳ではないので、なにかのタイミングでIPアドレスが変わるとその度にvnpクライアントの設定を変更しなければなりません。
これでは不便なので、ダイナミックDNSを使用し、名前で自宅サーバのアドレスを指定するようにします。「ダイナミック」の呼称の通り、IPアドレスが変わっても同じ名前で自宅サーバにアクセスできます。そのために利用するのがSoftEtherVPN ServerのダイナミックDNS機能です。
SoftEtherVPN Serverマネージャから、
接続(C)>ダイナミックDNS設定
により、「ダイナミックDNS機能」を開きます。
ここの「ダイナミックDNSホスト名の変更(C):」に表示される、vpn999999999.softether.netが、VPNサーバのアドレスになります。好みの名前に変更も可能です。
ダイナミックDNSにより自宅vpnサーバーのIPアドレスが変わっても常にvpn999999999.softether.netの名前でアクセスできます。
HGW(ホームゲートウェイ)の設定
NTT西日本のHGW(ホームゲートウェイ) RT-500KIを例に、IPoE(IPV4 over IPv6)環境でSoftetherVPN+OpenVPNを動かすための設定方法をまとめます。
IPV4 over IPv6に関する設定は以下のurlで開くページで指定します。この例ではHGWのアドレスをデフォルトのまま192.168.1.1としています。
「IPoE IPv4設定」をクリック、設定のトップページが開きます。
自宅サイトのグローバルIPv4アドレスと利用可能ポートがわかります。PPPoEでは利用可能な全ポートの1/68程度しか利用できません。IPoEの場合、1つのグローバルIPv4アドレスを68サイトで共用しているということなんでしょう。
SoftetherVPN+OpenVPNをIPoE(IPV4 over IPv6, ポート55504/udpを使用)で利用するため、「静的IPマスカレード設定」で55504/udpを開けます。左サイドメニューの「静的IPマスカレード設定」をクリックし、1番目のエントリーを「編集」します。
筆者の場合、55504は利用可能ポートですが、利用可能ポートはサイト毎に異なります。利用可能ポートにあわせて適宜変更してください。
「LAN側宛先IPアドレス」に自宅LAN内のvpnサーバのプライベートIPv4アドレスを指定します。
以上でHGW(ホームゲートウェイ)の設定は完了。
MacOSクライアントの設定
MacOSからOpenVPNサーバーに接続するには、今回は「Tunnelblick」を使用しました。
https://tunnelblick.net/downloads.html
Tunnelblickダウンロードページ
ダウンロードページからインストーラーの.dmgファイルをダウンロードし、マウントしてTunnelblick.appをダブルクリックするだけでインストール完了です。
Tunnelblickをインストールするとメニューバーに梵鐘のようなアイコンが追加されるので、最初にそこから「VPNの詳細…」を選択。
接続先設定タブを選択。最初は左側の接続先一覧が空の状態ですが、ここにOpenVPNクライアント設定ファイルの取得で説明したクライアント設定ファイルをドラッグします。クライアント設定ファイルは大事なファイルなのでTunnelblickにドラッグした後、Mac上に放置しないように注意!
クライアント設定ファイルが受け入れられたら「接続」ボタンをクリック。
ユーザ名、パスワード、セキュリティコードの入力ダイアログに遷移します。docker-compose.ymlで設定したユーザ名とパスワードを指定します。セキュリティコードは空白のまま。
認証に成功するとデスクトップ右上に接続ウィンドウが表示されます。
2回目以降の操作は梵鐘アイコンからどうぞ。
簡単ではありますが、OS標準搭載のvpn設定が使えないのが残念なところです。
蛇足ですが、接続実験を行う場合は、当然のことながらvpnクライアントとvpnサーバは別のネットワークに接続されている必要があります。
Windows11クライアントの設定
https://www.openvpn.jp/download/
OpenVPNダウンロードサイト
ダウンロードサイトからWindowsインストーラをダウンロードして、
OpenVPNのインストールはダウンロードしたインストーラを起動して「Install Now」をクリックするだけ、特に設定しなければならないこともありません。
インストールを終えたら、
C:\Users\自分のアカウント\OpenVPN\config
このフォルダーにOpenVPNクライアント設定ファイルの取得で説明したクライアント設定ファイルを入れます。
OpenVPNに関する操作は全てタスクトレイから行います。図の最下行の右側のアイコンを右クリック。
以下のメニューがポップアップします。
vpn接続する場合はメニューの「接続」を選択。ユーザ名、パスワードの入力ダイアログがポップアップします。docker-compose.ymlで設定したユーザ名とパスワードを指定します。
接続に成功すると、アイコンが緑色に変わります。
接続の状況はメニューの「ステータスの表示」で確認できます。
簡単ではありますが、OS標準搭載のvpn設定が使えないのが残念なところです。
蛇足ですが、接続実験を行う場合は、当然のことながらvpnクライアントとvpnサーバは別のネットワークに接続されている必要があります。
iOSクライアントの設定
App Storeから「OpenVPN Connect」をインストールします。
次にOpenVPNクライアント設定ファイルの取得で説明したクライアント設定ファイルを自分宛てのメールに添付し、自分にメールします。このメールを受信し、添付ファイル(拡張子が.ovpnのファイル)をタップし、処理するアプリから「OpenVPN Connect」を選択します。
尚、この方法は簡単ではありますが、セキュリティ的には雑な方法ですので、使った後の.ovpnファイルが添付されたメールは確実に消去する等を忘れないように。
.ovpnファイルをタップすると、「OpenVPN Connect」から設定ファイルを追加する旨のメッセージが表示されるので、「Add」を選択します。ユーザ名とパスワードを聞かれるので、docker-compose.ymlで指定したユーザ名とパスワードを指定します。
設定ファイルが追加されると、
左側のトグルスイッチアイコンをタップするとvpnに接続します。
簡単ではありますが、OS標準搭載のvpn設定が使えないのが残念なところです。
蛇足ですが、自宅で接続実験を行う場合は、vpnクライアントとvpnサーバは別のネットワークに接続されている必要があるので、スマホのWifiは切ってモバイルネットワーク通信で。
まとめ
SoftetherVPNのOpenVPN接続によるvpnサーバをdocker composeで立ち上げて、IPoE環境(IPv4 over IPv6)でvpnを利用する方法を解説しました。IPoE環境ではipv4接続時にはポートが自由に使えないのでvpnは鬼門です。それでもOpenVPNを使うことにより、PPPoE接続の時のようにvpnを使えるようにできました。