#はじめに
家の外から自宅のマシンやサーバにアクセスしたいなぁと思って調べていたら
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を参照しない様に無効化しておく。
[epel]
enabled=1
↓に修正
enabled=0
#2.libreswan xl2tpd をインストール
以下のコマンドでインストール。
# yum -y install --enablerepo=epel libreswan xl2tpd lsof
#3.設定ファイルの修正
##xl2tpdの設定
###l2tp接続する際の動作(認証やIP割当)に関する設定
[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による認証情報暗号化を設定
###トンネリングに関する設定
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の設定
#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
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
####事前共有鍵の設定
: PSK "keyword"
管理者以外は操作ができないように設定
# chmod 600 /etc/ipsec.d/default.secrets
####ユーザIDとパスワードの設定
"user1" * "password1" *
管理者以外は操作ができないように設定
# chmod 600 /etc/ppp/chap-secrets
ipsecサービスとl2tpサービスの起動と自動起動設定
# service xl2tpd start
# chkconfig xl2tpd on
# service ipsec start
# chkconfig ipsec on
#4.その他の環境設定
##SELinuxの無効化
SELINUX=enforcing
↓に修正
SELINUX=disabled
##カーネルパラメータの変更
ipフォワードを有効化
ipリダイレクトを無効化
rp_filterの無効化
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の設定
*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]の文字が出れば成功。
以上