OpenVPNアリ升
最近のVPSサーバ動作は安定してまして日々のパッケージ更新以外は特にありません(困った事に)。 ということで新しいサービスとしてOpenVPN辺りを入れてネチネチゴロゴロと試験目的で遊んでみましょうと先週より隙を見て作業。元々テストベッドとしての目的、そして日本のインフラ事情に左右されない海外に置く事を考えてサーバを契約したもので、現状はWebサーバ/メールサーバと主に外部向けに発信/提供するのみという状態で何かと勿体無いなぁ、と。一度、SquidによるProxyサーバを作るのも考えましたが、グローバルIPからの利用で踏み台にされないようにアクセス制限するのは大雑把にしかできないし非常に困難でした。 ということで、OpenVPN辺りで一度セキュアな通信インターフェイスを設けて後はProxyなり内側サービスなり、他のサーバとの連携用ネットワークを組むなりしようかな?というのがOpenVPN使ってみようというやる気の大半。環境は相変わらずのGentoo。
1. インストール
# emerge -pv openvpn
[ebuild N ] dev-libs/lzo-2.04 USE="" 0 kB
[ebuild N ] sys-apps/iproute2-2.6.35-r2 USE="berkdb ipv6" 0 kB
[ebuild N ] net-misc/openvpn-2.1.4 USE="iproute2 ipv6 pam ssl" 0 kB
※スペースの都合により-ふらぐは省略
# emerge openvpn
2. OpenVPN暗号鍵設定
・・・というか実はこの辺りは作業時に参照していたGentoo+OpenVPNの説明サイトを読んだほうがよかったりする。ので、大体の流れと補足をば。
Gentoo Linuxな生活/OpenVPNで悩む
# cd /usr/share/openvpn/easy-rsa/
# source ./vars
認証局用証明書作成(ca.crt/key) : # clean-all; build-ca
サーバ用証明書作成(server.csr/crt/key): # build-key-server [server name]
ユーザ用証明書作成(client.csr/crt/key): # build-key [client name]
鍵交換用証明書作成(dh1024.pem) : # build-dh
varsについては証明書作成の際のCNなりOUなりOの情報を予め入れておけるので編集しておくと手間が無くてよい。
3. OpenVPNサーバ設定
インターフェイスがグローバル側一本しかない為ブリッジ(TAP)は難しい。ので、とりあえずトンネル(TUN)モードにて動かし、サーバとクライアント間の暗号化ネットワークを作る。部分部分濁しつつサーバの設定ファイルを載せると、このような感じ
###
### OpenVPN config file
###
## Common Settings ##
port 443
port-share 127.0.0.1 4443
proto tcp-server
ca /etc/ssl/openvpn/ca.crt
cert /etc/ssl/openvpn/[server].crt
key /etc/ssl/openvpn/[server].key
dh /etc/ssl/openvpn/dh1024.pem
## Server Settings ##
dev tun
server 192.168.254.0 255.255.255.0
push "route 192.168.254.0 255.255.255.0"
ifconfig-ipool-persist ipp.txt
keepalive 10 120
user nobody
group nobody
#comp-lzo ※
tun-mtu 1280
mssfix 1280
tls-server
persist-key
persist-tun
client-to-client
status /var/log/openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
verb 3
HTTPS(443)経由にすることで大概のファイアウォールを抜けることが可能なり。(フィルタ側からすると厄介この上ない。高級なファイアウォールはネゴの部分で遮断できるかもしれないが・・・)。よってApacheのHTTPSを既定ポートから変更し、OpenVPN受付→HTTPSに送るって形でHTTPSを殺さずにVPNサービスを提供。
4. OpenVPNクライアント設定
SCP等にて安全に下記設定ファイルに記述したファイルをクライアントに転送しつつ、OpenVPN本家からクライアントダウンロードと設定のみ。基本、サーバにて有効にしたものを有効にするだけ。あとpullしてサーバ内push記述の経路情報(route)取らないと環境により繋がらない場合多々。
###
### OpenVPN config file
###
## Common Settings ##
remote 173.230.147.180 443
proto tcp-client
ca "c:\Users\hogehoge\My Documents\OpenVPN\key\ca.crt"
cert "c:\Users\hogehoge\My Documents\OpenVPN\key\[client].crt"
key "c:\Users\hogehoge\My Documents\OpenVPN\key\[client].key"
## Client Settings ##
dev tun
pull
#comp-lzo
tun-mtu 1280
mssfix 1280
tls-client
persist-key
persist-tun
verb 3
繋がったワーイ(テキトウ) -完-
・・・ちなみに今回の嵌りどころとして通信圧縮の"comp-lzo"を書くと、認証成功+TUNインターフェイス作成できてもは通っても全く通信が出来なかったり。片方有効で動くようなものではないので、どちらかが悪いのだが・・・確認できず。とりあえず圧縮失敗にて中途半端に繋がる事あるので要注意。
VPNの作成の際、別デーモンのPPTPの使用やOpenVPNのTunデバイスでipv6を使うというのも考えましたが、pptp、ipv6からのフォワーディング等についてカーネルのモジュールがどうも足りなさそう (?) なので一旦保留。