☁️
Cloudflare TunnelでICMPが通らないメモ
はじめに
CloudflaredでCIDRを指定してネットワークに接続したのだが、なぜかICMPだけ接続が通らない(他のTCPとかはいける)
$ ping 192.168.13.11
PING 192.168.13.11 (192.168.13.11): 56 data bytes
92 bytes from 203.0.113.1: Destination Host Unreachable
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 8b8f 0 0000 40 01 bd04 10.0.0.2 192.168.13.11
公式ドキュメントを見てみたところ、いくつか設定が必要なようなのでメモしておく
Cloudflaredの起動設定
ICMPパケットはカーネルで生成できるGIDが制限されているらしい
以下の場合だと、0-0までなのでGID 0のグループ(root)に属するユーザのみ許可されてる
$ sudo sysctl net.ipv4.ping_group_range
net.ipv4.ping_group_range = 0 0
cloudflaredを実行しているユーザがroot以外だと、この生成で失敗するのでカーネルパラメータを変更しておく必要がある。
$ ps -aux | grep cloudflared
admin 1651 0.3 0.9 1262420 37540 ? Ssl 13:35 0:02 /usr/bin/cloudflared --no-autoupdate tunnel run --token [REDACTED] --icmpv4-src 192.168.13.10
例えばadminというユーザなら、そのユーザのGIDを取得する。
$ id -g admin
1000
先ほどのパラメータにそのユーザが含まれるように調整してあげる。永続化も忘れずに。
echo 0 1000 | sudo tee /proc/sys/net/ipv4/ping_group_range
echo "net.ipv4.ping_group_range = 0 1000" | sudo tee -a /etc/sysctl.d/99-cloudflared.conf
あと、複数のinterfaceがある場合は起動時のコマンド--icmpv4-src 192.168.13.10でprimaryのinterfaceを指定してあげる。interface名でもipでもOK。
systemdの場合は、以下のようにserviceファイルのコマンドに追記してあげる。
sudo vim /etc/systemd/system/cloudflared.service
[Unit]
Description=cloudflared
After=network-online.target
Wants=network-online.target
[Service]
TimeoutStartSec=15
Type=notify
ExecStart=/usr/bin/cloudflared --no-autoupdate tunnel run --token [restricted] --icmpv4-src 192.168.13.10
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Cloudflare Dashboardでの設定
Cloudflared側の設定だけでなく、Cloudflare側の設定でICMPを有効化してあげる。
これがパッと見だと全然見つからないので苦しかった...
Cloudflare Oneの画面から、トラフィックポリシー -> トラフィックの設定 -> Secure Web Gateway によるトラフィックのプロキシを許可する を有効化した上で、UDPとICMPにチェックボックスをつけておく。

動作チェック
ここまでの設定をすると、無事に接続できるようになった。
$ ping 192.168.13.11 -c 5
PING 192.168.13.11 (192.168.13.11) 56(84) bytes of data.
64 bytes from 192.168.13.11: icmp_seq=1 ttl=64 time=0.310 ms
64 bytes from 192.168.13.11: icmp_seq=2 ttl=64 time=0.415 ms
64 bytes from 192.168.13.11: icmp_seq=3 ttl=64 time=0.349 ms
64 bytes from 192.168.13.11: icmp_seq=4 ttl=64 time=0.366 ms
64 bytes from 192.168.13.11: icmp_seq=5 ttl=64 time=0.320 ms
--- 192.168.13.11 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4119ms
rtt min/avg/max/mdev = 0.310/0.352/0.415/0.037 ms
Discussion