Linuxサーバ(Archlinux)上に L2TP/IPsec VPNサービスを起動させアンドロイド端末がVPN接続してインターネットアクセスできるようにした.その際のメモ.

空港等でフリーWiFiなどを利用することがあるが認証機構がないので通信内容を第三者に盗聴される危険がある.またWiFiの提供者がなんとなく信用できないことがある.もしくはアレゲなサイトにフリーWiFiで接続するのが気になる.そんなときにIP-VPNサーバがあれば便利と思い環境を構築した.

簡単に使用できるという触れ込みで,開発もアクティブそうな ソフトイーサ を選択した.ソフトイーサのサイトは素晴しいドキュメントを備えているが,量が膨大(多機能なので仕方ないと思うが)で必要な箇所を探すのに一苦労するのでメモを残しておく.

環境

OS
ArchLinux
Kernel
4.4.13-1-lts
Arch
x86_64

パッケージは 2016年6月15日時点の最新バージョンを使用した.

概要

パッケージをインストールして,ソフトイーサの管理パスワードを設定する.次にL2TP/IPsec機能を有効化する.この時点でサーバ上の仮想L2スイッチ(Hub)にアクセスができる.

ただし,ルータに相当する機能がなく,IPが割り当てられない,外部ネットワーク(例,インターネット)接続できない,という状況.そのため,仮想DHCP機能と仮想NAT機能を有効化する.

最後にサーバのファイアウォール(iptables)を開ける.

インストール

AURにパッケージがある.

下記のようにビルドしてインストールする.

1
2
3
4
git clone https://aur.archlinux.org/softethervpn.git
cd softethervpn
makepkg
sudo pacman -U  softethervpn-v4.20_9608-3-x86_64.pkg.tar.xz

インストールされるファイルは次である.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
% pacman -Ql softethervpn
softethervpn /usr/
softethervpn /usr/bin/
softethervpn /usr/bin/vpnbridge
softethervpn /usr/bin/vpnclient
softethervpn /usr/bin/vpncmd
softethervpn /usr/bin/vpnserver
softethervpn /usr/lib/
softethervpn /usr/lib/softethervpn/
softethervpn /usr/lib/softethervpn/hamcore.se2
softethervpn /usr/lib/softethervpn/vpnbridge/
softethervpn /usr/lib/softethervpn/vpnbridge/hamcore.se2
softethervpn /usr/lib/softethervpn/vpnbridge/vpnbridge
softethervpn /usr/lib/softethervpn/vpnclient/
softethervpn /usr/lib/softethervpn/vpnclient/hamcore.se2
softethervpn /usr/lib/softethervpn/vpnclient/vpnclient
softethervpn /usr/lib/softethervpn/vpncmd/
softethervpn /usr/lib/softethervpn/vpncmd/hamcore.se2
softethervpn /usr/lib/softethervpn/vpncmd/vpncmd
softethervpn /usr/lib/softethervpn/vpnserver/
softethervpn /usr/lib/softethervpn/vpnserver/hamcore.se2
softethervpn /usr/lib/softethervpn/vpnserver/vpnserver
softethervpn /usr/lib/systemd/
softethervpn /usr/lib/systemd/system/
softethervpn /usr/lib/systemd/system/softethervpn-bridge.service
softethervpn /usr/lib/systemd/system/softethervpn-client.service
softethervpn /usr/lib/systemd/system/softethervpn-server.service

コマンド vpncmd の VPN Tools にて check を使用し動作確認をする.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
VPN Tools>check
Check command - Check whether SoftEther VPN Operation is Possible
---------------------------------------------------
SoftEther VPN Operation Environment Check Tool

Copyright (c) SoftEther VPN Project.
All Rights Reserved.

If this operation environment check tool is run on a system and that system passes, it is most likely that SoftEther VPN software can operate on that system. This check may take a while. Please wait...

Checking 'Kernel System'...
              Pass
Checking 'Memory Operation System'...
              Pass
Checking 'ANSI / Unicode string processing system'...
              Pass
Checking 'File system'...
              Pass
Checking 'Thread processing system'...
              Pass
Checking 'Network system'...
              Pass

All checks passed. It is most likely that SoftEther VPN Server / Bridge can operate normally on this system.

The command completed successfully.

VPN Server の起動と管理モードへのログイン

VPN Server を起動.

1
sudo systemctl start softethervpn-server

VPN server が TCP の 443, 992, 5555 で起動する.

vpncmd で VPN Server 管理を選択し localhost:443 に接続する(サーバ上でHTTPサービスが動作している場合,既に443のポートが埋まっているので,その場合は localhost:992 などで接続する).ハブの名前は空欄にする.

(最終的な動作確認ができたら systemctl enable を忘れないこと.)

管理者パスワードの設定

コマンド ServerPasswordSet にて管理者パスワードを設定する.

1
2
3
4
5
6
7
8
9
VPN Server>SPS
ServerPasswordSet command - Set VPN Server Administrator Password
Please enter the password. To cancel press the Ctrl+D key.

Password: ******************
Confirm input: ******************


The command completed successfully.

L2TP/IPsec の有効化

コマンド IPsecEnable で L2TP/IPsec 機能を有効化する.同時に事前共有鍵を設定する.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
VPN Server>IPE
IPsecEnable command - Enable or Disable IPsec VPN Server Function
Enable L2TP over IPsec Server Function (yes / no): yes

Enable Raw L2TP Server Function (yes / no): no

Enable EtherIP / L2TPv3 over IPsec Server Function (yes / no): no

Pre Shared Key for IPsec (Recommended: 9 letters at maximum): ******

Default Virtual HUB in a case of omitting the HUB on the Username: DEFAULT

The command completed successfully.

設定情報の確認が IPsecGet でできる.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
VPN Server>IPsecGet
IPsecGet command - Get the Current IPsec VPN Server Settings
Item                                               |Value
---------------------------------------------------+-------
L2TP over IPsec Server Function Enabled            |Yes
Raw L2TP Server Function Enabled                   |No
EtherIP / L2TPv3 over IPsec Server Function Enabled|No
IPsec Pre-Shared Key String                        |*******
Name of Default Virtual Hub                        |DEFAULT
The command completed successfully.

仮想Hubの設定

仮想Hub “DEFAULT” を選択.

1
2
3
4
VPN Server>Hub DEFAULT
Hub command - Select Virtual Hub to Manage
The Virtual Hub "DEFAULT" has been selected.
The command completed successfully.

ユーザの作成

コマンド UserCreate でユーザ “hoge” を作成.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
VPN Server/DEFAULT>UserCreate
UserCreate command - Create User
User Name: hoge

Assigned Group Name:

User Full Name:

User Description:

The command completed successfully.

コマンド UserPasswordSet でパスワードを設定.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
VPN Server/DEFAULT>UserPa
UserPasswordSet command - Set Password Authentication for User Auth Type and Set Password
User Name: hoge

Please enter the password. To cancel press the Ctrl+D key.

Password: ******
Confirm input: ******


The command completed successfully.

仮想NATと仮想DHCP

このままでは接続クライアントにIPアドレス割り当てられないし,仮想Hubの外へ通信ができない.

そこで仮想NAT, DCHP機能を有効にする.今回の目的では設定は標準のままで問題ない.

1
2
3
VPN Server/DEFAULT>SecureNatEnable
SecureNatEnable command - Enable the Virtual NAT and DHCP Server Function (SecureNat Function)
The command completed successfully.

iptables の設定

IPsec のために udp 500 (鍵交換), 4500 (NAT越え) と esp (ペイロードの暗号化) を許可する.

1
2
3
iptables -A INPUT -p udp --dport isakmp -j ACCEPT
iptables -A INPUT -p udp --dport ipsec-nat-t -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT

ちなみに esp パケットにはポート番号がないため,NAT配下ではアドレス変換が動作しない.そのため,udp 4500 にくるんで送信する.つまり,esp over udp/4500 ということ(カプセリングしまくりで混乱する).

そして,IPsec 上の L2TP を許可する.

1
iptables -t filter -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport l2tp -j ACCEPT

上の iptables rule は IPsec のカプセル化を解いた後 udp の 宛先ポート L2TP (1701) のパケットを許可するというルール.詳しい説明がman iptables-extensions で表示される.

(確認後に iptable-save で設定保存を忘れないこと.)

Android 端末からのVPN接続

スクリーンキャプチャ付きの解説がソフトイーサのサイトにあるので,その通り接続する.