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