萌えキャラとは何だったのか

ギークにも絵描きにもなれない者の末路

今期のバントホームラン枠 SHOW BY ROCK!! が毎週楽しみな mix3 です。

CentOS6/7 で VPN 構築

今までにも何回か VPN 構築に挑戦してその度に「上手くいかない」となって諦めるということを繰り返してたのですが、今回はどうにか成功したので忘れないうちにメモ。

openswan (for CentOS6) / libreswan (for CentOS7) (IPsec), xl2tpd(L2TP) でさくら VPS で VPN を構築した。

参考にしたサイト

設定は スクリプトで一発簡単!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が構築出来ると思う。

共有鍵ではなく公開鍵

に出来たらいいなぁとか思ってるがそこまでは行けていない。