KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

SoftEther VPN ClientをUbuntu 14.04LTSで使うときにちょっとはまったこと

ネットワークのお勉強がてらになるかどうかは怪しいですが、SoftEther VPNを使ってVPNの環境をつくってみました。

サーバーの方は、どこのポートを空けるだかとかっていう情報集めでの苦労はありましたが、公式ページの指示通りに進めばソースからコンパイルして起動まで、概ね問題なく進みました。

まぁ、SSLの証明書とか、iPhoneからなぜかつながらなかったりとか、ちょっと詰まったところもありましたが、その辺とかも含めてサーバー側の話はまた追々にします。

7.3 Linux へのインストールと初期設定 - SoftEther VPN プロジェクト

そんな事より1日半ばかり苦戦を強いられたのは、Virtual Boxで起動しているUbuntu 14.04LTSをクライアントとして、VPNに参加させるのが全然うまくいきませんでした。

いろいろ探して行き着いた先

11.1.27 LinuxVPN Client で仮想 LAN カード側をデフォルトゲートウェイに指定した場合に VPN 通信が切断される場合
Linux 版の VPN Client は、ルーティングテーブルの自動書き換え (調整) 機能に対応していません。したがって、Linux 版の VPN Client をリモートコンピュータ上の VPN Server に対して VPN 接続し、仮想 LAN カード (tap デバイス) 側のネットワークの先のルータをデフォルトゲートウェイとして使用した場合は、VPN Server に対する TCP/IP 通信も、そのデフォルトゲートウェイを通過しようとしてしまうため、事前に route コマンドで VPN Server に対するスタティックルートを追加しておく必要があります。これらの TCP/IP やルーティングに関する知識をお持ちの場合のみ、LinuxVPN Client を使用してください。
11.1 トラブルシューティング - SoftEther VPN プロジェクト

ということで、どうやらLinux版のクライアントは、ルーティングテーブルをうまいこと調整してくれないそうです。単純にデフォルトルートを足せばいいって話ではないようで、

  1. 既存のデフォルトルート経由でのVPNサーバーへのスタティックルートを確保
  2. 既存のデフォルトルートをVPN側のgwに設定
  3. VPN側のネットワークでも使用できるDNSサーバーを指定しておく

というのが必要なことのようです。

3.については、Ubuntu 14.04 LTSだと/etc/resolvconf/resolv.conf.d/tailというファイルを用意して、

nameserver 8.8.8.8
nameserver 8.8.4.4

みたいに、VPNのネットワーク上から利用できるDNSを設定してあげとけば良いようです。GoogleのパブリックDNSをしておけば、VPNにつながっていようが、つながっていまいが、使えるだろうので便利かなということで、この設定にしています。本当は、VPNの接続中かどうかで、動的にDNSを切り替えた方がいいんだろうか?

とちょっと疑問は残りますが、3については恒久的な対処法ができましたが、1.、2.については、SoftEther VPN ClientのLinux版では対応していないということなので、手動で毎度やるのか…、となりましたが、決まりきったことなので自動化できてばとググっていると、

softether vpn client for ubuntu /etc/init.d/vpnclient · GitHub

先人がいらっしゃいました。 他の起動スクリプトのソースとかも見ながらちょっと改造して作りましたのが、以下の自動起動スクリプトです。(どの環境でもOKというような動作保証はできませんのであしからず)

自動起動スクリプト

DAEMON="/usr/local/vpnclient/vpnclient"
VPNNAME="vpn_vpn2"
DEFROUTE="192.0.2.1"
NEWDEFROUTE="198.51.100.254"
SERVER="203.0.113.55"

については、各自の環境に合わせて変更していただければと思います。

  • DAEMON: VPN Clientのコマンドパス
  • VPNNAME: VPNで作られる仮想NICの名前(vpn_~という名前のはず)
  • DEFROUTE: VPN接続していないときに使っているネットワークのGWアドレス
  • NEWDEFROUTE: VPN上のネットワークのGWアドレス
  • SERVER: VPNサーバーのグローバルIPアドレス

/etc/init.d/においておけば、sudo service vpnclient startとかってすればVPN接続始まります。ちなみに、単純にvpnclientを起動して、ルーティングの設定を調整するだけなので、vpnclientが起動したときに自動的に接続されるVPNvpncmdとかで設定済みである必要があります。

なんだか、もうちょっと素敵になる気がするのですが、今の自分にはこんなところかな…。とりあえず自分の環境ではうまく動いてくれているので、これでしばらく使ってみます。(お気づきのことがあればコメントください!)