OpenVPNサーバ作成

今回の動機

後輩から「OpenVPNに興味がある」と言われた&新LinkStation(LS-XHL)でOpenVPNの設定が面倒だったので設定してなかたので、作業メモを纏めてみます。

特徴

  • 幅広い設定が可能
    • VPNがエミュレートするレイヤーはL3(tun)とL2(tap)から選択可能
    • 下位プロトコルは任意ポートのTCP/UDPから選択可能
  • VPN(PPTPやIP-Secなど)に比べ接続可能なクライアントは限られる

作業

以下の手順では、「認証に共有キーを使い」「TCPベースでの接続」、「L2(tap0)のエミュレート」で接続可能なOpenVPNサーバを設定します。
本当は「tcp over tcp」の問題もあるので、UDPで接続した方がスループットは出ると思いますけど、TCP通信しか許可していない環境からの接続&VPN上での通信量があまり多くない事を考え、この方法を採用しました。

作業手順

カーネルの確認/再構築

最低限

  • NICのブリッジ接続が有効(brctlが使える)
  • 仮想NICドライバが有効(tap0を作成できる)
  • IPフィルタリング機能が有効(iptablesが使える)

である必要があります。が最近のディストリなら最初から有効になってるはずなのであんまり気にする必要はないかも。

必要なモジュールを読み込ませる(/etc/modules)
bridge
ipv6
tun
ip_tables
iptable_filter
ecb
pcbc
ppp_generic
ppp_deflate
ppp_async
ppp_mppe
ppp_synctty

alias ppp-compress-18 ppp_mppe
alias ppp-compress-21 bsd_comp
alias ppp-compress-24 ppp_deflate
alias ppp-compress-26 ppp_deflate

OpenVPNの設定で重要になるモジュールはppp_genericより上の物だと思います。

必要なソフトのインストール
sudo apt-get install openvpn bridge-utils
/etc/sysctl.confの修正
net.ipv4.ip_forward=1

PPTPと同様にIPフォワードを有効化する必要があります。

NICの設定ファイル(/etc/network/interfaces)の内容
auto lo
iface lo inet loopback

auto eth1 br0
iface eth1 inet static
iface br0 inet static
        address 192.168.1.20
        netmask 255.255.255.0
        broadcast 192.168.1.255
        network 192.168.1.0
        gateway 192.168.1.1
        bridge_ports eth1 tap0
        pre-up /usr/sbin/openvpn --mktun --dev tap0
        pre-up /sbin/ifconfig tap0 0.0.0.0 promisc up
        pre-up /sbin/ifconfig eth1 0.0.0.0 promisc up
        pre-up /usr/sbin/brctl addbr br0
        pre-up /usr/sbin/brctl addif br0 eth1
        pre-up /usr/sbin/brctl addif br0 tap0
        pre-up /sbin/iptables -A INPUT -i tap0 -j ACCEPT
        pre-up /sbin/iptables -A INPUT -i br0 -j ACCEPT
        pre-up /sbin/iptables -A FORWARD -i br0 -j ACCEPT
        post-down /usr/sbin/brctl delif br0 tap0
        post-down /usr/sbin/brctl delif br0 eth1
        post-down /usr/sbin/brctl delbr br0
        post-down /usr/sbin/openvpn --rmtun --dev tap0
        post-down /sbin/ifconfig eth1 down

一番の山場です、sshなどネットワークログインしかない端末の場合、この設定に失敗するとログインできなくなってしまうので、段階を設定して少しずつ設定していった方が安全です。

  1. brctl addbr br0でブリッジが作成できるか
  2. openvpn --mktun --dev tap0でTAPデバイスが作成できるか
  3. iptablesが使えるか
  4. /etc/network/interfacesの編集

という感じに。
余談ですが、このbrctlとiptablesを組み合わせは、結構色々なことに使えて(iptables単独ではファイアウォールソフトですが)、brctl+iptables(nat設定)+dhcpd+ponなどを組み合わせると、3Gモバイルルータなどが作れるようになったりします。

OpenVPN設定ファイル(/etc/openvpn/server.conf)の内容
proto tcp-server
port 11194

dev tap0
comp-lzo
secret /etc/openvpn/key.openvpn

ping 10
ping-restart 60
ping-timer-rem
persist-key
persist-tun
verb 3

バイスはtap0を作成したのでそれを指定します、TCP/11194で待ちうけ、共通鍵は後で作成する「/etc/openvpn/key.openvpn」を指定します。

共通鍵の作成
sudo openvpn --genkey --secret /etc/openvpn/key.openvpn

ここで作成した鍵を外から接続するクライアントにコピーします。


再起動

ここまでできたら一旦再起動します。正常に動作しているなら、

ps ax | grep vpn
 1071 ?        Ss     0:00 /usr/sbin/openvpn --writepid /var/run/openvpn.server.pid --daemon ovpn-server --cd /etc/openvpn --config /etc/openvpn/server.conf

netstat -tul
tcp        0      0 *:11194                 *:*                     LISTEN

TCP/11194番で待機しているプロセスが増えます。

# ifconfig
br0       Link encap:イーサネット  ハードウェアアドレス 00:1d:73:c0:ca:42
          inetアドレス:192.168.1.20 ブロードキャスト:192.168.1.255  マスク:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:2365 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:1732 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:0
          RXバイト:258713 (252.6 KiB)  TXバイト:248626 (242.7 KiB)

eth1      Link encap:イーサネット  ハードウェアアドレス 00:1d:73:c0:ca:42
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  メトリック:1
          RXパケット:2367 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:1736 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:532
          RXバイト:297034 (290.0 KiB)  TXバイト:249517 (243.6 KiB)
          割り込み:15

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1 マスク:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:18 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:18 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:0
          RXバイト:964 (964.0 B)  TXバイト:964 (964.0 B)

tap0      Link encap:イーサネット  ハードウェアアドレス 00:ff:0f:b8:1a:a5
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  メトリック:1
          RXパケット:10 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:147 エラー:0 損失:333 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:100
          RXバイト:1143 (1.1 KiB)  TXバイト:25359 (24.7 KiB)

ifconfigが賑やかになってます。

ブロードバンドルータの設定

今回の設定ではTCP/11194のみを使う設定なので、TCPの11194番のポートフォワードを有効化します。

動作試験

公式サイトからインストーラを持ってきて、Windows番のOpenVPNをインストールします。

クライアント側には接続のための設定ファイルと、サーバ設定時に作成した共通鍵があることが必要です。クライアント側の設定ファイル(openvpn.ovpn)は以下の通りです。

proto tcp-client
remote server-fqdn.com 11194
dev tap0
secret key.openvpn
keepalive 10 120
comp-lzo
tun-mtu 1400
persist-key
persist-tun
verb 3

この設定ファイルと共有キーをOpenVPNディレクトリの下にあるconfigディレクトリに置いておきます。その状態でタスクトレイのOpenVPNアイコンを使って接続すると、tapデバイスにローカル上のDHCPDからIPが割り当てられます。

ipconfig /all

〜〜略〜〜
Ethernet adapter ローカル エリア接続 3:

        Connection-specific DNS Suffix  . :
        Description . . . . . . . . . . . : TAP-Win32 Adapter V8
        Physical Address. . . . . . . . . : 00-FF-33-DE-D9-CD
        Dhcp Enabled. . . . . . . . . . . : Yes
        Autoconfiguration Enabled . . . . : Yes
        IP Address. . . . . . . . . . . . : 192.168.1.114
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 192.168.1.1
        DHCP Server . . . . . . . . . . . : 192.168.1.1
        DNS Servers . . . . . . . . . . . : 192.168.1.1
        Lease Obtained. . . . . . . . . . : 2010年1月15日 6:54:29
        Lease Expires . . . . . . . . . . : 2010年1月17日 6:54:29

この状態ならローカルのマシンからVPN上のホスト(192.168.1.114)へpingも通りますし、VPNホストからローカルLAN上のWindowsファイルサーバを見ることもできます。