CentOS 6.0 で L2TP-VPN に接続する
CLIENT
CentOS 6.0 を L2TP-VPN クライアントにする
CentOS 6.0 で L2TP-VPN サーバを構築する で構築した L2TP-VPN に Linux から接続してみることにしました。
今回 L2TP クライアントとして設定する Linux は CentOS 6.0 を使用します。
Linux を L2TP クライアントにするにあたって、次の 2 つのパッケージをインストールしておきます。
- openswan
- xl2tpd
xl2tpd パッケージは、平成 23 年 11 月 29 日現在、EPEL リポジトリから入手可能のようなので、予め CentOS 6.0 に EPEL リポジトリを追加する に記したようにして、EPEL リポジトリを追加しておく必要があります。
リポジトリの準備が整ったら、CentOS 6.0 では次のようにしてインストールすることが出来ました。
yum install openswan
yum install xl2tpd
これらを使って IPsec と PPTP の両方を設定して行く感じになります。
IPsec 接続を確立する
Openswan を設定する
Openswan (ipsec) をインストールしたら、その設定ファイルを調整します。
まずは "/etc/ipsec.conf" ファイルの行末にある include の記述部分、先頭の # を取り除いて有効にします。
include /etc/ipsec.d/*.conf
続いて "/etc/ipsec.d/connection.conf" というファイルを次の内容で作成します。
conn PEER_L2TP
authby=secret
pfs=no
rekey=no
keyingtries=3
type=transport
left=%defaultroute
leftprotoport=17/1701
right=192.168.1.1
rightprotoport=17/1701
auto=add
ここの冒頭の "conn" で指定した名前は、L2TP サーバーと接続する際に指定します。
"left" では、接続元となる自分自身の IP アドレスを設定します。ここを "%defaultroute" にしておくと、ディフォルトルートに接続されたインターフェイスの IP アドレスが指定されたことになるようです。
"right" では、接続先の L2TP-VPN サーバーの IP アドレスを指定します。ここでは、IPsec サーバーとして "192.168.1.1" を指定しています。"%any" ではだめな様子でした。また、接続先がファイアーウォールで保護されている場合は ファイアーウォール配下の L2TP-VPN に Linux で接続する で記したような "rightid" の指定も必要になる感じです。
また、"auto" では "add" を設定しています。インターネットで調べていると、ここで "ignore" を設定するように記されているサイトがいくつかありましたけど、そうしてしまうと "021 no connection named "PEER_L2TP" といったエラーになってしまう様子でした。
また、今回は共有鍵を使用するので、"/etc/ipsec.d/ipsec.secrets" というファイルを次の内容で作成します。
: PSK "password"
ここで設定するパスワードは、L2TP サーバー側で設定した共有鍵と同じものです。
Openswan を起動する
Openswan (ipsec) の設定が出来たら、L2TP-VPN サーバーとの IPsec 接続を開始するために、まずは Openswan を起動しておきます。
CentOS 6.0 の場合は、次のコマンドで起動させることができます。
service ipsec start
OS 起動時に Openswan を自動起動したい場合は、次のようにしておきます。
chkconfig ipsec on
IPsec 接続を開始する
Openswan (ipsec) が起動できたら、これで L2TP-VPN サーバーとの IPsec 接続ができるようになりました。
次のコマンドを実行することで、IPsec 接続を開始できます。
ipsec auto --up PEER_L2TP
"--up" の後には "/etc/ipsec.d/connection.conf" で設定した名前を指定します。
このようにすると、サーバーとの IPsec 接続処理が開始されます。
ちなみにこのとき、IPsec の認証(ここでは共有鍵)などの設定内容が適切なら、すぐにコマンドラインに戻ってきますけど、間違っていたりした場合には、再接続を試みている間、なかなかコマンドラインに戻ってこない感じでした。
そして、接続に失敗した場合、画面に出力されるメッセージの最後の方に、次のようなエラーが表示される感じでした。
031 "PEER_L2TP" #1: max number of retransmissions (2) reached STATE_MAIN_I3. Possible authentication failure: no acceptable response to our first encrypted message
000 "PEER_L2TP" #1: starting keying attempt 2 of at most 3, but releasing whack
接続に成功した場合には、しばらく待つようなこともなく、次のようなメッセージで終わっています。
004 "PEER_L2TP" #2: STATE_QUICK_I2: sent QI2, IPsec SA established transport mode {ESP=>0xce472a01 <0x4c327d0f xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=none DPD=none}
接続できない場合には、上手く IPsec 接続ができるようになるように、上記の IPsec 関連の設定を調整します。なお、設定ファイルを更新したら ipsec を再起動して設定を有効にしてから、再接続を試みるようにします。
ちなみに "/etc/ipsec.d/connection.conf" の "right" のところで "%any" が指定されている場合には、次のエラーが発生する感じです。
029 "PEER_L2TP": cannot initiate connection without knowing peer IP address (kind=CK_TEMPLATE)
また、接続先のサーバーがファイアーウォールで保護されている場合には、次のエラーが発生することがありました。
003 "PEER_L2TP" #1: we require peer to have ID '10.0.0.1', but peer declares '192.168.1.1'
218 "PEER_L2TP" #1: STATE_MAIN_I3: INVALID_ID_INFORMATION
これについての詳細は ファイアーウォール配下の L2TP-VPN に Linux で接続する に記してあるので、そちらをご覧ください。
IPsec の接続が確立できたら、続いて L2TP 接続を行います。
L2TP 接続を確立する
xl2tpd を設定する
L2TP 接続を行うために xl2tpd の設定を行います。
"/etc/xl2tpd/xl2tpd.conf" を開いて、次の設定を追加します。
[lac L2TP1]
lns = 192.168.1.1
require chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd.conn-1
length bit = yes
ここの冒頭の "lac" のところで指定した名前は、L2TP 接続を開始する際に使用します。そして "lns" の値として、接続先の L2TP-VPN サーバーの IP アドレスを指定しています。
また、このファイルに最初から記載されている "[lns default]" 関連の設定は L2TP クライアントとして稼動させる場合は不要なようでしたので、コメントアウトなどしておくと良いでしょう。
そして、上記ファイルで指定した "/etc/ppp/options.xl2tpd.conn-1" ファイルを、次の内容で用意します。
name vpn-account
# 認証を設定しません。設定すると接続できない様子です。
noauth
# ハードウェアフロー制御 (RTS/CTS) を使用します。
crtscts
# 最大受信単位 (MRU) と最大転送単位 (MTU) を指定します。
mtu 1410
mru 1410
# 相手側をゲートウェイとするディフォルト経路は追加しません。
nodefaultroute
# UUCP 形式のロックファイルを生成します。
lock
# Proxy ARP により接続してきたホストがローカルネットワークに在るように見せます。
proxyarp
# ログファイルの保存場所を指定します。
logfile /var/log/xl2tpd.conn-1.log
"name" では、認証に使用するアカウント名を設定するようです。この名前を "/etc/ppp/chap-secrets" や "/etc/ppp/pap-secrets" で探して、それに対応するパスワードを使って L2TP-VPN サーバーと認証を行う様子です。
また、L2TP サーバー設定の時には、こここで "auth" や "require-mschap-v2" などの認証に関する設定を行いましたが、今回のように L2TP クライアントを設定するときには "noauth" だけを付ける必要があるようでした。"noauth" を設定しなかったり、他の認証設定をしてしまうと、接続に失敗してしまう様子でした。
その他、接続先や必要にあわせて設定項目を調整して、これで L2TP クライアント側での接続準備は完了です。
認証で使用するパスワードを準備する
L2TP 接続で使用する認証アカウントは "/etc/ppp/chap-secrets" や "/etc/ppp/pap-secrets" に記載します。
# アカウント 接続名 パスワード IPアドレス
"vpn-account" "xl2tpd" "vpn-password" *
ここでの注意点としては、どうやら接続名のところには "*" か、サーバー側の "/etc/ppp/options.xl2tpd" の "name" で指定したものと同じ名前を指定する必要があるようでした。
設定値を * にするのがいちばん簡単そうですけど、もしこの Linux で ppp での待ち受けも行うようになった場合に、知らずにこのアカウントを使って接続されてしまう可能性も出てきてしまいそうなので、サーバー側の設定にあわせておくのが良い気がします。
xl2tpd を起動する
xl2tpd の設定が出来たら、L2TP-VPN サーバーとの L2TP 接続を開始するために、xl2tpd を起動しておきます。
CentOS 6.0 の場合は、次のコマンドで起動させることができます。
service xl2tpd start
OS 起動時に xl2tpd を自動起動したい場合は、次のようにしておきます。
chkconfig xl2tpd on
IPsec 接続を開始する
xl2tpd が起動できたら、これで L2TP-VPN サーバーとの L2TP 接続ができるようになりました。
次のコマンドを実行することで、L2TP 接続を開始できます。
echo "c L2TP1" > /var/run/xl2tpd/l2tp-control
このように "/var/run/xl2tpd/l2tp-control" に対してテキストを上書きする感じで、L2TP を起動できるようになっています。同様に "xl2tpd-control connect L2TP1" でも接続できるようでした。
認証に成功した場合、数秒ほどして "ppp0" といった PPP 接続が開始されます。
このようなインターフェイスが作成されない場合には、設定かどこかが間違っている可能性があります。サーバー側やクライアント側の、"/var/log/messages" や xl2tpd のログを見ると、参考になりそうな情報が記載されているかもしれません。
接続が上手くいって IP アドレスが振り出されたら、これで L2TP-VPN への接続作業は全て完了です。
L2TP-VPN の接続と切断について
設定のお話が長くなってしまったので、最後に L2TP-VPN への接続と切断の方法について、整理しておこうと思います。
今回の L2TP-VPN では、IPsec と L2TP を使ってネットワークを接続するので、開始の際は次のようにして、これら 2 つを開始してあげる必要があります。
ipsec auto --up PEER_L2TP
echo "c L2TP1" > /var/run/xl2tpd/l2tp-control
逆に、回線を切断したい場合には、次のようにします。
echo "d L2TP1" > /var/run/xl2tpd/l2tp-control
ipsec auto --down PEER_L2TP
これで、回線の接続や切断を行うことが出来ます。
ここで、ipsec auto の引数として指定している "PEER_L2TP" というのは、"/etc/ipsec.d/connection.conf" ファイルで IPsec に付けた名前です。/var/run/xl2tpd/l2tp-control に書き込んでいる "L2TP1" というのは、"/etc/xl2tpd/xl2tpd.conf" ファイルで L2TP に付けた名前になります。
また、上記では "echo" コマンドを使って L2TP の切断を行っていますが、ここは "xl2tpd-control disconnect L2TP1" でも切断できます。
なお、このようにして接続したインターフェイスを経由して通信を行いたい場合には、適切なルーティング情報を設定する必要があるようでした。
たとえば "ppp0" で L2TP-VPN が接続された場合に、以下のようにして、そのインターフェイスをディフォルトゲートウェイとすることが出来ます。
route add -net 0.0.0.0 dev ppp0
または、たとえば L2TP-VPN で接続した先のネットワークが 192.168.1.0/24 だった場合で、そのネットワーク宛の通信だけを L2TP-VPN で確立した "ppp0" インターフェイスへ送信したい場合には、次のような設定が必要になります。
route add -net 192.168.1.0 netmask 255.255.255.0 dev ppp0
ディフォルトゲートウェイを設定するのに "/etc/ppp/options.xl2tpd.conn-1" で "defaultroute" を指定すれば良いのかとも思ったのですけど、試してみた感じ、そのようにしてもルーティング情報が書き換えられないようだったので、必要なときにはとりあえず、このような方法で対応しておくことにします。