Ubuntu 12.04 サーバー再構築(11) VPN環境の設定

孫の写真をよこせとな。そうですね、今環境構築しているのでちょっとまってね、と。
俺自身もiPhoneから接続したいと思っているのだ。



xl2tpdとipsecでVPN環境を構築する。
過去の自分の記事を見ながら設定するわけだが、今回は前提として「まっさら」があるので、多分さらっとはできないだろう。

そう、一番大切な設定ファイルが消えているので、ま~た手探りでやってかなきゃならないんだよな。

接続してくるクライアントは Windows だけでなく iOS もあるので、特別に入れている設定もある。


作業の前にちょっとだけ。

  • 関係するパッケージは xl2tpd, openswan(ipsec), ppp の3つ。それぞれ、/etc/xl2tpd, /etc/ipsec, /etc/ppp あたりにファイルがある。
  • ipsecを設定したら、まずはこれが正しく動くことを確認。動かすためにはルーティングなどにも少々手を入れる必要がある。
  • ここで書いている設定値については、一つ一つ吟味したものではないので、矛盾したものもあるかもしれないので、気になる場合にはよく調べてみたほうがいい。

■インストール

$ sudo apt-get install xl2tpd openswan

セットアップ中に質問をされる。
「このホストに対して X.509 証明書を利用しますか?」
→ ちょっと物怖じして「いいえ」を選択。

後で設定し直すときには

$ sudo dpkg-reconfigure openswan

とすればいいらしい。

インストールしてみると /etc/ppp なんてのができあがっていて、そこに空っぽのファイルがあったりすることがわかる。

■設定

やること多すぎ。

とりあえず、ポートの解放。

500/udp
4500/udp
1701/udp

それと、espというプロトコル(サービス名ではない)を使うがgufwでの設定方法がわからなかったので、以下を実行。

$ sudo ufw allow proto esp from any

VPNで接続した後、別のPCに接続(リモートデスクトップとか、共有ディレクトリとか)したい場合、ufwでパケットの転送を許可しておく必要がある。2013/07/04追記

/etc/default/ufw
#DEFAULT_FORWARD_POLICY="DROP"
DEFAULT_FORWARD_POLICY="ACCEPT"

$ sudo ufw disable
$ sudo ufw enable

以降、いろんなファイルを編集していく。

/etc/ipsec.conf
# /etc/ipsec.conf - Openswan IPsec configuration file

# This file:  /usr/share/doc/openswan/ipsec.conf-sample
#
# Manual:     ipsec.conf.5


version 2.0     # conforms to second version of ipsec.conf specification

# basic configuration
config setup
        # Do not set debug options to debug configuration issues!
        # plutodebug / klipsdebug = "all", "none" or a combation from below:
        # "raw crypt parsing emitting control klips pfkey natt x509 dpd private"
        # eg:
        # plutodebug="control parsing"
        # Again: only enable plutodebug or klipsdebug when asked by a developer
        #
        # enable to get logs per-peer
        # plutoopts="--perpeerlog"
        #
        # Enable core dumps (might require system changes, like ulimit -C)
        # This is required for abrtd to work properly
        # Note: incorrect SElinux policies might prevent pluto writing the core
        dumpdir=/var/run/pluto/
        #
        # NAT-TRAVERSAL support, see README.NAT-Traversal
        nat_traversal=yes
        # exclude networks used on server side by adding %v4:!a.b.c.0/24
        # It seems that T-Mobile in the US and Rogers/Fido in Canada are
        # using 25/8 as "private" address space on their 3G network.
        # This range has not been announced via BGP (at least upto 2010-12-21)
        #virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10
        virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10,%v4:!172.16.0.0/16
        # OE is now off by default. Uncomment and change to on, to enable.
        oe=off
        # which IPsec stack to use. auto will try netkey, then klips then mast
        protostack=auto
        # Use this to log to a file, or disable logging on embedded systems (like openwrt)
        #plutostderrlog=/dev/null

# 独自設定を読み込む(0カラムから書き始めること)
include /etc/ipsec.d/*.conf

# Add connections here

# sample VPN connection
# for more examples, see /etc/ipsec.d/examples/
#conn sample
#               # Left security gateway, subnet behind it, nexthop toward right.
#               left=10.0.0.1
#               leftsubnet=172.16.0.0/24
#               leftnexthop=10.22.33.44
#               # Right security gateway, subnet behind it, nexthop toward left.
#               right=10.12.12.1
#               rightsubnet=192.168.0.0/24
#               rightnexthop=10.101.102.103
#               # To authorize this connection, but not actually start it,
#               # at startup, uncomment this.
#               #auto=add

新しくファイルを作る。

/etc/ipsec.d/l2tp-psk.conf
conn L2TP-PSK-NAT
        rightsubnet=vhost:%priv
        also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
        authby=secret
        pfs=no
        auto=add
        keyingtries=3
        rekey=no
        ikelifetime=8h
        keylife=1h
        type=transport
        left=172.16.nnn.nnn
#       leftnexthop=172.16.nnn.1
        leftnexthop=%direct
        leftprotoport=17/1701
        right=%any
        rightprotoport=17/%any
        # iOSが削除通知をしてこないことへの対応
        dpddelay=10
        dpdtimeout=30
        dpdaction=clear

このキーは意味不明な文字列でながーいのを作っておこう。X.509を使わないのだから、せめて。
これはrootしか読むこともできない秘密のファイル。

/etc/ipsec.secrets
# This file holds shared secrets or RSA private keys for inter-Pluto
# authentication.  See ipsec_pluto(8) manpage, and HTML documentation.

# RSA private key for this host, authenticating it to any other host
# which knows the public part.  Suitable public keys, for ipsec.conf, DNS,
# or configuration of other implementations, can be extracted conveniently
# with "ipsec showhostkey".

# this file is managed with debconf and will contain the automatically created RSA keys
include /var/lib/openswan/ipsec.secrets.inc

172.16.nnn.nnn %any: PSK "xxxxxx...."

次はxl2tpd。サンプルでは設定値の右に ; コメント が書かれているんだけど、実際にはこれを削除しておかないとうまく動かないみたいなので、コメントを取っ払ってスッキリさせる。(man xl2tpd.conf)

/etc/xl2tpd/xl2tpd.conf
[global]
auth file = /etc/xl2tpd/l2tp-secrets

[lns default]
ip range = 172.16.nnn.90-172.16.nnn.99 ←範囲は決めているけど、ipsec.secretsで指定
assign ip = yes
local ip = 172.16.nnn.nnn
length bit = yes
refuse pap = yes
refuse chap = yes
require authentication = yes
hostname = hogeserver
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.lns

次は接続ユーザーの定義。これにも意味のないながーいユーザー名とパスワードを設定し、かつ、IPアドレスを設定しておく。(/usr/share/doc/ppp/README.STATIC-IP参照)
指定は、ユーザー名、サーバー名、パスフレーズ(空白を含めることができるパスワード)、割り当てるIPアドレス、となっている。

/etc/xl2tpd/l2tp-secrets
# Secrets for authenticating l2tp tunnels
# us    them    secret
# *             marko blah2
# zeus          marko   blah
# *     *       interop

# for hogeuser iPhone
xxxxxxxxxxxxxxxxxx hogeserver "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 172.16.nnn.nn0

# for hogeuser iPad
xxxxxxxxxxxxxxxxxx hogeserver "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 172.16.nnn.nn1

# for hogewife iPhone
xxxxxxxxxxxxxxxxxx hogeserver "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 172.16.nnn.nn2

# for mother Windows
xxxxxxxxxxxxxxxxxx hogeserver "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 172.16.nnn.nn3

# for brother Windows
xxxxxxxxxxxxxxxxxx hogeserver "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 172.16.nnn.nn4

意味のない文字や数字の羅列、かつ、ながーいのにすることで、VPNでおかしな人が入ってくる危険を減らそう、というのが狙い。中に入られちゃったら、パスワードで運用ができるサービスもあるので。
端末を落っことしちゃったりしたら、ここからユーザーを削除(コメント化)する。でも、端末側を調べようとしてもユーザーくらいしか見えないからまず大丈夫かなーって思ったり。

今回の設定を適用すると、l2tpで接続するときにpppが使われる。
そこで、/etc/ppp 配下にある chap-secrets を l2tp-secrets のシンボリックリンクに置き換えてしまう。
※今回はこれがラスボス・・・このファイルが使われることに気付かなかった。

$ sudo mv /etc/ppp/chap-secrets /etc/ppp/chap-secrets.bk
$ sudo ln -s /etc/xl2tpd/l2tp-secrets /etc/ppp/chap-secrets

PPPに関するオプションも決めておく。(man pppd)

/etc/ppp/options.l2tpd.lns
require-mschap-v2
ipcp-accept-local
ipcp-accept-remote
ms-dns  172.16.nnn.nnn
ms-wins 172.16.nnn.nnn
#noccp
auth
crtscts
idle 1800
#nodefaultroute
#debug
lock
proxyarp
connect-delay 5000
logfile /var/log/xl2tpd.l2tp-ipsec.log

設定を反映させる。

$ sudo service xl2tpd restart
$ sudo service ipsec restart

ipsecを動作させるために以下を追加。

/etc/sysctl.conf
# ipsecのために
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0

変更を反映させる。

$ sudo sysctl -p

ipsecの動作状況を確認する。

$ sudo ipsec verify
Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path                                 [OK]
Linux Openswan U2.6.37/K3.5.0-31-generic (netkey)
Checking for IPsec support in kernel                            [OK]
 SAref kernel support                                           [N/A]
 NETKEY:  Testing XFRM related proc values                      [OK]
        [OK]
        [OK]
Checking that pluto is running                                  [OK]
 Pluto listening for IKE on udp 500                             [OK]
 Pluto listening for NAT-T on udp 4500                          [OK]
Checking for 'ip' command                                       [OK]
Checking /bin/sh is not /bin/dash                               [WARNING]
Checking for 'iptables' command                                 [OK]
Opportunistic Encryption Support                                [DISABLED]

このじょうたいであればOKらしい。

さらに

$ sudo ipsec auto --status

→ 特にワーニングなどもなく情報が表示された。


■動作確認

WindowsやiPhoneからVPN接続をしてみる。
ログは
/var/log/auth.log
/var/log/syslog
などに出力される。


■その他

VPNで接続してきたクライアントに DNSサフィックス を付けようと色々挑戦したが、結果としてつけることはできなかった。

サーバーにアクセスする際に hogeserver ではアクセスができず、hogeserver.hogeddns.jp としなければならない。

やったこと。

/etc/ppp/options.l2tpd.lns
require-mschap-v2
ipcp-accept-local
ipcp-accept-remote
ms-dns 172.16.nnn.nnn
ms-wins 172.16.nnn.nnn
#noccp
auth
crtscts
idle 1800
#nodefaultroute
#debug
lock
proxyarp
connect-delay 5000
logfile /var/log/xl2tpd.l2tp-ipsec.log
domain hogeserver.hogeddns.jp

/etc/xl2tpd/l2tp-secrets
# Secrets for authenticating l2tp tunnels
# us    them    secret
# *             marko blah2
# zeus          marko   blah
# *     *       interop

# for hogeuser iPhone
xxxxxxxxxxxxxxxxxx hogeserver.hogeserver.hogeddns.jp "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 172.16.nnn.nn0/16

# for hogeuser iPad
xxxxxxxxxxxxxxxxxx hogeserver.hogeserver.hogeddns.jp "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 172.16.nnn.nn1/16

# for hogewife iPhone
xxxxxxxxxxxxxxxxxx hogeserver.hogeserver.hogeddns.jp "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 172.16.nnn.nn2/16

# for mother Windows
xxxxxxxxxxxxxxxxxx hogeserver.hogeserver.hogeddns.jp "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 172.16.nnn.nn3/16

# for brother Windows
xxxxxxxxxxxxxxxxxx hogeserver.hogeserver.hogeddns.jp "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 172.16.nnn.nn4/16

お気軽にどうぞ ~ 投稿に関するご意見・感想・他

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です