VPN Router

概要

Vagrant を利用して,Nat Router を作成し,そこで SSL-VPN クライアントを起動させることで,VPN Router を構築した. ホスト OS で VPN クライアントが利用できない場合,ゲスト OS をルータ件 VPN クライントとして噛ませることで,VPN を実現することができる.
Juniper の SSL-VPN では,Junos Pulse や Pulse Secure といった SSL-VPN クライアントを利用して SSL-VPN を行う.Windows や Mac では,簡単に Junos Pulse または,Pulse Secure を簡単にインストールできるが,ホスト OS が Linux の x64 ではパッケージの依存関係などを考慮する必要がある.そこで,VPN Router を用いるこで環境に低依存に VPN を実現できる.ちなみに,Pulse Secure とは,Juniper Networks の SSL-VPN 事業部門が分離され設立された企業らしい.今後は Junos Pulse ではなく,Pulse Secure が普及するのだろうか.iPhone アプリや Android アプリでも提供されている.

環境

環境準備

  1. VirtualBox & Vagrant
  1. ubuntu14.04 の box の追加

環境構築

ネットワークアダプタおよび IP

今回は以下のネットワークアダプタおよび IP アドレスを用いる

設定または操作

ゲスト OS に必要な設定の 3.は,ルータとして必要なネットワークアダプタの追加である.具体的には,ホスト OS からのパケットを受け取るホストオンリーアダプタ(eth1)と,インターネット(ルータ)へパケットをフォワードするブリッジアダプタ(eth2)の追加である.この処理は,Vagrantfile に記述することで,Vagrant up した時に動的にネットワクインターフェイスの追加を行うようにした.
一方で,Vagrant up すると Vagrant によって NAT アダプタが動的に生成されてしまう(NAT アダプタを追加しない方法があれば教えてください.).NAT アダプタが生成されるとゲスト OS のデフォルトゲートウェイが NAT アダプタになってしまう.すると,VPN 時に上手く通信の確立ができなくなってしまう.そこで,NAT アダプタ(eth0)をダウンさせ,ブリッジアダプタをデフォルトゲートウェイとして設定する.これが 5.の操作である.この設定も Vagrantfile に記述した.
4.は,ゲスト OS がルータとして動作するようにパケットを NAT としてフォワードする設定である.NAT 構成を取る理由は,VPN クライアントによって生成されるネットワークアダプタをデフォルトゲートウェイにする必要ため.
ホスト OS に必要な設定は,すべてのパケットがゲスト OS であるルータへ送信されるようにすることである.具体的には,ホスト OS のデフォルトゲートウェイを,ゲスト OS のホストオンリーアダプタ(eth0)に設定する.

ゲスト OS

1. & 2.
$ wget http://webdev.web3.technion.ac.il/docs/cis/public/ssl-vpn/Linux/v.8.2R5.0/ps-pulse-ubuntu-debian.deb -P /tmp
$ sudo dpkg -i /tmp/ps-pulse-ubuntu-debian.deb
$ /usr/local/pulse/PulseClient.sh install_dependency_packages
3. & 5.

以下の Vagrantfile を使用する

 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
28
29
30
31
32
33
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.boot_timeout = 600
  config.ssh.forward_agent = true

  private_ip = {
    vpn: '192.168.252.252'
  }
  # --------------------------------------------------
  # vpn-router
  # --------------------------------------------------
  config.vm.define 'vpn-router' do |vpn|
    vpn.vm.box = "ubuntu/trusty32"
    vpn.vm.network :private_network, ip: private_ip[:vpn], auto_config: true
    vpn.vm.network :public_network, type: "dhcp", bridge: "wlp3s0"
    vpn.vm.provision "shell",
      run: "always",
      inline: "ifdown eth0 && dhclient -r eth2 && sudo dhclient eth2", privileged: true
  end

  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
    vb.gui = false

    # Customize the amount of memory on the VM:
    vb.customize ["modifyvm", :id, "--memory", "256", "--cpus", "1", "--ioapic", "on"]

    # VM DNS off
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
  end
end

問題点として vagrant ssh で使用するネットワクアダプタつまり,eth0 をダウンしているので, vagrant ssh で接続できない点が挙げられる.おとなしく ssh vagrant@192.168.252.252(ゲストOSのホストオンリーアダプタのIPアドレス) で接続する.

4.
1
2
3
4
$ sudo echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
$ sudo sudo sysctl -p
$ sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
$ sudo iptables-save -c > /etc/iptables.rules
1
2
3
4
5
6
7
8
$ sudo cat vpn_start.sh
#!/bin/sh

/usr/local/pulse/PulseClient.sh -h $host -u $user_name -U $url -r $realm -p $password &

/sbin/iptables-restore < /etc/iptables.rules

exit 0

vpn_start.sh の$hostや,$url,$realm, $password は各自の環境に合わせてください.-p で password は指定しないほうがいいかもしれない.

ホスト OS

以下のスクリプトを用いてデフォルトゲートウェイをゲスト OS のホストオンリーアダプタ(eth1)に設定している.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$sudo cat vpn.sh
#!/bin/bash

if [ "$1" = "start" ]; then
  sudo route add -net 0.0.0.0 gw 192.168.252.252 netmask 0.0.0.0 vboxnet0
elif [ "$1" = "stop" ]; then
  sudo route del -net 0.0.0.0 gw 192.168.252.252 netmask 0.0.0.0 vboxnet0
else
  echo "invalid argument"
fi`

起動

起動順序は,以下のとおり.

1
2
3
$ vagrant up vpn-router
$ ssh vagrant@192.168.252.252 -t 'sudo /home/vagrant/vpn_start.sh'
$ sudo ./vpn.sh

SSL-VPN 通信の確認には, /usr/local/pulse/PulseClient.sh -Spingtraceroute を使うと良い

参考

Linux で NAT ルータを構成するメモ
Pulse Secure installation on linux