DebianでOpenVPN

とりあえず書こう書こうと思っても書く気にならないので、終わらせる。
書かないで終わらせる。
Wikiを利用するので、そのうちここに置く。
http://tsuge.cuvel.com/wiki/doku.php?id=openvpn_for_debian%E3%81%AE%E4%B8%8B%E6%9B%B8%E3%81%8D
満足の行く出来になったらWitchGardenにあげるという流れにする。
細部は全然検証してないので、そこんとこよろしく・・。参考まで。
余計な設定がいくつか入ってるはず。

準備

とりあえずマシン買ってきて、DebianLinuxのネットワークインストール用CDイメージを落っことして、適当にインストール。
http://www.debian.org/CD/netinst/
最小構成でのインストールを推奨。
忘れたのでDebianのインストールメモは書かない。

パッケージインストール

Debianは強力なapt-getが使えるので、とりあえずapt-getでがんがんいれてしまう。

apt-get install openvpn
apt-get install bridge-utils

依存関係のあるものも勝手に入る。lzoとか。多分。

ディレクトリ作る

/etc/openvpn 755
/etc/openvpn/keys 755(700でもいい)
/etc/openvpn/bin 755

ファイル作る

鍵はFreeBSDと同じ作り方なので、WitchGardenのここでも見て作る。
http://tsuge.astgate.biz/witchgarden/?ETC%20Tips%2fOpenVPN%20%2d%20Bridge%20Mode%20%2d
OpenWikiなので、ある日見たら壊れているかもしれない。そんときゃ、そんときで、がんばって。
多分Debianのeasy-rsaはここにある。
/usr/share/doc/openvpn/examples/easy-rsa


んで、こんな感じで配置する。鍵以外のものも配置する。

ディレクト ファイル名 user group パーミッション
/etc/openvpn/ openvpn.conf root root 644
/etc/openvpn/bin/ up.sh root(or openvpn) root(or openvpn) 755(or 750)
/etc/openvpn/bin/ down.sh root(or openvpn) root(or openvpn) 755(or 750)
/etc/openvpn/keys/ ca.crt root root 644
/etc/openvpn/keys/ ca.key root root 600
/etc/openvpn/keys/ vpn.crt root root 644
/etc/openvpn/keys/ vpn.csr root root 644
/etc/openvpn/keys/ vpn.key root root 600
/etc/openvpn/keys/ dh1024.pem root root 644
/etc/logrotate.d/ openvpn root root 644
/var/log/ openvpn-status.log root root 600
/var/log/ openvpn.log openvpn openvpn 660

あとはデフォルトであると思う・・。

ファイルの中身を作る

んで、ファイルの中身を書きまくる。ログファイルとかは作らなくていい。

/etc/openvpn/openvpn.conf
port 1194
proto tcp
dev tap0

# keys
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn.crt
key /etc/openvpn/keys/vpn.key
dh /etc/openvpn/keys/dh1024.pem

# server address
server-bridge 192.168.1.44 255.255.255.0 192.168.1.111 192.168.1.120

# client-to-client!!
client-to-client

# !test only!
#duplicate-cn

# exec user and group
user openvpn
group openvpn

# keep alive (value is default)
keepalive 10 120

# restart setting
persist-key
persist-tun

# control script's
up /etc/openvpn/bin/up.sh
down /etc/openvpn/bin/down.sh

# compress setting
comp-lzo

# message level
status /var/log/openvpn-status.log
log-append  /var/log/openvpn.log
verb 3

portの設定はudpでもいい。ルータの環境に合わせて。
後、実行ユーザをopenvpnにしているが、再起動にしくるので、OpenVPN再起動のフローがサーバ再起動を含まないようなら、ここを削除してrootのまま実行させるか、セキュリティをがっちりやりたいならシャットダウンスクリプト等を変更する必要あり。
この設定はサーバのIPが192.168.1.44、サブネットマスクは/24、192.168.1.111〜192.168.1.120がVPNクライアントのDHCPスコープ。
他は・・・読み取って下さい。すみません。

/etc/openvpn/bin/up.sh

検証してない。iptablesのDはdown.shが私の環境だと120%こけるので、up時に消すことにしているだけ。
でもdown時にも消してる。いや、あれだ、もう、決めの問題なんだけど。

#!/bin/bash

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -D INPUT -i tap0 -j ACCEPT
iptables -D INPUT -i br0 -j ACCEPT
iptables -D FORWARD -i br0 -j ACCEPT

iptables -A INPUT -i tap0 -j ACCEPT
iptables -A INPUT -i br0 -j ACCEPT
iptables -A FORWARD -i br0 -j ACCEPT
/etc/openvpn/bin/down.sh

検証してない。っていうか、openvpnユーザだとiptablesはいじれないので、動かない。

#!/bin/bash

#iptables -D INPUT -i tap0 -j ACCEPT
#iptables -D INPUT -i br0 -j ACCEPT
#iptables -D FORWARD -i br0 -j ACCEPT
/etc/logrotate.d/openvpn

postrotateで再起動するのがだるいが、仕方ない。
openvpnユーザでログを回しているので、この辺は環境に合わせて色々変える。

/var/log/openvpn.log {
        rotate 7
        daily
        notifempty
        nomissingok
        compress
        create 0660 openvpn openvpn
        postrotate
                /etc/init.d/openvpn restart 2>&1 > /dev/null || true
        endscript
}
/etc/network/interfaces

これ、一番大事。Debianだと楽なので、適当に調べつつやる。私は適当に調べつつやってたら、細かい内容を検証する暇がなくなって、この記事が今日まで延びた。
一番大事なのだが、一番設定内容はいい加減。多分、なんかいらんのがある。二重に設定しちゃってんのとかね。
IPやゲートウェイの設定は環境に合わせて色々変える。

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
auto eth0
iface eth0 inet static

auto br0
iface br0 inet static
        address 192.168.1.44
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
        pre-up /usr/sbin/openvpn --mktun --dev tap0
        pre-up /sbin/ifconfig tap0 0.0.0.0 promisc up
        pre-up /sbin/ifconfig eth0 0.0.0.0 promisc up
        pre-up /usr/sbin/brctl addbr br0
        pre-up /usr/sbin/brctl addif br0 eth0
        pre-up /usr/sbin/brctl addif br0 tap0
        post-down /usr/sbin/brctl delif br0 eth0
        post-down /usr/sbin/brctl delif br0 tap0
        post-down /usr/sbin/brctl delbr br0
        post-down /usr/sbin/openvpn --rmtun --dev tap0
        post-down /sbin/ifconfig eth0 down

起動する

/etc/init.d/openvpnがなぜかあるので(apt-getで作られるだけだが。)、shutdown -r nowとかやってサーバを再起動してから、こんなことしてみる。

/etc/init.d/openvpn restart

成功したらおめでとう。
失敗したら・・まあなんつーか、がんばって。

おわりに

あとはサーバ再起動して、ちゃんと自動起動されるか確認して、VPNクライアントから接続してみて、翌日ログが回ってるか確認してみて、一週間くらいしてもう一回接続してみて、トラブル対応にSSH上から再起動とかしてみて、なんか、色々やって終わり。
VPNクライアントで接続出来ない場合は、まずルータの設定を疑うこと。はじめは同一LANから接続テストをするといい。


SSHの設定とかは書いてないので、この辺はがんばる。
起動スクリプトもsysctlも制御が不要だし、apt-getもあるので、FreeBSDよりは楽。
/etc/network/interfacesが個性を出しているが、これはDebianを触る以上避けて通れないので、がんばる。


以上。