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を参照しない様に無効化しておく。

```yum:/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割当)に関する設定

```xl2tpd:/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による認証情報暗号化を設定

###トンネリングに関する設定
```xl2tpd:/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の設定

```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
```

```xl2tpd:/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
```

####事前共有鍵の設定

```xl2tpd:/etc/ipsec.d/default.secrets
: PSK "keyword"
```

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

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

####ユーザIDとパスワードの設定
```ipsec:/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の無効化
```selinux:/etc/sysconfig/selinux
SELINUX=enforcing
↓に修正
SELINUX=disabled
```

##カーネルパラメータの変更
ipフォワードを有効化
ipリダイレクトを無効化
rp_filterの無効化

```sysctl:/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の設定

```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構成を追加...

![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/64421/fe0358c9-7a86-fb0d-9210-dfe8c91eaea6.jpeg "image.jpg")

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

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



以上