OpenVPN using TUN & routing

インストール
$ sudo apt-get install openvpn libssl-dev openssl


鍵/証明書の準備(12.04 Create the easy-rsa folder and copy the sample files into it)
$ sudo mkdir /etc/openvpn/easy-rsa/
$ sudo cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/
$ sudo chown -R $USER /etc/openvpn/easy-rsa/


鍵/証明書の準備(14.04, easy-rsa is an installed application)
$ sudo apt-get install easy-rsa
$ sudo make-cadir /etc/openvpn/easy-rsa


署名用の情報を編集
$ sudo nano /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY="JP"
export KEY_PROVINCE="TOKYO"
export KEY_CITY="Chiyoda"
export KEY_ORG="EmperorPalace"
export KEY_EMAIL="hirohito@empire.jp"


サーバ&局(CA_Authority)証明書の作成
$ cd /etc/openvpn/easy-rsa/
$ source vars
$ ./clean-all
$ ./build-dh
$ ./pkitool --initca
$ ./pkitool --server server

(鍵は/etc/openvpn/easy-rsa/keys内に保存される)


TLSキーの作成
$ cd /etc/openvpn/easy-rsa/keys/
$ openvpn --genkey --secret ta.key

(TLS認証を/etc/openvpn/server.confで設定した時のみ。その場合はクライアント側でも設定必要。そうでない場合はta.keyは局・サーバ・クライアントで必要無し。)


作った証明書、キーを設定ディレクトリ(局:CA_Authority)にコピー。=>局は完成
$ sudo cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/


サーバーの設定
先ず設定サンプルをコピー&解凍
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
$ sudo gzip -d /etc/openvpn/server.conf.gz

設定サンプルを編集(uncomment&edit)
$ sudo nano /etc/openvpn/server.conf

server 192.168.3.0 255.255.255.0  (OpenVPN内部のネットワークを指定。デフォルトは10.8.0.0/24)
push "redirect-gateway def1 bypass-dhcp" (OpenVPNサーバをデフォルトゲートウェイ)
push "route 192.168.3.0 255.255.255.0"  (??上記が有れば必要ない筈??)

user nobody (セキュリティを高上)
group nogroup (セキュリティを高上)

mode server
tls-server    (TLS認証を設定する時のみ)
tls-auth ta.key 0 (TLS認証を設定する時のみ,クライアント側では反対の値「1」を設定)

;client-to-client (クライアント同士の通信を無効化,uncommentで有効化)
cipher AES-128-CBC (暗号化を指定、クライアント側も同じ設定必要。暗号化を強くすると速度が落ちる)

port 45678    (好みに合わせて)
proto udp    (tcpは遅い。但しクライアント側がtcpのみの時はtcpに変更)
dev tun     (tapプロトコルを使うときは変更)
comp-lzo     (圧縮を掛けると通信速度は向上、クライアントのCPUが遅いと遅くなる。クライアント側で合わせる必要有り)

duplicate-cn    (1クライアント・アカウントで複数ログインを許す)

push "dhcp-option DNS 208.67.222.222" (openDNS:クライアント・ローカルのDNSを使わない場合)
push "dhcp-option DNS 8.8.8.8"    (google :クライアント・ローカルのDNSを使わない場合)

status /etc/openvpn/openvpn-status.log (現在アクセスしているクライアント)
log-append /var/log/openvpn.log    (ログファイル)
verb 1 # don't spam the log with messages.
mute 10 # suppress identical messages > 10 occurances.

script-security 1

ーーーサーバー設定完了

OpenVPNサーバー起動確認
$ sudo /etc/init.d/openvpn restart
* Stopping virtual private network daemon(s)... * Stopping VPN 'server' [ OK ]
* Starting virtual private network daemon(s)... * Autostarting VPN 'server'
$ ps aux | grep openvpn
nobody … /usr/sbin/openvpn --writepid /var/run/openvpn.server.pid --daemon ovpn-server --cd /etc/openvpn --config /etc/openvpn/server.conf --script-security 1  ≪=これが有れば再起動成功。ユーザーとセキュリティーレベルチェック
1000 … grep --color=auto openvpn ≪=自分


カーネルパラメータ /etc/sysctl.confを編集し、IPv4 のパケット転送を許可
$ sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1 uncomment#
$ sudo sysctl -p


ファイアーウォールの設定(ルーティング)
OpenVPNサーバをOpenVPNクライアントのデフォルトゲートウェイにした場合、VPNに接続したクライアントがインターネットと接続するためには、OpenVPNサーバ側でパケットをインターネット側に転送
$ sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.0.0 -o eth0 -j MASQUERADE

(上記は仮想ネットワーク接続がTUNでサーバホスト機の実装ネットワーク接続がeth0の場合。因みにOpenVPNの仮想ネットワーク・デフォルトは10.8.0.0/255.255.0.0仮想ネットワークの内部のIPアドレスの設定は/etc/openvpn/server.confで別途設定、後序)

ルーティングの確認

$ sudo iptables -t nat -nL -v

Chain PREROUTING (policy ACCEPT 48358 packets, 2387K bytes)
pkts bytes target prot opt in out source destination

Chain INPUT (policy ACCEPT 2190 packets, 325K bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 15 packets, 1044 bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 15 packets, 1044 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * eth0 10.8.0.0/16 0.0.0.0/0 ←これが◎の結果

ルーティングの永続化

nano /etc/openvpn/up.sh
#!/bin/sh
/sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.0.0 -o eth0 -j MASQUERADE

nano /etc/openvpn/down.sh
#!/bin/sh
/sbin/iptables -t nat -D POSTROUTING -s 10.8.0.0/255.255.0.0 -o eth0 -j MASQUERADE

sudo chmod 755 /etc/openvpn/down.sh
sudo chmod 755 /etc/openvpn/up.sh

$ sudo nano /etc/openvpn/server.conf
末尾に追加

up "/etc/openvpn/up.sh"
down "/etc/openvpn/down.sh"
script-security 3

リスタート

ーーーサーバー&ホスト環境設定完了。

クライアント用の鍵作成
$ cd /etc/openvpn/easy-rsa/
$ source vars
$ KEY_CN=UniqueCommonName (何でも良いがクライアント・アカウント毎に違う必要有り)
$ ./pkitool $USER (現在操作中のユーザーアカウント、後に追加するアカウントが有れば./pkitool ClientName)


クライアントへの鍵を転送(Ubuntuなら通常/home/username/)
/etc/openvpn/ca.crt
/etc/openvpn/ta.key (TLS認証を設定する時のみ)
/etc/openvpn/easy-rsa/keys/client.crt
/etc/openvpn/easy-rsa/keys/client.key

クライアント(network-manager)へOpenVPNのプラグインをインストール
$ apt-get install network-manager-openvpn



クライアントへの鍵を転送(Mac/iPhone等で.ovpnファイルなら)
client
dev tun
proto udp
remote openvpn-server.domain.com 45678
resolv-retry infinite
nobind
persist-key
persist-tun
;ca ca.crt
;cert ipad.crt
;key ipad.key
comp-lzo
verb 3

<ca>

          • BEGIN CERTIFICATE-----

MIIDuDCCAyGgAwIBAgIJANv02SnW6i6TMA0GCSqGSIb3DQEBBQUAMIGaMQswCQYD
[... snip ...]
Ggx0uDBQuVzhC4skB9YXt+Z2TCzXogEBtE9h/A0tR8t+ErsoXSDJ3UC7MRI=

          • END CERTIFICATE-----

</ca>
<cert>

          • BEGIN CERTIFICATE-----

MIID9TCCA16gAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBmjELMAkGA1UEBhMCSlAx
[... snip ...]
5uE2hKer80ia

          • END CERTIFICATE-----

</cert>
<key>

          • BEGIN PRIVATE KEY-----

MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMesHWRNGH9klvU/
[... snip ...]
GHsGbRenaBWR0A==

          • END PRIVATE KEY-----

</key>


参考
http://blog.kazu634.com/2013/09/20/how_to_install_openvpn_under_ubuntu_1204/