中国からFBやGoogle使うためのVPNサーバー

## どこかからの願い

中国でもFacebookで"いいね"したいじゃないですか～(ほんとは違う理由だけど・・)


ということでVPN & Proxyサーバーを作ることにしました。
入れるのはxl2tpd,openswan,squidでございます。
とにかくさっさと作る必要があったので、簡単な方法でいきます。

## ぷらっとふぉーむ

環境はAWSで
AMIはなぜかCentosだとうまくいかなかったので(多分自分の問題・・)AmazonLinuxで
amzn-ami-hvm-2015.03.0.x86_64-gp2

## 前準備

iptables 止める
SELINUX 止める

この辺を入れておく

```
yum install make gcc gmp-devel bison flex
```

sysctl.confにこの辺追記してsysctl -p

```
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
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
```

いったんリブート

## yum

そう。yumですよ。yum。
epelリポジトリにて

```
yum install --enablerepo=epel openswan xl2tpd squid
```

はい、入ったね

```
chkconfig xl2tpd on
chkconfig ipsec on
chkconfig squid on
```

## 設定

### ipsecの設定

confを以下のように編集
virtual_private=**は許可するアドレスレンジなので適宜変えてあげる

```
# cat /etc/ipsec.conf
version 2.0

config setup
    dumpdir=/var/run/pluto
    nat_traversal=yes
    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
    protostack=netkey
include /etc/ipsec.d/*.conf
```

これはiOS用に必要な設定となる
    dpddelay=10
    dpdtimeout=20
    dpdaction=clear

leftにはサーバーのPrivateIPアドレスを入れる
leftnexthopにはこのサーバーのデフォゲを入れる

```
# cat /etc/ipsec.d/l2tp-ipsec.conf
conn L2TP-PSK-NAT
    rightsubnet=vhost:%priv
    dpddelay=10
    dpdtimeout=20
    dpdaction=clear
    also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
        authby=secret
        pfs=no
        auto=add
        keyingtries=3
        ikelifetime=8h
        keylife=1h
        type=transport
        left=このサーバーのプライベートIP
        leftnexthop=デフォゲ
        leftprotoport=17/1701
        right=%any
        rightprotoport=17/%any
```

### 事前共有鍵の設定

例えばfoobar
実機はもっと複雑なのにしよう！

```
# cat /etc/ipsec.secrets
: PSK   "foobar"
```

### xl2tpdの設定

ip rangeがVPN接続後にクライアントに振られるIPアドレスレンジ
local ipがVPN接続時のサーバー側のIPアドレス

```
# cat /etc/xl2tpd/xl2tpd.conf
[global]
auth file = /etc/ppp/chap-secrets
[lns default]
ip range = 192.168.1.128-192.168.1.254
local ip = 192.168.1.99
require chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
```

### xl2tpdのオプション設定

optionでVPN接続名(例えばfoovpn)やVPN接続後のDNSやログファイルを指定する。
このファイルに書かなくてもいいけど、、とにかくファイルが散ってるなぁ
ログファイルはtouchしておく
touch /var/log/xl2tpd.log

```
[root@z-prd-vpnproxy01 squid]# cat /etc/ppp/options.xl2tpd
name foovpn
ipcp-accept-local
ipcp-accept-remote
ms-dns  8.8.8.8
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000
logfile /var/log/xl2tpd.log
```

接続ユーザーは"foo"
接続VPN名は"foovpn"
パスワードは"bar"
接続元IPアドレスは限定せず*

```
# cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
"foo" "foovpn" "bar" *
```

### squid

ほぼデフォ
変えたところはここだけ

```
# cat /etc/squid/squid.conf
#http_port 3128                                             
http_port 0.0.0.0:8080
```



## セキュリティグループ

こちらを解放

```
500:udp
4500:udp
1701:udp
```

さあ起動

## 停止と起動

```
/etc/init.d/squid stop
/etc/init.d/xl2tpd stop
/etc/init.d/ipsec stop
```

```
/etc/init.d/squid start
/etc/init.d/xl2tpd start
/etc/init.d/ipsec start
```

### 確認

ipsec確認
以下コマンドでfailedとかあったら設定見直そう

```
# 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.14.35-28.38.amzn1.x86_64 (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                               [OK]
Checking for 'iptables' command                                 [OK]
Opportunistic Encryption Support                                [DISABLED]
```

## 接続

### iPhoneから

iPhoneからは超絶簡単！

iphoneの設定 -> 一般 -> VPN -> "VPN構成を追加"を押す。

以下の画面になるので、必要な値を入力します。
説明にはVPN名：foovpn
サーバーには：VPNサーバーのグローバルIPアドレス
アカウント：foo
パスワード：bar

![20150729034856.jpg](https://qiita-image-store.s3.amazonaws.com/0/27932/b3052bc6-c324-d77b-05a8-2699bac38c0a.jpeg)


プロキシには"手動"を選んでください。
必要な情報を入れます。
サーバーにはVPN貼ったあとのIPアドレス：192.168.1.99
ポートはsquidで設定したポート：8080
![20150730055358.jpg](https://qiita-image-store.s3.amazonaws.com/0/27932/a86e9a29-cc98-d7d6-8e10-6d5b1aae2161.jpeg)


あとはVPN接続すればOKです。
pingも飛びました。ブラウジングもOK

![20150730060240.jpg](https://qiita-image-store.s3.amazonaws.com/0/27932/294cee23-4cdd-cd6f-23d8-8907629cce96.jpeg)


## Windowsはやっかい。。

VPN接続開始時に"809サーバー応答なし"エラー発生。。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/27932/ba97e535-9c50-df95-6e86-4ef2fd9194ee.png)


ぶっちゃけこちらのサイトに助けて頂きました。ありがたや～
http://reffi.jp/archives/308

レジストリを変える
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent の
AssumeUDPEncapsulationContextOnSendRule を
"2"

プロキシ設定をVPN単位に行うことでOK！

あとは良好良好^^
ちゃんちゃん