Chromebookには標準でOpenVPNが使えるようになっています。実際使ってみようとしたら問題があります。設定の項目があまりにも少なく、自前で作ったシステムだと動かない可能性大です。基本的にOpenVPNの場合、サーバ側とクライアント側の設定を擦り合わせておかなくてはなりません。そこでコマンドラインから起動してみることにしました。設定は他の環境と同じです。
# openvpn --config <設定ファイル>
ところが繋がった瞬間、tun/tapデバイスが消えてエラーになり結果、接続に失敗します。/dev/net/tunデバイスはあり、またカーネルモジュールも問題ありません。そこで検索したところ、次のようにすれば接続できるようになります。
エラーの状況
read from TUN/TAP : File descriptor in bad state (code=77)
解決方法
$ sudo stop shill $ sudo start shill BLACKLISTED_DEVICES=tun0 $ sudo openvpn --config chromebook.ovpn --dev tun0
追記:strongSwanを使う場合
croutonのchroot環境にxenialをインストールしてstrongSwanを動かしてみました。
ChromeOS側:
# stop shill # start shill BLACKLISTED_DEVICES=ipsec0
Xenial(chroot)側:
kernel-libipsec.conf
load = yes
ルーティングを変更します。
# route del default gw <IP> # route add -host <VPN IP> gw <IP>
ipsec.conf
config setup conn %default ikelifetime=60m keylife=20m rekeymargin=3m keyingtries=1 keyexchange=ikev2 conn ikev2 left=%any leftsourceip=%config leftfirewall=yes leftauth=pubkey leftcert=chrome@example.crt right=example.net rightsubnet=0.0.0.0/0 dpdaction=clear dpddelay=300s rekey=no reauth=no fragmentation=yes eap_identity=%any auto=start
ipsec statusall
ikev2[1]: IKEv2 SPIs: c74a3c6a9904776e_i* a788d98c516b2904_r, rekeying disabled ikev2[1]: IKE proposal: AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048 ikev2{1}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: f4aaf5b4_i cd6736f1_o ikev2{1}: AES_CBC_128/HMAC_SHA1_96, 0 bytes_i, 0 bytes_o, rekeying disabled ikev2{1}: 192.168.200.2/32 === 0.0.0.0/0 ikev2{2}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: 7ed1c1a4_i c5cb9e38_o ikev2{2}: AES_CBC_128/HMAC_SHA1_96, 268427 bytes_i (560 pkts, 3s ago), 90620 bytes_o (574 pkts, 1s ago), rekeying disabled ikev2{2}: 192.168.200.2/32 === 0.0.0.0/0
Chromebookでは特定のサイトだけ開けないケースが目立ちました。一つの解決方法はプロキシ経由にする方法ですが根本的に解決するにはiptablesを使います。サーバ側の設定を追加します。
iptables -t mangle -A FORWARD -m policy --pol ipsec --dir in -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360 iptables -t mangle -A FORWARD -m policy --pol ipsec --dir out -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
/etc/sysctl.conf
net.ipv4.ip_no_pmtu_disc = 0