☁️

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

公式ドキュメントを見てみたところ、いくつか設定が必要なようなのでメモしておく
https://developers.cloudflare.com/cloudflare-one/traffic-policies/proxy/

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