Alpine Linuxにvpnを入れる

September 25, 2020

linuxAlpineLinux

はじめに

vpn機能を使うと、出先のノートPCから自宅のファイルサーバにアクセスしたり、外出先のスマホで自宅サーバのWebアプリにアクセス出来たりと、とても便利です。

最近ではルーターにvpn機能が搭載されている場合が多いので、あえて自前でvpnサーバを用意する必要性は薄いのですが、筆者宅のルーターはダイナミックDNS機能が無かったので、ダイナミックDNSが無料で使えるSoftEtherVPNを導入しました。

自宅LANをvpnでアクセスする場合、自宅LANのルーターのWAN側IPアドレスを指定する必要がありますが、このアドレスはプロバイダーから付与されるもので、プロバイダーの都合で変化する場合があります。ダイナミックDNS機能があれば、アドレスが変わっても、WAN側IPアドレスをいつも同じ名前でアクセスできるようになります。

尚、自宅LANとインターネットはルーターのPPPoE接続で繋がっているものとします。IPoE接続の場合は、SoftetherVPNをIPoE(IPv6)環境で動かすを参照してください。

SoftEther VPNサーバのインストール

以下の記事を参考に、SoftEther VPNサーバをdocker-composeでインストールします。

【参考】

http://llamerad-jp.hatenablog.com/entry/2016/12/24/152358
VPNサーバを仮想マシン上に建てようとしてハマった話
VirtualPCのブリッジアダプタのプロミスカスモードをONにする。

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\
    build\
        Dockerfile
    vpnserver\
        vpn_server.config
    README.md
    docker-compose.yml

docker-compose.yml中のユーザー名やパスワードなどを好きな値に編集

docker-compose.yml
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: 記載する
    volumes:
      - ./vpnserver/vpn_server.config:/usr/vpnserver/vpn_server.config
      - vpn_data:/usr/vpnserver
    ports:
      - '500:500/udp'
      - '4500:4500/udp'
volumes:
  vpn_data:
build/Dockerfile
FROM amazonlinux:2017.03

RUN yum install -y gcc make ncurses-devel openssl-devel readline-devel wget iptables

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

confファイルを修正

vpnserver/vpn_server.config
        ....
        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
                }
        }

VPNサーバ起動

$ docker compose up -d

ルータの設定

VPNサーバを立てたPCは、自宅LAN内に置かれますから、外部からの接続要求をルータでポートフォワーディングする必要があります。 NTT西日本のルータ RT-500KIを例に、ポートフォワーディングの設定方法をまとめておきます。

宛先IPアドレスにVPNサーバが稼働するPCのIPアドレスを指定します。

トップページ > 詳細設定 > 静的IPマスカレード設定

rt-500ki1.png

トップページ > 詳細設定 > 静的IPマスカレード設定 > エントリ1編集

rt-500ki2.png

トップページ > 詳細設定 > 静的IPマスカレード設定 > エントリ2編集

rt-500ki3.png

ダイナミックDNSの設定

SoftEther VPNのダイナミックDNSを設定すると、

vpn999999999.softether.net

という名前の自分のドメイン名がもらえます。VPNクライアントを設定する際、自宅VPNサーバのアドレスとして、ルータのWAN側のIPアドレスを直接設定するのではなく、vpn999999999.softether.netを設定することにより、WAN側のIPアドレスが変化しても、VPN設定を使い続けることができるようになります。

本節では、Windos10上のSoftEther VPN Serverマネージャを使用して、ダイナミックDNSを設定し、自分のドメイン名vpn999999999.softether.netを取得する手順を解説します。(ちなみに、Mac用のVPN Serverマネージャもあるようです)

(注)SoftEther VPNサーバは前述の設定で、Linux上にインストールされています。本節で設定するのはダイナミックDNSのみです。

VPN Serverマネージャのインストール(Windows10)

SoftEther ダウンロードセンター
https://www.softether-download.com/ja.aspx?product=softether

ダウンロードするソフトウェアを選択:SoftEther VPN(Freeware)
コンポーネントを選択:SoftEther VPN Server
プラットフォームを選択:Windows
CPU を選択:Intel(x86 and x64)

を指定すると、該当モジュールがリストされます。その中から、

SoftEther VPN Server and VPN Bridge
をダウンロードし、インストールします。

VPN Serverマネージャの設定

SoftEther VPN Server Managerを起動します。これで、linux上にインストールしたSoftEther VPN ServerをWindowsで管理できます。

SoftEtherVPN1.png

SoftEther VPN Server Managerを起動したら、「新しい接続設定(N)」をクリックし、linux上にインストールしたSoftEther VPN Serverとの接続を確立させます。

SoftEtherVPN2.png

「新しい接続設定の作成」で、

接続先ホスト名:(SoftEther VPN Serverをインストールした PC のIPアドレス)
接続先ポート番号:5555

を指定し、接続設定を作成します。接続の際、パスワードを聞かれますので、SoftEther VPN Serverをインストールした PC のルートのパスワードを入力してください。 SoftEther VPN Serverとの接続が確立すると、以下のウィンドウが表示されます。

SoftEtherVPN3.png

ここで、「仮想HUBの作成(C)」ボタンをクリックし、仮想HUBを作成します。 仮想HUBの新規作成ウィンドウが開きます。

SoftEtherVPN4.png

仮想HUB名:docker-compose.ymlのHUB_NAMEで指定した名前
パスワード:docker-compose.ymlのHUB_PASSWDで指定した文字列

を指定して、「OK」をクリックします。仮想HUBの管理ウィンドウが開きます。

SoftEtherVPN6.png

ここで、VPNサーバの設定をGUIで行うことはできますが、そもそもこのサーバは、docker composeで設定しているので、

$ docker compose down -v

と、-vオプションをつけてコンテナを削除すると、せっかく指定した設定が一瞬で消えてしまいます。VPN Serverマネージャは、ダイナミックDNSのためだけに利用すると割り切りましょう。

VPN サーバの管理ウィンドウに戻り、「ダイナミックDNS設定」をクリックすると、「ダイナミックDNS機能」ウィンドウが開きます。

SoftEtherVPN5.png

ここの「ダイナミックDNSホスト名の変更(C):」に表示される、vpn999999999.softether.netが、今回設定したVPNサーバのアドレスになります。好みの名前に変更も可能です。このアドレスをVPNで接続するクライアントPCやスマホに設定します。

Macクライアント

ここで構築したvpnサーバへの、Macからの接続方法をまとめておきます。

コントロールパネル >> ネットワーク

MacClient1.png

左側のリストの「+」クリックし、VPNインターフェースを追加します。

インターフェース:VPN
VPNタイプ:L2TP over IPsec
サービス名:VPN(L2TP)

を指定します。

MacClient3.png

構成:デフォルト
サーバアドレス:ダイナミックDNSのアドレスvpn999999999.softether.net
アカウント名:docker-compose.ymlのUSER_NAME

を指定します。

「詳細設定…」をクリックします。

MacClient2.png

ユーザ認証:パスワード:docker-compose.ymlのUSER_PASSWD
コンピュータ認証:共通シークレット:docker-compose.ymlのCOMMON_SECRET

を指定して、「OK」をクリックします。

次に、「詳細…」をクリックし、 「オプション」タブ:「すべてのトラフィックをvpn接続経由で送信」にチェックを入れます。

以上を設定したら、「接続」クリックすると、vpn接続モードになります。

iPhoneクライアント

ここで構築したvpnサーバへの、iPhoneからの接続方法をまとめておきます。

設定 >> 一般 >> VPN >> VPN構成を追加…

iPhoneClient2.png

タイプ:L2TP
説明:適当に名前を付ける
サーバ:ダイナミックDNSのアドレスvpn999999999.softether.net
アカウント:docker-compose.ymlのUSER_NAME
RSA SecurID:OFF
パスワード:docker-compose.ymlのUSER_PASSWD
シークレット:docker-compose.ymlのCOMMON_SECRET
全ての信号を送信:ON

を設定し、「完了」をタップ

設定 >> 一般 >> VPN >> 状況 「未接続」を「接続」にすると、vpn接続モードになります。

または、
設定 >> vpn をONにすると、vpn接続モードになります。

Windows10クライアント

設定 >> ネットワークとインターネット >> VPN >> VPN接続を追加する

windows1.png

VPN接続を追加ウィンドウに遷移する。

windows2.png

VPNプロバイダー:WIndows(ビルトイン)
接続名:適当に名前を付ける
サーバー名またはアドレス:ダイナミックDNSのアドレスvpn999999999.softether.net
VPNの種類:事前共有キーを使ったL2TP/IPsec
事前共有キー:docker-compose.ymlのCOMMON_SECRET
サインイン情報の種類:ユーザ名とパスワード
ユーザ名:docker-compose.ymlのUSER_NAME
パスワード:docker-compose.ymlのUSER_PASSWD

を設定し、「保存」をタップ

設定 >> ネットワークとインターネット >> VPN

windows4.png

追加した設定をクリックし、「接続」ボタンをクリックすると、vpn接続モードになります。


Written by questions6768 who lives in Uji, Kyoto.