2012年08月29日
Ubuntu 12.04 LTS で L2TP/IPsec を証明書で
- 2012-08-29 (Wed)
- ソフトウェア ( Linux/coLinux )
VPN サーバを Ubuntu 10.04 から 12.04 にクリーンインストールで更新.ついでなので証明書で認証できるように設定追加.前回と同様,VPNの接続先は VPN サーバに作った仮想的な LAN (192.168.222.0/24) で,そこから VPN のぶら下がっている LAN に IPマスカレードで出ていくと.
とりあえず,openswan と xl2tpd をインストール.openswan のインストールで X.509 certification は使わないとしとく.
sudo apt-get install openswan xl2tpd
そしたら ipsec の設定./etc/ipsec.conf を下記の内容に.とりあえず共有鍵で認証する設定のみ.
version 2.0 config setup nat_traversal=yes virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!192.168.222.0/24 oe=off protostack=netkey conn L2TP-PSK forceencaps=yes authby=secret pfs=no auto=add keyingtries=3 rekey=no ikelifetime=8h keylife=1h type=transport left=%defaultroute leftprotoport=17/1701 right=%any rightprotoport=17/%any
ついで /etc/ipsec.secrets で秘密鍵の設定.下記の行の PRE SHARED KEY HERE に共有鍵である文字列を突っ込んで /etc/ipsec.secrets に追記する.
: PSK "PRE SHARED KEY HERE"
以上で ipsec の設定はひとまず終了.次に xl2tpd の設定.まず /etc/xl2tpd/xl2tpd.conf を下記の内容に.
[global] [lns default] ip range = 192.168.222.2-192.168.222.32 local ip = 192.168.222.1 length bit = yes refuse chap = yes require authentication = yes name = l2tpd pppoptfile = /etc/ppp/options.l2tpd.lns
そして,上の xl2tpd の設定で指定した ppp 部分の設定を /etc/ppp/options.l2tpd.lns に書く.内容は下記の通り.YOUR_DNS_SERVER には vpn サーバのあるLANのDNSサーバを指定.
require-mschap-v2 ms-dns YOUR_DNS_SERVER auth lock hide-password modem
んで ppp用のユーザパスワードを /etc/ppp/chap-secrets に書き込む.面倒なのでサーバ名とかワイルドカードで.USERNAME と PASSWORD_HERE にユーザ名と対応するパスワードを適当に.
USERNAME * PASSWORD_HERE *
デーモン達の設定は以上で終わって,次にファイアウォールとかの設定を.とりあえず ufw で 500 (IKE)と 4500 (IPsec NAT-T) のUDPを開けておく.
sudo ufw allow 500/udp sudo ufw allow 4500/udp
ついで ufw では設定できない部分を /etc/ufw/before.rules で設定.ESP を通すための設定と,xl2tpd を IPsec 以外から使えないようにする設定と,LAN の NAT をさせる設定とを適切な場所に追加.
## *filter に対応する COMMIT の手前に # for ESP protocol of IPsec -A INPUT -p 50 -j ACCEPT # restricts l2tp to be used under ipsec -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport l2tp -j ACCEPT -A INPUT -p udp -m udp --dport l2tp -j REJECT --reject-with icmp-port-unreachable -A OUTPUT -p udp -m policy --dir out --pol ipsec -m udp --sport l2tp -j ACCEPT -A OUTPUT -p udp -m udp --sport l2tp -j REJECT --reject-with icmp-port-unreachable ## *filter の COMMIT の後に # nat Table rules *nat :POSTROUTING ACCEPT [0:0] # Forward traffic from 192.168.222.0/24 -A POSTROUTING -s 192.168.222.0/24 -j MASQUERADE # don't delete the 'COMMIT' line or these nat table rules won't be processed COMMIT # end of nat rules
さらにフォワーディングなどの設定を /etc/ufw/sysctl.conf に下記のように追記.
net/ipv4/ip_forward=1 net/ipv4/conf/all/accept_redirects=0 net/ipv4/conf/all/send_redirects=0 net/ipv4/conf/default/accept_redirects=0 net/ipv4/conf/default/send_redirects=0 net/ipv4/conf/eth0/accept_redirects=0 net/ipv4/conf/eth0/send_redirects=0 net/ipv4/conf/lo/accept_redirects=0 net/ipv4/conf/lo/send_redirects=0
さらについでに /etc/default/ufw で ufw のフォワーディングのデフォルト値を許可に変えておく.これをしておかないと ufw に全てブロックされて悲しくなる.
DEFAULT_FORWARD_POLICY="ACCEPT"
最後に,SSH を使っているならその許可をしつつ,ufw を有効化して再起動.
sudo ufw allow 22/tcp sudo ufw enable sudo reboot
ここまでで共有鍵で L2TP/IPsec が使えるようになった.Windows の VPN のプロパティのセキュリティで L2TP/IPsec を指定したうえで詳細設定で事前共有キー(/etc/ipsec.secrets に書いたやつ)を入れてやって,あとは /etc/ppp/chap-secrets に書いたユーザ名とパスワードでつなぐだけ.
閑話休題.
PCの認証に証明書を使う設定を入れてみる.そのために,まずはオレオレ認証局を作る.
とりあえず openssl が入っていることを確認.
sudo apt-get install openssl
ついで,簡便のために /etc/ssl/openssl.cnf のデフォルト値を変えてあげる.
default_days = 3650 countryName_default = JP stateOrProvinceName_default = Tokyo localityName_default = Chuoh-ku # これだけ書換えでなく追記 0.organizationName_default = IPL
そしたら下記のコマンドでオレオレ認証局作成.とりあえず /var/certs/ とかに全部おいておくことにする.無駄に sudo がついているけど気にしない.CA用のパスワードを聞かれるので適当に.Common Name だけはまともに答える(このマシンの名前とか).他はデフォルト値でいい.最後にもう一度CA用のパスワードを聞かれるので,それを入れてあげると demoCA というディレクトリにオレオレ認証局が出来上がる.
sudo mkdir /var/certs cd /var/certs sudo /usr/lib/ssl/misc/CA.pl -newca
んで,鍵のパーミッションを変更しつつ,CRL を生成.CA用パスワードを入れてあげる.
sudo chmod 600 demoCA/private/cakey.pem sudo openssl ca -gencrl -out crl.pem
以上で認証局が準備出来たので,次にホスト用の証明書を作成する為にホスト毎に以下の作業をば.整理のために各ホスト毎にサブディレクトリ作ってるけど,基本的に Common Name に各ホストの名前(ここでは VPNサーバの vpn と Windows のクライアント win)を入れてあげればいい.CA.pl -newreq-nodes でリクエストを作って,A.pl -sign で署名を入れる.署名の時に CA のパスワードが必要.
cd /var/certs sudo mkdir vpn; cd vpn; sudo ln -s ../demoCA . sudo /usr/lib/ssl/misc/CA.pl -newreq-nodes # Common Name に vpn sudo /usr/lib/ssl/misc/CA.pl -sign
Windows 用には最後にプライベートキーと証明書をまとめてあげる.
cd /var/certs sudo mkdir win; cd win; sudo ln -s ../demoCA . sudo /usr/lib/ssl/misc/CA.pl -newreq-nodes # Common Name に win sudo /usr/lib/ssl/misc/CA.pl -sign openssl pkcs12 -export -in newcert.pem -inkey newkey.pem -out win.p12
以上で証明書の準備完了.あとはこれらをそれぞれに配置する.
Windows には,オレオレ認証局の demoCA/cacert.pem と Windows マシンの証明書である win.p12 とを配置する.これらを適当に windows マシンにコピーした上で mmc.exe を実行して,ファイル → スナップインの追加と削除 → 証明書 → 追加 → コンピュータ アカウント → ローカルコンピュータ → 完了 → OK とやって,左のペインの証明書の個人で右クリック → すべてのタスク → インポート → win.p12 を個人へインポート,同様に証明書の信頼されたルート証明機関で右クリック → すべてのタスク → インポート → cacert.pem を信頼されたルート証明機関へインポート.
VPN サーバでの配置は下記のコマンドで.プライベートキーのフォーマットは PEM だと ipsec が読んでくれないので DER に変換しとく.
sudo cp /var/certs/demoCA/cacert.pem /etc/ipsec.d/cacerts/ sudo cp /var/certs/vpn/newcert.pem /etc/ipsec.d/certs/vpnCert.pem sudo openssl rsa -in /var/certs/vpn/newkey.pem -out /etc/ipsec.d/private/vpnKey.pem -outform DER sudo cp /var/certs/crl.pem /etc/ipsec.d/crls/crl.pem
そしたら最後に証明証での認証の設定を ipsec に追加する.まず /etc/ipsec.secrets に鍵の情報を追記.
: RSA vpnKey.pem
ついで /etc/ipsec.conf に証明証での認証の接続設定を追記.
conn L2TP-RSA forceencaps=yes authby=rsasig pfs=no auto=add keyingtries=3 rekey=no ikelifetime=8h keylife=1h type=transport left=%defaultroute leftprotoport=17/1701 leftcert=vpnCert.pem right=%any rightprotoport=17/%any leftrsasigkey=%cert rightrsasigkey=%cert
あとは sudo reboot してあげれば準備完了.Windows の VPN のプロパティのセキュリティで L2TP/IPsec を指定して詳細設定で認証に証明書を使うにしてやって(デフォルトだけど), /etc/ppp/chap-secrets に書いたユーザ名とパスワードでつなぐだけ.
とりあえず以上で手元の環境でうまく行った.NAT越えをするときには windows のレジストリの設定に注意?
- Comments: 0
- TrackBack (Close): -