OpenVPNサーバーの構築 (Linode)

vpn接続用のサブドメインとして、vpn.example.netを使用するので、DNSの設定をしておく。

まず、依存関係のあるlzo-2.06をインストール。BLFSより。

cd ~/src &&
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz &&
tar zxf lzo-2.06.tar.gz &&
cd lzo-2.06 &&
./configure --prefix=/usr                    \
            --enable-shared                  \
            --disable-static                 \
            --docdir=/usr/share/doc/lzo-2.06 &&
make &&
make check &&
sudo make install &&
cd ../ &&
rm -rf lzo-2.06

最後にOpenVPNサーバーをインストール。

cd ~/src &&
wget http://swupdate.openvpn.org/community/releases/openvpn-2.3.2.tar.gz &&
tar zxf openvpn-2.3.2.tar.gz &&
cd openvpn-2.3.2 &&
./configure --prefix=/usr \
            --sysconfdir=/etc \
            --localstatedir=/var \
            --libexecdir=/usr/lib \
            --docdir=/usr/share/doc/openvpn-2.3.2 &&
make &&
sudo make install &&
sudo cp -R sample /usr/share/doc/openvpn-2.3.2 &&
sudo mkdir /etc/openvpn &&
sudo cp sample/sample-config-files/server.conf /etc/openvpn &&
cd ../ &&
rm -rf openvpn-2.3.2

OpenVPNサーバー用のSSL認証を取得する。SSL認証局から公開認証と秘密鍵を取得する。下記はStartSSLを想定。

sudo mkdir -p /etc/ssl/openvpn/{private,certs}

公開認証を/etc/ssl/openvpn/certs/cert.pemに、秘密鍵を/etc/ssl/openvpn/private/key.pemとして保存する。

sudo openssl rsa -in /etc/ssl/openvpn/private/key.pem \
                 -out /etc/ssl/openvpn/private/key.nopass.pem &&
sudo chmod 400 /etc/ssl/openvpn/certs/cert.pem /etc/ssl/openvpn/private/key{,.nopass}.pem &&
sudo wget -P /etc/ssl/openvpn/certs https://www.startssl.com/certs/sub.class1.server.ca.pem &&
sudo wget -P /etc/ssl/openvpn/certs https://www.startssl.com/certs/ca.pem &&
sudo sh -c "cat /etc/ssl/openvpn/certs/sub.class1.server.ca.pem >> /etc/ssl/openvpn/certs/ca.pem" &&
sudo rm /etc/ssl/openvpn/certs/sub.class1.server.ca.pem &&
sudo chmod 400 /etc/ssl/openvpn/certs/ca.pem &&
sudo openssl dhparam -out /etc/ssl/openvpn/dh2048.pem 2048 &&

OpenVPNの設定

sudo emacs /etc/openvpn/server.conf

下記の行を書き換える。

ca /etc/ssl/openvpn/certs/ca.pem
cert /etc/ssl/openvpn/certs/cert.pem
key /etc/ssl/openvpn/private/key.nopass.pem
dh /etc/ssl/openvpn/dh2048.pem

下記の行をコメントアウト。

push "redirect-gateway def1 bypass-dhcp"
duplicate-cn
user nobody
group nogroup

下記の行を追加。

script-security 2
client-cert-not-required
username-as-common-name
plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so login

次に、VPN接続してきたクライアントが、VPNサーバー経由でインターネットアクセスできるようにするため、iptablesをインストール。

cd ~/src &&
wget http://www.netfilter.org/projects/iptables/files/iptables-1.4.21.tar.bz2 &&
tar jxf iptables-1.4.21.tar.bz2 &&
cd iptables-1.4.21 &&
./configure --prefix=/usr                \
            --sbindir=/sbin              \
            --with-xtlibdir=/lib/xtables \
            --enable-libipq &&
make &&
sudo make install &&
sudo ln -sfv ../../sbin/xtables-multi /usr/bin/iptables-xml &&
for file in ip4tc ip6tc ipq iptc xtables
do
  sudo mv -v /usr/lib/lib${file}.so.* /lib &&
  sudo ln -sfv ../../lib/$(readlink /usr/lib/lib${file}.so) /usr/lib/lib${file}.so
done &&
cd ../ &&
rm -rf iptables-1.4.21 &&
wget http://www.linuxfromscratch.org/blfs/downloads/svn/blfs-bootscripts-20131023.tar.bz2 &&
tar jxf blfs-bootscripts-20131023.tar.bz2 &&
cd blfs-bootscripts-20131023 &&
sudo make install-iptables &&
cd ../ &&
rm -rf blfs-bootscripts-20131023

iptablesの起動スクリプトは最新のLFS用で、Linodeの LFSでは動かないので、修正。
. /lib/lsb/init-functions

. /etc/sysconfig/rc
. ${rc_functions}

sys_info_msgを
boot_mesgに

iptablesの設定ファイルを作成

sh -c 'cat > /etc/rc.d/rc.iptables << EOF
# Enable packet forwarding
sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

# OpenVPN
iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 1194 -j ACCEPT

# Allow TUN interface connections to OpenVPN server
iptables -A INPUT -i tun+ -j ACCEPT

# Allow TUN interface connections to be forwarded through other interfaces
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT

# NAT the VPN client traffic to the internet
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
EOF' &&
sudo chmod +x /etc/rc.d/rc.iptables

起動スクリプトの作成

sudo sh -c 'cat > /etc/rc.d/init.d/openvpn << EOF
#!/bin/sh
########################################################################
# Begin \$rc_base/init.d/openvpn
#
# Description : OpenVPN init script
#
# Authors     : Hiromasa Fujihara
#
# Version     : 00.01
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. \${rc_functions}

case "\${1}" in
        start)
                boot_mesg "Starting OpenVPN Server..."
                /usr/sbin/openvpn --config /etc/openvpn/server.conf --daemon
                evaluate_retval
                ;;

        stop)
                boot_mesg "Stopping OpenVPN Server..."
                killall openvpn
                evaluate_retval
                ;;

        restart)
                \${0} stop
                sleep 1
                \${0} start
                ;;

        *)
                echo "Usage: \${0} {start|stop|restart}"
                exit 1
                ;;
esac

# End $rc_base/init.d/openvpn
EOF' &&
sudo chmod +x /etc/rc.d/init.d/openvpn &&
sudo ln -s ../init.d/openvpn /etc/rc.d/rc1.d/K11openvpn &&
sudo ln -s ../init.d/openvpn /etc/rc.d/rc2.d/K11openvpn &&
sudo ln -s ../init.d/openvpn /etc/rc.d/rc3.d/S39openvpn &&
sudo ln -s ../init.d/openvpn /etc/rc.d/rc4.d/S39openvpn &&
sudo ln -s ../init.d/openvpn /etc/rc.d/rc5.d/S39openvpn &&
sudo ln -s ../init.d/openvpn /etc/rc.d/rc6.d/K11openvpn

クライアントからのアクセス
iOSからはOpenVPN Connect、MacからはTunnelblick、WindowsからはOpenVPN GUIで繋いだ。
他にもクライアントは色々ある模様。
設定ファイルとして下記のようなファイルを拡張子ovpnで作成し、クライアントソフトにインポートする。
iOSはメールの添付ファイルが手っ取り早い。
Tunnelblickはフォルダを作成し、フォルダ内にこのファイルを入れ、フォルダ名末尾に”.tblk”を付けると、ダブルクリックでインポートできる。

client
dev tun
proto udp
remote vpn.example.net 1194
resolv-retry infinite
nobind
persist-key
persist-tun
<ca>
-----BEGIN CERTIFICATE-----
(省略、上記/etc/ssl/openvpn/certs/ca.pemの内容)
-----END CERTIFICATE-----
</ca>
comp-lzo
verb 3
auth-user-pass