前回からのつづきです
証明書や秘密鍵などの生成が終わったので,サーバの設定に入ります
設定ファイルの雛形があるので,コピーして使います
なぜかサーバ用だけ固められているので,展開しましょう
% sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
% sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
% sudo gunzip /etc/openvpn/server.conf.gz
構成はL2トンネル+ブリッジにします
サーバの設定ファイルは以下の通り(IPとかは環境に応じて修正して下さい)
主な変更箇所は
- 接続時,自宅ネットワークのDNSサーバを参照
- TLS-AUTHを使用
- 暗号化アルゴリズムに256bitのAESを使用
- リンクMTUを1472に設定
MTUはいずれ最適化しようと思いますが,ドキュメントに
However, for many cases, using a value of 1472 will maximize performance for TUN devices over IPv4.
と書いてあったので,とりあえず1472を指定(実はうちIPv6)
フラグメントしてようが,とりあえず繋がってるのでよしとしますw
もうすぐIPv6とおさらばするので
port 1194
proto udp
dev tap0
ca CAの証明書
cert サーバの証明書
key サーバの秘密鍵
dh DHパラメータ
ifconfig-pool-persist ipp.txt
server-bridge 192.168.86.10 255.255.255.0 192.168.86.101 192.168.86.125
push "dhcp-option DNS 192.168.86.10"
keepalive 10 120
tls-auth 共通鍵 0
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
log-append /var/log/openvpn.log
verb 4
link-mtu 1472
クライアントの設定ファイルもサーバに合わせて変更しましょう
client
dev tap
proto udp
remote VPNサーバの名前orアドレス 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca CAの証明書
cert クライアントの証明書
key クライアントの秘密鍵
ns-cert-type server
tls-auth 共通鍵 1
cipher AES-256-CBC
comp-lzo
verb 4
link-mtu 1472
次にブリッジの設定です
ブリッジ操作用のコマンドを使うのでインストールしましょう
% sudo apt-get install bridge-utils
ブリッジの作成と削除を行うスクリプトの雛形があるので,コピーして使います
% sudo cp /usr/share/doc/openvpn/examples/sample-scripts/bridge-st* /etc/openvpn/
まず,ブリッジの作成を行うbridge-startスクリプトです
ブリッジにデフォゲを設定するように変更しました
#!/bin/bash
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"
# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0"
eth_ip="192.168.86.10"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.86.255"
eth_gateway="192.168.86.1"
for t in $tap; do
openvpn --mktun --dev $t
done
brctl addbr $br
brctl addif $br $eth
for t in $tap; do
brctl addif $br $t
done
for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done
ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
route add default gw $eth_gateway $br
つづいて,ブリッジの削除を行うbridge-stopスクリプトです
ブリッジの削除後,eth0をもとの設定に戻すように変更しました
#!/bin/bash
####################################
# Tear Down Ethernet bridge on Linux
####################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged together
tap="tap0"
# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0"
eth_ip="192.168.86.10"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.86.255"
eth_gateway="192.168.86.1"
ifconfig $br down
brctl delbr $br
for t in $tap; do
openvpn --rmtun --dev $t
done
ifconfig $eth $eth_ip netmask $eth_netmask broadcast $eth_broadcast
route add default gw $eth_gateway $eth
ブリッジの作成・削除とOpenVPNサーバの起動・終了のタイミングは次の順で行います
- ブリッジの作成
- OpenVPNサーバの起動
- OpenVPNサーバの終了
- ブリッジの削除
OpenVPNの起動前にbridge-startを実行して,終了後にbridge-stopを行うようにします
64-67行目と81-84行目を追加しました
% sudo vim /etc/init.d/openvpn
34 start_vpn () {
・・・
60 # Check to see if it's already started...
61 if test -e /var/run/openvpn.$NAME.pid ; then
62 log_failure_msg "Already running (PID file exists)"
63 else
64 # Add bridge
65 if [ -f /etc/openvpn/bridge-start ]; then
66 /etc/openvpn/bridge-start
67 fi
68
69 $DAEMON $OPTARGS --writepid /var/run/openvpn.$NAME.pid \
70 $DAEMONARG $STATUSARG --cd $CONFIG_DIR \
71 --config $CONFIG_DIR/$NAME.conf $script_security < /dev/null || STATUS=1
72 fi
73 log_end_msg $STATUS
74 }
75 stop_vpn () {
76 kill `cat $PIDFILE` || true
77 rm -f $PIDFILE
78 rm -f /var/run/openvpn.$NAME.status 2> /dev/null
79 log_end_msg 0
80
81 # Remove bridge
82 if [ -f /etc/openvpn/bridge-stop ]; then
83 /etc/openvpn/bridge-stop
84 fi
85 }
これで,OpenVPNサーバを起動すると
% ifconfig
br0 ・・・
eth0 ・・・
lo ・・・
tap0 ・・・
% route
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ Metric Ref 使用数 インタフェース
192.168.86.0 * 255.255.255.0 U 0 0 0 br0
default 192.168.86.1 0.0.0.0 UG 0 0 0 br0
のように,tap0とbr0が作られて,ゲートウェイが設定されるようになります
OpenVPNサーバを終了すると
% ifconfig
eth0 ・・・
lo ・・・
% route
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ Metric Ref 使用数 インタフェース
192.168.86.0 * 255.255.255.0 U 0 0 0 eth0
default 192.168.86.1 0.0.0.0 UG 0 0 0 eth0
のように,tap0とbr0は削除され,もとの設定に戻ります
細かいところですが,このままだとOpenVPNサーバの起動中にnetworkingを再起動すると,ルーティングテーブルがバグります
テーブルを見れば分かるように,192.168.86.0についてはbr0が先に,デフォゲはbr0のメトリックの方が小さいので問題なく動きますが・・・
ちょっと気持ち悪い
% route
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ Metric Ref 使用数 インタフェース
192.168.86.0 * 255.255.255.0 U 0 0 0 br0
192.168.86.0 * 255.255.255.0 U 0 0 0 eth0
link-local * 255.255.0.0 U 1000 0 0 eth0
default 192.168.86.1 0.0.0.0 UG 0 0 0 br0
default 192.168.86.1 0.0.0.0 UG 100 0 0 eth0
なので,networkingを再起動するときにOpenVPNサーバが動作していれば,OpenVPNサーバも一緒に再起動するようにしました
76-80行目と92-95行目を追加しました
本来ならnetworkingをstopする時にも,OpenVPNサーバを終了させるべきかも知れませんが,networkingをstopすることはまずないのでズボラしました
% sudo vim /etc/init.d/networking
75 force-reload|restart)
76 >... # Stop openvpn if running
77 >...if [ -e /var/run/openvpn.server.pid ]; then
78 >...>...OPENVPN="TRUE"
79 >...>.../etc/init.d/openvpn stop
80 >...fi
81
82 >...process_options
83
84 >...log_action_begin_msg "Reconfiguring network interfaces"
85 >...ifdown -a --exclude=lo || true
86 >...if ifup -a --exclude=lo; then
87 >... log_action_end_msg $?
88 >...else
89 >... log_action_end_msg $?
90 >...fi
91
92 >...# Restart openvpn
93 >...if [ "$OPENVPN" = "TRUE" ]; then
94 >...>.../etc/init.d/openvpn start
95 >...fi
96 >...;;
OpenVPNサーバが起動している場合,bridge-startでeth0のアドレスが変更されて経路情報も消えているので,85行目の「ifdown -a –exclude=lo」で
RTNETLINK answers: No such process
SIOCDELRT: No such process
といわれますが,特に問題はありません
以上で,OpenVPNの設定はオシマイです