2月
04
2010

OpenVPN導入2@Ubuntu 9.10

前回からのつづきです

証明書や秘密鍵などの生成が終わったので,サーバの設定に入ります

設定ファイルの雛形があるので,コピーして使います
なぜかサーバ用だけ固められているので,展開しましょう

% 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サーバの起動・終了のタイミングは次の順で行います

  1. ブリッジの作成
  2. OpenVPNサーバの起動
  3. OpenVPNサーバの終了
  4. ブリッジの削除

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の設定はオシマイです

Written by p0n in: PC | タグ:

3件のコメント »

  • great post as usual!

    コメント | 2010 年 5 月 3 日
  • h2

    Thanx!

    コメント | 2010 年 5 月 5 日
  • UbuntuにOpenVPNを導入する

    OpenVPNは前から興味あったのですが、特に必要ともしていなかったので、こうい

    トラックバック | 2011 年 9 月 27 日

RSS feed for comments on this post. TrackBack URL

コメントをどうぞ

TheBuckmaker WordPress Themes Webhosting, MP3, AAC & Co