今期のバントホームラン枠 SHOW BY ROCK!! が毎週楽しみな mix3 です。
CentOS6/7 で VPN 構築
今までにも何回か VPN 構築に挑戦してその度に「上手くいかない」となって諦めるということを繰り返してたのですが、今回はどうにか成功したので忘れないうちにメモ。
openswan (for CentOS6) / libreswan (for CentOS7) (IPsec), xl2tpd(L2TP) でさくら VPS で VPN を構築した。
参考にしたサイト
- CLCL / CentOS6-L2TP-IPsec.md - Gist
- スクリプトで一発簡単!iPhone/Android/Mac/Windowsから接続可能なL2TP/IPSecなVPN環境を構築する - blog@sotm.jp
- CentOS7 PPTPを辞めてL2TP/IPSecに変更する - ともかくメモ
- ipsec - linuxでVPNサーバ - Qiita
- CentOS7 第4回 はじめての firewalld で作る Linuxルータ – CLARA ONLINE techblog
- etc...
設定は スクリプトで一発簡単!iPhone/Android/Mac/Windowsから接続可能なL2TP/IPSecなVPN環境を構築する - blog@sotm.jp のスクリプトをほぼほぼそのまま使わせてもらっている。
以下ハマッたポイント
VPNパススルー、またはIPsecパススルー
今までずっと玉砕してた理由が多分これで、ブロードバンドルータのほうで NAT を突破出来るように設定しなければならず、大抵「VPN パススルー」または「IPsec パススルー」という名前で設定が用意されているので設定を有効にしないといけなかった。
NAT超えが出来ないとサーバに接続が到達しないのでログすら出力されず途方にくれるしかったので、今回どうにかルータで止まってるということに気付けて良かった。
CentOS6 の openswan は yum で入れるとバージョンが低い
openswan のバージョンによっては MacOSX でうまく接続出来ない問題があるっぽい
なので、こんな感じで openswan を最新に更新してあげる必要があった。
$ wget https://download.openswan.org/openswan/openswan-latest.tar.gz -O /tmp/openswan-latest.tar.gz
$ mkdir /tmp/openswan-latest
$ tar xzf /tmp/openswan-latest.tar.gz -C /tmp/openswan-latest --strip=1
$ cd /tmp/openswan-latest
$ make programs
$ make install
CentOS7 の libreswan ではそういう問題はないっぽい。
conf の name は揃える必要がある
/etc/ppp/options.xl2tpd
name xl2tpd
/etc/xl2tpd/xl2tpd.conf
name = LinuxVPNserver
/etc/ipsec.d/default.secrets
"hoge001" "xl2tpd" "hoge##123" *
"hoge002" "xl2tpd" "hoge##456" *
これらの設定で LinuxVPNserver となってるところを xl2tpd にして名前を揃えないと接続がうまくいかなかった。(もしかしたら気のせいかもしれない)
CentoOS7 のカーネル設定
CentOS7 のカーネル設定は /etc/sysctl.d/*.conf にファイルを置いて設定するっぽいので CentOS7 PPTPを辞めてL2TP/IPSecに変更する - ともかくメモ に従って
/etc/sysctl.d/10-sysctl_ipsec.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
として設定反映したあと ipsec verify するとおそらくこんな感じのが出てくる
Checking rp_filter [ENABLED]
/proc/sys/net/ipv4/conf/default/rp_filter [ENABLED]
rp_filter is not fully aware of IPsec and should be disabled
rp_filter もちゃんと無効にしろ ということなので、
/etc/sysctl.d/10-sysctl_ipsec.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.rp_filter = 0
として設定反映したあと ipsec verify するとなぜか変わらず ENABLED がでてくる。設定を確認するとなぜか反映されていない。
$ sysctl -a | grep -e net.ipv4.conf.*send_redirects -e net.ipv4.conf.*accept_redirects -e net.ipv4.conf.*rp_filter | grep -v arp
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.rp_filter = 1 <= ここだけおかしい
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.lo.send_redirects = 0
上書きされてるっぽい雰囲気は感じるので、どこで何が設定されるか調べられないかとググったところ sysctl --system で見れるっぽいことが分かったので、試したところこんな感じになっており /usr/lib/sysctl.d/50-default.conf で上書きされてることが判明。
* Applying /usr/lib/sysctl.d/00-system.conf ...
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
kernel.shmmax = 4294967295
kernel.shmall = 268435456
* Applying /etc/sysctl.d/10-sysctl_ipsec.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 1 <= ここで上書きされてる
net.ipv4.conf.default.accept_source_route = 0
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...
仕方ないので mv /etc/sysctl.d/10-sysctl_ipsec.conf /etc/sysctl.d/60-sysctl_ipsec.conf として上書きされるのを回避することでようやく ENABLED を除去出来た。
CentOS7 では iptables ではなく firewalld
CentOS7 では iptables ではなく firewalld でファイアーウォールを設定する。IPsec/L2TP で必要な設定は以下で良いかと思われる。
firewall-cmd --permanent --add-service=ipsec
firewall-cmd --permanent --add-port=1701/udp
firewall-cmd --permanent --add-port=4500/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
CentOS7 では chkconfig, /etc/init.d/NAME COMMAND ではなく systemctl COMMAND NAME
CentOS7 ではサービスの管理方法が変更されているので自動起動やサービスのスタートが以下のようになっている。
systemctl enable ipsec
systemctl enable xl2tpd
systemctl restart ipsec
systemctl restart xl2tpd
完成品がこちら
CentOS7 の一発VPN構築スクリプト L2TP_IPSec_vpn_setup_for_centos7.sh
$ curl -L https://gist.githubusercontent.com/mix3/efbaf5cb47946bff6f56/raw/L2TP_IPSec_vpn_setup_for_centos7.sh | bash
or
$ wget https://gist.githubusercontent.com/mix3/efbaf5cb47946bff6f56/raw/L2TP_IPSec_vpn_setup_for_centos7.sh
$ vim L2TP_IPSec_vpn_setup_for_centos7.sh
$ bash L2TP_IPSec_vpn_setup_for_centos7.sh
とでもすると一発で構築VPNが構築出来ると思う。
共有鍵ではなく公開鍵
に出来たらいいなぁとか思ってるがそこまでは行けていない。