Home > ソフトウェア > Ubuntu 12.04 LTS で L2TP/IPsec を証明書で

Ubuntu 12.04 LTS で L2TP/IPsec を証明書で

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 のレジストリの設定に注意?

★下記に2つの英単語をスペースで区切って入力してください

Home > ソフトウェア > Ubuntu 12.04 LTS で L2TP/IPsec を証明書で

Search
Feeds

Page Top