[Kona Linux] SoftEther VPN クライアントとして設定し、SSL VPN で VPN 接続を行う方法

前書き

Kona Linux を SoftEther VPN クライアントにする方法を模索していました。あれやこれやと失敗を繰り返しているうちに SSL VPN (Ethernet over HTTPS) で SoftEther VPN サーバと接続することに成功しました。

そこで VPN 接続に成功した方法が間違いないか(再現できるか)を確認しながら、ここにその手順を投稿しておこうと思います。

やりたいこと

リナックスを SoftEther VPN クライアントとして設定する。VPN 接続に使うプロトコルは SSL VPN とする。

Kona Linux を選んだ理由は特にありません。Ubuntu 系だからなんとかなるだろうということと、手持ちのリナックスパソコンが Kona Linux だからという程度の理由です。

大まかな手順

  1. VPN クライアントプロセスを起動する
  2. VPN クライアントの設定を行う
  3. VPN サーバへの接続を行う
  4. 仮想 LAN カードに IP を設定する
  5. ルーティングテーブルの変更を行う

上記5つはすべて Kona Linux (VPN クライアント側) で行う設定項目です。

前提条件

SoftEther VPN クライアントは /usr/local/vpnclient にインストールされています。

VPN クライアントとなる Kona Linux はアンドロイドのスマホと USB ケーブルで接続してテザリングでインターネットと通信させています。

この時、アンドロイドのスマホはドコモの LTE 回線を使用しています。

【手順1】VPN クライアントプロセスの起動

まず VPN クライアントを起動させます。root 権限で実行します。

root@kona:~# uname -a
Linux kona 3.16.0-4-686-pae #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) i686 GNU/Linux
root@kona:~# cd /usr/local/vpnclient
root@kona:/usr/local/vpnclient# ps -ef | grep vpn
root 9644 9637 0 01:14 pts/2 00:00:00 grep vpn
root@kona:/usr/local/vpnclient# ./vpnclient start
The SoftEther VPN Client service has been started.
root@kona:/usr/local/vpnclient# ps -ef | grep vpn
root 9648 1 0 01:14 ? 00:00:00 /usr/local/vpnclient/vpnclient execsvc
root 9649 9648 1 01:14 ? 00:00:00 /usr/local/vpnclient/vpnclient execsvc
root 9729 9637 0 01:14 pts/2 00:00:00 grep vpn
root@kona:/usr/local/vpnclient#

【手順2】VPN クライアントの設定

vpncmd を使って VPN クライアントの設定を行っていきます。

手順2では、

  • 仮想 LAN カード
  • VPN 接続設定
  • ユーザーとパスワード

の3つを設定します。

まずは、仮想 LAN カードの作成までです。仮想 LAN カードは NicCreate コマンドで作成します。

root@kona:/usr/local/vpnclient# ./vpncmd
vpncmd コマンド – SoftEther VPN コマンドライン管理ユーティリティ
SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド)
Version 4.19 Build 9578 (Japanese)
Compiled 2015/09/15 15:08:35 by yagi at pc25
Copyright (c) SoftEther VPN Project. All Rights Reserved.vpncmd プログラムを使って以下のことができます。1. VPN Server または VPN Bridge の管理
2. VPN Client の管理
3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)1 – 3 を選択: 2
接続先の VPN Client が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
何も入力せずに Enter を押すと、localhost (このコンピュータ) に接続します。
接続先のホスト名または IP アドレス: localhost
VPN Client “localhost” に接続しました。
VPN Client>NicCreate
NicCreate コマンド – 新規仮想 LAN カードの作成
仮想 LAN カードの名前: if_se1
コマンドは正常に終了しました。
VPN Client>niclist
NicList コマンド – 仮想 LAN カード一覧の取得
項目 |値
—————–+————————————
仮想 LAN カード名|if_se1
状態 |有効 (使用可能)
MAC アドレス |00ACAF504DE6
バージョン |Version 4.19 Build 9578 (Japanese)
コマンドは正常に終了しました。
VPN Client>

続いて2つ目の VPN 接続設定を行います。これは AccountCreate コマンドを使います。

VPN Client>accountcreate
AccountCreate コマンド – 新しい接続設定の作成
接続設定の名前: to_sevpn
接続先 VPN Server のホスト名とポート番号: chararira.softether.net:5555
接続先仮想 HUB 名: Charari_Hub1
接続するユーザー名: keramax
使用する仮想 LAN カード名: if_se1
コマンドは正常に終了しました。
VPN Client>accountlist
AccountList コマンド – 接続設定一覧の取得
項目 |値
——————-+———————————————–
接続設定名 |to_sevpn
状態 |オフライン
接続先 VPN サーバー|chararira.softether.net:5555 (直接 TCP/IP 接続)
仮想 HUB 名 |Charari_Hub1
仮想 LAN カード名 |if_se1
コマンドは正常に終了しました。
VPN Client>

3つ目が VPN 接続に使用するユーザー名とパスワードの設定です。accountusernameset コマンドと accountpasswordset コマンドを使用します。

VPN Client>accountusernameset
AccountUsernameSet コマンド – 接続設定の接続に使用するユーザー名の設定
接続設定の名前: to_sevpn
接続するユーザー名: keramax
この接続設定の認証方法は、現在パスワード認証に設定されています。ユーザー名を変更した後、AccountPasswordSet コマンドでパスワードを設定し直す必要があります。
コマンドは正常に終了しました。
VPN Client>accountpasswordset
AccountPasswordSet コマンド – 接続設定のユーザー認証の種類をパスワード認証に設定
接続設定の名前: to_sevpn
パスワードを入力してください。キャンセルするには Ctrl+D キーを押してください。
パスワード: ********
確認入力 : ********
standard または radius の指定: standard
コマンドは正常に終了しました。
VPN Client>

これまでの設定をまとめて見ることができるのが AccountGet コマンドです。確認のため見ておいてもいいでしょう。

VPN Client>accountget
AccountGet コマンド – 接続設定の設定の取得
接続設定の名前: to_sevpn
項目 |値
————————————-+———————–
接続設定名 |to_sevpn
接続先 VPN Server のホスト名 |chararira.softether.net
接続先 VPN Server のポート番号 |5555
接続先 VPN Server の仮想 HUB 名 |Charari_Hub1
経由するプロキシサーバーの種類 |直接 TCP/IP 接続
サーバー証明書の検証 |無効
接続に使用するデバイス名 |if_se1
認証の種類 |標準パスワード認証
ユーザー名 |keramax
VPN 通信に使用する TCP コネクション数|1
各 TCP コネクションの確立間隔 |1
各 TCP コネクションの寿命 |無制限
半二重モードの使用 |無効
SSL による暗号化 |有効
データ圧縮 |無効
ブリッジ / ルータモードで接続 |無効
モニタリングモードで接続 |無効
ルーティングテーブルを調整しない |無効
QoS 制御機能を使用しない |無効
コマンドは正常に終了しました。
VPN Client>

【手順3】VPN サーバへの接続を行う

vpncmd から AccountConnect コマンドを実行します。AccountList コマンドで接続状況が確認できます。

VPN Client>accountconnect
AccountConnect コマンド – 接続設定を使用して VPN Server へ接続を開始
接続設定の名前: to_sevpn
コマンドは正常に終了しました。
VPN Client>accountlist
AccountList コマンド – 接続設定一覧の取得
項目 |値
——————-+———————————————–
接続設定名 |to_sevpn
状態 |接続完了
接続先 VPN サーバー|Chararira.softether.net:5555 (直接 TCP/IP 接続)
仮想 HUB 名 |Charari_Hub1
仮想 LAN カード名 |if_se1
コマンドは正常に終了しました。
VPN Client>

「状態」のところに「接続完了」と表示されています。これは VPN セッションが張られていることを表しています。

接続状況は /usr/local/vpnclient/client_log にあるログファイルを見て確認することもできます。

# tail -f /usr/local/vpnclient/client_log/client_20150929.log
2015-09-29 01:19:10.634 仮想 LAN カード “if_se1” を作成しました。
2015-09-29 01:22:02.213 新しい接続設定 “to_sevpn” を作成しました。
2015-09-29 01:25:49.802 接続設定 “to_sevpn” への接続処理を開始しました。
2015-09-29 01:25:49.802 接続設定 “to_sevpn”: 1 回目の接続動作を開始します。
2015-09-29 01:25:53.122 接続設定 “to_sevpn”: 接続が完了しました。セッション名: “SID-KERAMAX-3”

これで SoftEther VPN クライアントと SoftEther VPN サーバが VPN セッションで接続されました。イメージ的には VPN トンネルが張られて橋が掛かっている状態です。

ここで初めて仮想 LAN カードの IP 設定に進みます。先に VPN トンネルありき。その後に仮想 LAN カードの IP 設定です。この順序性を理解することが大切です。

なぜなら、仮想 LAN カードの IP を DHCP で設定する場合、橋の上を DHCP の request / reply のパケットが通って行くからです。橋がなかったら DHCP が機能しないわけです。だからこの順序性の理解が重要です。

【手順4】仮想 LAN カードに IP を設定する

ここの IP については補足が必要だと思いますのでそれを先に書いておきます。仮想 LAN カードに設定する IP は固定 IP であれ DHCP を使った動的 IP であれプライベートアドレスになります。

ここでは、仮想 LAN カードに DHCP でプライベート IP を割り当てます。アドレス帯は、10.1.0.0/24 です。

DHCP サーバは VPN 接続した先 (VPN サーバ側) にあります。Kona Linux の仮想 LAN カードから DHCP request が SSL-VPN トンネル(さっきの例え話の橋です)を通って SoftEther VPN サーバの仮想 HUB まで到達します。

そこから DHCP request は仮想 HUB からローカルブリッジングされて SoftEther VPN サーバの物理 NIC からローカルネットワーク (LAN) へと送出されます。

LAN に抜けていった DHCP request はブロードキャスト宛てになっているので LAN 内にいる DHCP サーバまで到達した後、DHCP サーバが DHCP reply を返します。

DHCP リプライは SoftEther VPN サーバの物理NIC に到達した後、ローカルブリッジングされて仮想 HUB に到達します。

仮想 HUB に到達したら SSL-VPN のトンネルを通って Kona Linux まで戻ってきて、SoftEther VPN クライアントの仮想 LAN カードに IP が割り当てられます。

root@kona:~# ifconfig vpn_if_se1
vpn_if_se1 Link encap:イーサネット ハードウェアアドレス 00:ac:af:50:4d:e6
inet6アドレス: fe80::2ac:afff:fe50:4de6/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:54 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:80 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:500
RXバイト:9120 (8.9 KiB) TXバイト:8581 (8.3 KiB)
root@kona:~# dhclient vpn_if_se1
root@kona:~# ifconfig vpn_if_se1
vpn_if_se1 Link encap:イーサネット ハードウェアアドレス 00:ac:af:50:4d:e6
inetアドレス:10.1.0.16 ブロードキャスト:10.1.0.255 マスク:255.255.255.0
inet6アドレス: fe80::2ac:afff:fe50:4de6/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:198 エラー:0 損失:1 オーバラン:0 フレーム:0
TXパケット:262 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:500
RXバイト:33106 (32.3 KiB) TXバイト:25709 (25.1 KiB)
root@kona:~#

dhclient コマンドを実行した後、10.1.0.16 というアドレスが設定されたのがわかります。

しかし、このままにしておくとここから落とし穴が始まります。

まず、接続されていた VPN セッションが切れます。SoftEther VPN クライアントは再接続を試みますがそれが成功することはありません。

client_20150929.log には以下のようなログが残ります。

2015-09-29 01:37:52.376 接続設定 “to_sevpn”: 接続が切断されたか、接続に失敗しました。理由: VPN セッションの通信がタイムアウトしました。クライアントから VPN Server への接続が切断された可能性があります。 (コード 13)
2015-09-29 01:38:07.379 接続設定 “to_sevpn”: 2 回目の接続動作を開始します。
2015-09-29 01:38:22.037 接続設定 “to_sevpn”: 接続が切断されたか、接続に失敗しました。理由: サーバーへの接続が失敗しました。ネットワーク接続や、接続先サーバーのアドレスやポート番号を確認してください。 (コード 1)
2015-09-29 01:38:37.039 接続設定 “to_sevpn”: 3 回目の接続動作を開始します。
2015-09-29 01:38:51.670 接続設定 “to_sevpn”: 接続が切断されたか、接続に失敗しました。理由: サーバーへの接続が失敗しました。ネットワーク接続や、接続先サーバーのアドレスやポート番号を確認してください。 (コード 1)
2015-09-29 01:39:06.672 接続設定 “to_sevpn”: 4 回目の接続動作を開始します。
2015-09-29 01:39:21.331 接続設定 “to_sevpn”: 接続が切断されたか、接続に失敗しました。理由: サーバーへの接続が失敗しました。ネットワーク接続や、接続先サーバーのアドレスやポート番号を確認してください。 (コード 1)

ここで Kona Linux のルーティングテーブルの修正が必要になってきます。

なぜか?

それは VPN セッションが切れてしまう理由が、DHCP により IP 設定が完了した時に DHCP サーバからデフォルトゲートウェイの設定ももらってしまうことにあるからです。

netstat -rn でルーティングテーブルを見てみると、

root@kona:~# netstat -rn
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ MSS Window irtt インタフェース
0.0.0.0 10.1.0.1 0.0.0.0 UG 0 0 0 vpn_if_se1
0.0.0.0 192.168.42.129 0.0.0.0 UG 0 0 0 usb0
10.1.0.0 0.0.0.0 255.255.255.0 U 0 0 0 vpn_if_se1
192.168.42.0 0.0.0.0 255.255.255.0 U 0 0 0 usb0
root@kona:~#

このように 0.0.0.0 = デフォゲのエントリが2つあります。

1つのホストでデフォルトゲートウェイが2つ設定されることになるわけですからこれが通信を不安定にさせるわけです。

だから、仮想 LAN カードに設定されているデフォルトゲートウェイを削除します。

【手順5】ルーティングテーブルの変更

route コマンドを使って仮想 LAN カードに紐付いたデフォゲを削除します。

root@kona:~# route del -net 0.0.0.0 netmask 0.0.0.0 gw 10.1.0.1
root@kona:~# netstat -rn
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ MSS Window irtt インタフェース
0.0.0.0 192.168.42.129 0.0.0.0 UG 0 0 0 usb0
10.1.0.0 0.0.0.0 255.255.255.0 U 0 0 0 vpn_if_se1
192.168.42.0 0.0.0.0 255.255.255.0 U 0 0 0 usb0
root@kona:~#

ルーティングテーブルの不整合(デフォゲが2つもあること)が解消されたことにより、しばらくすると VPN セッションが勝手に復活します。

もう一度 client_20150929.log を見てみると、

2015-09-29 01:46:01.780 接続設定 “to_sevpn”: 18 回目の接続動作を開始します。
2015-09-29 01:46:14.613 接続設定 “to_sevpn”: 接続が完了しました。セッション名: “SID-KERAMAX-4”

これで一件落着です。

が、ここでもう1つ必要に応じてルーティングを追加しておきます。

我が家の LAN では 10.1.0.0/24 の他に 172.16.1.0/24 というネットワークがあります。172.16.1.0/24 のホストにパケットを届けるにはスタティックルートを追加してやる必要があります。

これも route コマンドで実行します。

root@kona:~# route add -net 172.16.1.0 netmask 255.255.255.0 gw 10.1.0.1
root@kona:~# netstat -rn
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ MSS Window irtt インタフェース
0.0.0.0 192.168.42.129 0.0.0.0 UG 0 0 0 usb0
10.1.0.0 0.0.0.0 255.255.255.0 U 0 0 0 vpn_if_se1
172.16.1.0 10.1.0.1 255.255.255.0 UG 0 0 0 vpn_if_se1
192.168.42.0 0.0.0.0 255.255.255.0 U 0 0 0 usb0
root@kona:~# ping 172.16.1.1
PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
64 bytes from 172.16.1.1: icmp_seq=1 ttl=255 time=60.3 ms
64 bytes from 172.16.1.1: icmp_seq=2 ttl=255 time=48.8 ms
64 bytes from 172.16.1.1: icmp_seq=3 ttl=255 time=47.6 ms
^C
— 172.16.1.1 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 47.668/52.296/60.378/5.734 ms
root@kona:~# traceroute 172.16.1.1
traceroute to 172.16.1.1 (172.16.1.1), 30 hops max, 60 byte packets
1 172.16.1.1 (172.16.1.1) 36.973 ms 46.730 ms 46.915 ms
root@kona:~#

Kona Linux (VPN クライアント) と 172.16.1.0/24 の間でも通信ができるようになりました。

これにて Kona Linux を SoftEther VPN クライアントとして機能させる手順が確立しました。

あとは、この一連の手順を起動スクリプトなどにしてそれを実行するだけで VPN  接続できるようにしたり、また、OS 起動時に自動的に VPN 接続できるようにしたりといったことを進めていけば万全な体制になりますね。

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください