ChormebookのOpenVPNを使う

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

参考: