linuxでVPNサーバ


はじめに

家の外から自宅のマシンやサーバにアクセスしたいなぁと思って調べていたら
VPN(L2TP/IPsec)という方法で実現出来そうだったので構築してみました。
その時の構築手順のメモ。

環境について

OS

CentOS 6.5

インストールするソフトウェア

libreswan
xl2tpd

その他

下記の手順は全て root ユーザで実行しています。

1.外部リポジトリの追加

libreswan、xl2tpd はCentOSのデフォルトのリポジトリには含まれていないので
追加リポジトリ(epel)を設定します。

# rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

yumコマンドを使った時にデフォルトではepelを参照しない様に無効化しておく。

/etc/yum.repos.d/epel.repo
[epel]
enabled=1
↓に修正
enabled=0

2.libreswan xl2tpd をインストール

以下のコマンドでインストール。

# yum -y install --enablerepo=epel libreswan xl2tpd lsof

3.設定ファイルの修正

xl2tpdの設定

l2tp接続する際の動作(認証やIP割当)に関する設定

/etc/xl2tpd/xl2tpd.conf
[lns default]
ip range = 192.168.1.128-192.168.1.254
local ip = 192.168.1.99
↓に修正(各自の環境に合わせる)
ip range = 192.168.1.50-192.168.1.100
local ip = 192.168.1.49

↓コメント解除(行頭の ; 削除)
require chap = yes

各項目の説明

・ip range
 VPNクライアントへ割り振るIPアドレス範囲を指定
・local ip
 サーバ自身のIPアドレスを設定
・require chap
 chapによる認証情報暗号化を設定

トンネリングに関する設定

/etc/ppp/options.xl2tpd
ms-dns  8.8.8.8
↓に修正(各自の環境に合わせる)
ms-dns  192.168.1.1

mtu 1280
mru 1280
↓に修正(各自の環境に合わせる)
mtu 1240
mru 1240

↓追記
netmask 255.255.255.0
persist
require-mschap-v2
logfile /var/log/xl2tpd.log

MTU/MRUの設定は、各環境で数値が変わります。
「ping mtu 測定」等でググって、最適な値を調べて下さい。

ログファイルを作っておく

# touch /var/log/xl2tpd.log

ipsecの設定

/etc/ipsec.conf
#version 2
#plutodebug=none
#klipsdebug=none
virtual_private=%v4:10.0.0.0/8,%v4:・・・(中略)
#include /etc/ipsec.d/*.conf
↓に修正
version 2
plutodebug=none
klipsdebug=none
virtual_private=%v4:192.168.1.0/24
include /etc/ipsec.d/*.conf
/etc/ipsec.d/l2tp-psk.conf
conn L2TP-PSK-NAT
  rightsubnet=0.0.0.0/0
  forceencaps=yes
  also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
  #iOS用の設定
  dpddelay=10
  dpdtimeout=20
  dpdaction=clear
  #iOS用の設定 ここまで
  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.d/default.secrets
: PSK "keyword"

管理者以外は操作ができないように設定

# chmod 600 /etc/ipsec.d/default.secrets

ユーザIDとパスワードの設定

/etc/ppp/chap-secrets
"user1" * "password1" *

管理者以外は操作ができないように設定

# chmod 600 /etc/ppp/chap-secrets

ipsecサービスとl2tpサービスの起動と自動起動設定

# service xl2tpd start
# chkconfig xl2tpd on
# service ipsec start
# chkconfig ipsec on

4.その他の環境設定

SELinuxの無効化

/etc/sysconfig/selinux
SELINUX=enforcing
↓に修正
SELINUX=disabled

カーネルパラメータの変更

ipフォワードを有効化
ipリダイレクトを無効化
rp_filterの無効化

/etc/sysctl.conf
net.ipv4.ip_forward = 1 ←修正

以下は追記
net.core.xfrm_larval_drop = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0

iptablesの設定

/etc/sysconfig/iptables
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4:528]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m udp --dport 1701 -j ACCEPT
-A INPUT -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i ppp+ -j ACCEPT
-A FORWARD -o ppp+ -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

設定内容の確認

# ipsec verify

↓みたいになってればOK

Verifying installed system and configuration files

Version check and ipsec on-path                     [OK]
Libreswan 3.12 (netkey) on 2.6.32-431.el6.x86_64
Checking for IPsec support in kernel                [OK]
 NETKEY: Testing XFRM related proc values
         ICMP default/send_redirects                [OK]
         ICMP default/accept_redirects              [OK]
         XFRM larval drop                           [OK]
Pluto ipsec.conf syntax                             [OK]
Hardware random device                              [N/A]
Checking rp_filter                                  [OK]
Checking that pluto is running                      [OK]
 Pluto listening for IKE on udp 500                 [OK]
 Pluto listening for IKE/NAT-T on udp 4500          [OK]
 Pluto ipsec.secret syntax                          [OK]
Checking 'ip' command                               [OK]
Checking 'iptables' command                         [OK]
Checking 'prelink' command does not interfere with FIPSChecking for obsolete ipsec.conf options             [OK]
Opportunistic Encryption                            [DISABLED]

ダメな例
こういうのが出てたら、設定ミスがないか見直す

Checking rp_filter                                  [ENABLED]
 /proc/sys/net/ipv4/conf/default/rp_filter          [ENABLED]
 /proc/sys/net/ipv4/conf/lo/rp_filter               [ENABLED]
 /proc/sys/net/ipv4/conf/eth0/rp_filter             [ENABLED]
Opportunistic Encryption                            [DISABLED]

5.クライアントの設定(iPhone)

設定 -> 一般 -> VPN -> VPN構成を追加...

シークレットには [/etc/ipsec.d/default.secrets] の設定値を
アカウントとパスワードには[/etc/ppp/chap-secrets] の設定値を入力して保存。

設定後、VPNをonにして、iPhoneの右上に[VPN]の文字が出れば成功。

以上