Cloudflare WARP に必要な通信を Windows ファイアウォールを構成して確認する

# 目的
以下の通信を許可すれば、WARP クライアントを使って Cloudflare Zero Trust を経由して通信ができることを Windows ファイアウォールを構成して確認します。

https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/deployment/firewall/#warp-with-firewall

```mermaid:
---
title: WARP with firewall
---
graph LR
WARP[WARP Client]
subgraph Authentication
Auth["Client authentication endpoint (Required)<br>your-team-name.cloudflareaccess.com"]
IdP["Identity Provider (Required if needed)<br>Okta, Entra ID, etc."]
%%Auth ~~~ IdP
end
subgraph APIs [API]
API["Client orchestration API (Required)<br>zero-trust-client.cloudflareclient.com"]
APIcheck["API Connectivity Check (Optional)<br>api.cloudflareclient.com"]
API ~~~ APIcheck
end
subgraph Tunnel
Ingress["WARP ingress IP (Required)"]
Endpoint["Tunnel Latency Check (Optional)<br>WARP endpoint<br>162.159.193.x or 162.159.197.x"]
InsideTun["Inside Tunnel Connectivity Check (Optional)<br>connectivity.cloudflareclient.com/cdn-cgi/trace"]
Ingress ~~~ Endpoint
Ingress ~~~ InsideTun
end
DoH["DNS over HTTPS IP (Required)"]
NTP["time.cloudflare.com"]
OutsideTun["Outside Tunnel Connectivity Check (Optional)<br>engage.cloudflareclient.com/cdn-cgi/trace"]
DEX["Digital Experience Monitoring (Optional)<br>(HTTP, Traceroute Tests)"]
subgraph Tool ["Help Tool (Optional)"]
Help[help.teams.cloudflare.com]
DNStest[every1dns.net]
IPv6test[ipv6.teams.cloudflare.com]
end

WARP --> |TCP 443|API
WARP --> |TCP 443|APIcheck
WARP --> |TCP 443|Auth
WARP --> |TCP 443|IdP
WARP --> |"UDP 2408,500,1701.4500 (Wireguard)<br>or<br>UDP 443,4443,8443.8095 (MASQUE)"|Ingress
WARP --> |TCP 443|DoH
WARP --> |TCP 443|InsideTun
WARP --> |ICMP|Endpoint
WARP ---> |UDP 123|NTP
WARP ---> |TCP 443|OutsideTun
WARP ---> |TCP 80,443<br>ICMP|DEX
WARP ---> |TCP 443|Help
WARP ---> |TCP 443|DNStest
WARP ---> |TCP 443|IPv6test
```

# Windows ファイアウォールの構成

## すべての「送信接続」を「ブロック」

下記リンクの allowlist での許可形式を使って進めます。

https://qiita.com/kk_riv/items/2141a69453b4a3bd5fd0

プロファイルのすべてで「送信接続」を「ブロック」に変更します。

https://learn.microsoft.com/ja-jp/windows/security/operating-system-security/network-security/windows-firewall/configure-with-command-line?tabs=cmd

```bat:cmd
netsh advfirewall set allprofiles firewallpolicy blockinbound,blockoutbound
```

「破棄されたパケットをログに記録する」ように保存先ファイル名も含めてログ設定します。

```bat:cmd
netsh advfirewall set allprofiles logging droppedconnections enable
netsh advfirewall set allprofiles logging filename C:\Windows\System32\LogFiles\Filrewall\pfirewall.log
```

`wf.msc` で「セキュリティが強化されたWindowsファイアウォール」を開くと、コマンド設定を確認しながら進められます。

http://wingsan.web.fc2.com/WinCom/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/2a931cc2-21a5-7737-c697-20cdca77908a.png)


デフォルトで有効な「Microsoft Edge」ブラウザの送信規則を「無効化」します。

```bat:cmd
netsh advfirewall firewall set rule name="Microsoft Edge" dir=out new enable=no 
```

そのときのエラー画面は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/45869571-7df4-6952-87fb-e4ef461e242d.png)



## Client orchestration API を許可

以下のコマンドで [Client orchestration API](https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/deployment/firewall/#client-orchestration-api) を許可します。

```bat:cmd
netsh advfirewall firewall add rule ^
name="Cloudflare WARP Client orchestration API" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700:7::a29f:8969,2606:4700:7::a29f:8a69,162.159.137.105,162.159.138.105 ^
protocol=tcp remoteport=443
rem program=^%ProgramFiles^%"\Cloudflare\Cloudflare WARP\warp-svc.exe" ^
```

### 疎通確認

```powershell:PowerShell
$url = 'https://zero-trust-client.cloudflareclient.com/cdn-cgi/trace'
$(Invoke-WebRequest -Uri $url -UseBasicParsing).RawContent
```

```powershell:result
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
CF-RAY: 895d6573683df609-NRT
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Cache-Control: no-cache
Content-Type: text/plain
Date: Tue, 18 Jun 2024 18:38:25 GMT
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Server: cloudflare

fl=22f387
h=zero-trust-client.cloudflareclient.com
ip=x.x.x.x
ts=1718735905.821
visit_scheme=https
uag=Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.21390.1
colo=NRT
sliver=none
http=http/1.1
loc=JP
tls=TLSv1.2
sni=plaintext
warp=off
gateway=off
rbi=off
kex=X25519
```

## Client authentication endpoint を許可
認証に必要なエンドポイントを許可します。

この他にリダイレクト先 IdP へのアクセスに必要な通信も許可が必要です。

```bat:cmd
>nslookup <your-team-name>.cloudflareaccess.com
サーバー:  warp-svc
Address:  127.0.2.2

権限のない回答:
名前:    <your-team-name>.cloudflareaccess.com
Addresses:  2606:4700:300a::6813:c21d
          2606:4700:300a::6813:c31d
          104.19.195.29
          104.19.194.29
```

```bat:cmd
netsh advfirewall firewall add rule ^
name="<your-team-name>.cloudflareaccess.com" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700:300a::6813:c21d,2606:4700:300a::6813:c31d,104.19.195.29,104.19.194.29 ^
protocol=tcp remoteport=443
rem program=^%ProgramFiles^%" (x86)\Microsoft\Edge\Application\msedge.exe" ^
```

### 疎通確認

```powershell:PowerShell
$url = 'https://xxx.cloudflareaccess.com/cdn-cgi/trace'
$(Invoke-WebRequest -Uri $url -UseBasicParsing).RawContent
```

```powershell:result
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
CF-RAY: 895d69486e7b3c15-NRT
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Cache-Control: no-cache
Content-Type: text/plain
Date: Tue, 18 Jun 2024 18:41:02 GMT
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Server: cloudflare

fl=448f624
h=xxx.cloudflareaccess.com
ip=x.x.x.x
ts=1718736062.782
visit_scheme=https
uag=Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.21390.1
colo=NRT
sliver=none
http=http/1.1
loc=JP
tls=TLSv1.2
sni=plaintext
warp=off
gateway=off
rbi=off
kex=X25519
```

## WARP ingress IP を許可
以下のコマンドで [WARP ingress IP](https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/deployment/firewall/#warp-ingress-ip) を許可します。

```bat:cmd (Wireguard)
netsh advfirewall firewall add rule ^
name="Cloudflare WARP ingress IP for Wireguard" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700:100::/48,162.159.193.0/24 ^
protocol=udp remoteport=2408,500,1701,4500
rem program=^%ProgramFiles^%"\Cloudflare\Cloudflare WARP\warp-svc.exe" ^
```

```bat:cmd (MASQUE)
netsh advfirewall firewall add rule ^
name="Cloudflare WARP ingress IP for MASQUE" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700:102::/48,162.159.197.0/24 ^
protocol=udp remoteport=443,4443,8443,8095
rem program=^%ProgramFiles^%"\Cloudflare\Cloudflare WARP\warp-svc.exe" ^
```

エラー画面は解消されたものの、Disconnected となり接続されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/96e93a10-e1f0-2d2a-e834-3a916d7041f7.png)

## DoH IP を許可

以下のコマンドで [DoH IP](https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/deployment/firewall/#doh-ip) を許可します。

```bat:cmd
netsh advfirewall firewall add rule ^
name="Cloudflare WARP DoH IP" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700:4700::1111,2606:4700:4700::1001,162.159.36.1,162.159.46.1 ^
rem program=^%ProgramFiles^%"\Cloudflare\Cloudflare WARP\warp-svc.exe" ^
protocol=tcp remoteport=443
```

この時点で「接続済み」となります。
API Connectivity は「接続されていません」の状態ですが、このままでも使い始めることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/c87fdafb-bafb-106b-84fd-817647edbfbf.png)

### 疎通確認

```powershell:PowerShell
$domain = 'www.cloudflare.com'
$url = 'https://162.159.36.1/dns-query?name='+$domain+'&type=A';
$header = @{ host="<ACCOUNT_ID>.cloudflare-gateway.com"; "accept"="application/dns-json"}
$(Invoke-WebRequest -Uri $url -Headers $header -UseBasicParsing).RawContent
```

```powershell:result
HTTP/1.1 200 OK
Connection: keep-alive
Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=qVAmG4R7zsy%2FUfQud3pDngoL8edSw6yTLXU%2Fgzqw4blyMIZUWEPJTq2FUEJjql%2F4TRy7FSW6NqNLQxGZwUqnKd6YoIw%2FzSNUv5KgBu%2BzTc19wwbv9EYUAnrZ4I7f1Cy2RP4J5dHfO5%2B6JJns8JblM7eSZBi4vUBqdRS7aq1BYVtKK6SXHNK8BIY%3D"}],"group":"cf-nel","max_age":604800}
NEL: {"report_to":"cf-nel","max_age":604800}
Access-Control-Allow-Origin: *
CF-RAY: 895d5ff688c48a57-NRT
Content-Length: 271
Content-Type: application/dns-json
Date: Tue, 18 Jun 2024 18:34:41 GMT
Server: cloudflare

{"Status":0,"TC":false,"RD":true,"RA":true,"AD":true,"CD":false,"Question":[{"name":"www.cloudflare.com","type":1}],"Answer":[{"name":"www.cloudflare.com","type":1,"TTL":300,"data":"104.16.123.96"},{"name":"www.cloudflare.com","type":1,"TTL":300,"data":"104.16.124.96"}]}
```

# 参考：`time.cloudflare.com` を許可

https://developers.cloudflare.com/time-services/ntp/usage/

時刻同期に使われているので、オプショナルで許可します。

```bat:cmd
netsh advfirewall firewall add rule ^
name="time.cloudflare.com" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700:f1::1,2606:4700:f1::123,162.159.200.1,162.159.200.123 ^
protocol=udp remoteport=123
```

通信が通っていないときは以下のエラーログが確認できます。

```text:daemon.log
2024-07-03T01:07:20.984Z	ERROR	warp::warp_service	
Failed to synchronize NTP time; Falling back to local time until next sync err=Synchronization(IOError(Custom {
    kind: TimedOut,
    error: "Timeout while waiting for server reply",
}))
...
2024-07-03T01:07:21.078Z	WARN	cf_ntp_client::clock	
Failed to synchronize time with NTP server err=Synchronization(IOError(Custom {
    kind: TimedOut,
    error: "Timeout while waiting for server reply",
}))
```

# 参考：`api.cloudflareclient.com` を許可
API Connectivity チェックに使われているので、オプショナルで許可します。

```bat:cmd
netsh advfirewall firewall add rule ^
name="api.cloudflareclient.com" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700::6810:50e6,2606:4700::6811:8fa3,104.16.80.230,104.17.143.163 ^
protocol=tcp remoteport=443
rem program=^%ProgramFiles^%"\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe" ^
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e107688e-13e8-848d-4a2b-65c08d04bf84.png)

## 疎通確認

```powershell:PowerShell
$url = 'https://api.cloudflareclient.com/cdn-cgi/trace'
$(Invoke-WebRequest -Uri $url -UseBasicParsing).RawContent
```

```powershell:result
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
CF-RAY: 89600f85dbdadff5-NRT
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Cache-Control: no-cache
Content-Type: text/plain
Date: Wed, 19 Jun 2024 02:24:03 GMT
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Server: cloudflare

fl=448f548
h=api.cloudflareclient.com
ip=x.x.x.x
ts=1718763843.499
visit_scheme=https
uag=Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.21390.1
colo=NRT
sliver=none
http=http/1.1
loc=JP
tls=TLSv1.2
sni=plaintext
warp=on
gateway=on
rbi=off
kex=X25519
```

# 参考：`connectivity.cloudflareclient.com` を許可
トンネル内部での Connectivity チェックに使われているので、オプショナルで許可します。

```bat:cmd
netsh advfirewall firewall add rule ^
name="connectivity.cloudflareclient.com" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700:7::a29f:8a41,2606:4700:7::a29f:8941,162.159.138.65,162.159.137.65 ^
protocol=tcp remoteport=443
rem program=^%ProgramFiles^%"\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe" ^
rem program=^%ProgramFiles^%"\Cloudflare\Cloudflare WARP\warp-diag.exe" ^
```

`warp-diag` コマンドで生成される `zip` ファイル内のログで以下のように通信されていることが確認できます。

```text:connectivity.txt
====================================================================
Trace Result
====================================================================

Inside Tunnel
-------------
Trace 'connectivity.cloudflareclient.com' via 2606:4700:7::a29f:8941:
	fl=382f245
	h=connectivity.cloudflareclient.com
	ip=2a09:bac5:4433:efa::17e:f5
	ts=1715233957.54
	visit_scheme=https
	uag=
	colo=NRT
	sliver=none
	http=http/1.1
	loc=JP
	tls=TLSv1.3
	sni=plaintext
	warp=on
	gateway=on
	rbi=off
	kex=P-256
	

Trace 'connectivity.cloudflareclient.com' via 2606:4700:7::a29f:8a41:
	fl=382f245
	h=connectivity.cloudflareclient.com
	ip=2a09:bac5:4433:efa::17e:f5
	ts=1715233957.578
	visit_scheme=https
	uag=
	colo=NRT
	sliver=none
	http=http/1.1
	loc=JP
	tls=TLSv1.3
	sni=plaintext
	warp=on
	gateway=on
	rbi=off
	kex=P-256
	

Trace 'connectivity.cloudflareclient.com' via 162.159.137.65:
	fl=382f245
	h=connectivity.cloudflareclient.com
	ip=104.28.157.31
	ts=1715233957.623
	visit_scheme=https
	uag=
	colo=NRT
	sliver=none
	http=http/1.1
	loc=JP
	tls=TLSv1.3
	sni=plaintext
	warp=on
	gateway=on
	rbi=off
	kex=P-256
	

Trace 'connectivity.cloudflareclient.com' via 162.159.138.65:
	fl=382f245
	h=connectivity.cloudflareclient.com
	ip=104.28.157.31
	ts=1715233957.664
	visit_scheme=https
	uag=
	colo=NRT
	sliver=none
	http=http/1.1
	loc=JP
	tls=TLSv1.3
	sni=plaintext
	warp=on
	gateway=on
	rbi=off
	kex=P-256
```

## 疎通確認

```powershell:PowerShell
$url = 'https://connectivity.cloudflareclient.com/cdn-cgi/trace'
$(Invoke-WebRequest -Uri $url -UseBasicParsing).RawContent
```

```powershell:result
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
CF-RAY: 896028206ea7af52-NRT
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Cache-Control: no-cache
Content-Type: text/plain
Date: Wed, 19 Jun 2024 02:40:51 GMT
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Server: cloudflare

fl=408f159
h=connectivity.cloudflareclient.com
ip=x.x.x.x
ts=1718764851.269
visit_scheme=https
uag=Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.21390.1
colo=NRT
sliver=010-tier1
http=http/1.1
loc=JP
tls=TLSv1.2
sni=plaintext
warp=on
gateway=on
rbi=off
kex=X25519
```

# 参考：`engage.cloudflareclient.com` を許可
トンネル外部での Connectivity チェックに使われているので、オプショナルで許可します。

```bat:cmd (Wireguard)
netsh advfirewall firewall add rule ^
name="engage.cloudflareclient.com for Wireguard" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700:4700::1111,162.159.36.1,2606:4700:100::/48,162.159.193.0/24 ^
protocol=tcp remoteport=443
rem program=^%ProgramFiles^%"\Cloudflare\Cloudflare WARP\warp-diag.exe" ^
rem program=^%ProgramFiles^%"\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe" ^
```

```bat:cmd (MASQUE)
netsh advfirewall firewall add rule ^
name="engage.cloudflareclient.com for MASQUE" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700:4700::1111,162.159.36.1,2606:4700:102::/48,162.159.197.0/24 ^
protocol=tcp remoteport=443
rem program=^%ProgramFiles^%"\Cloudflare\Cloudflare WARP\warp-diag.exe" ^
rem program=^%ProgramFiles^%"\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe" ^
```

`warp-diag` コマンドで生成される `zip` ファイル内のログで以下のように通信されていることが確認できます。

```text:connectivity.txt
Outside Tunnel
--------------
Trace 'engage.cloudflareclient.com' via 162.159.36.1:
	fl=448f117
	h=engage.cloudflareclient.com
	ip=x.x.x.x
	ts=1715233957.754
	visit_scheme=https
	uag=
	colo=NRT
	sliver=010-tier1
	http=http/1.1
	loc=JP
	tls=TLSv1.3
	sni=plaintext
	warp=off
	gateway=off
	rbi=off
	kex=P-256
	
Trace 'engage.cloudflareclient.com' via 2606:4700:4700::1111:
	fl=408f138
	h=engage.cloudflareclient.com
	ip=x:x:x:x:x:x:x:x
	ts=1715233957.814
	visit_scheme=https
	uag=
	colo=NRT
	sliver=010-tier1
	http=http/1.1
	loc=JP
	tls=TLSv1.3
	sni=plaintext
	warp=off
	gateway=off
	rbi=off
	kex=P-256

Trace 'engage.cloudflareclient.com' via 162.159.193.x:
	fl=22f293
	h=engage.cloudflareclient.com
	ip=x.x.x.x
	ts=1715233957.876
	visit_scheme=https
	uag=
	colo=NRT
	sliver=010-tier1
	http=http/1.1
	loc=JP
	tls=TLSv1.3
	sni=plaintext
	warp=off
	gateway=off
	rbi=off
	kex=P-256
```

## 疎通確認

```powershell:PowerShell
$url = 'https://162.159.36.1/cdn-cgi/trace';
$header = @{ host="engage.cloudflareclient.com"}
$(Invoke-WebRequest -Uri $url -Headers $header -UseBasicParsing).RawContent

$url = 'https://[2606:4700:4700::1111]/cdn-cgi/trace';
$header = @{ host="engage.cloudflareclient.com"}
$(Invoke-WebRequest -Uri $url -Headers $header -UseBasicParsing).RawContent

# Wireguard
$url = 'https://162.159.193.x/cdn-cgi/trace';
$header = @{ host="engage.cloudflareclient.com"}
$(Invoke-WebRequest -Uri $url -Headers $header -UseBasicParsing).RawContent

# MASQUE
$url = 'https://162.159.197.x/cdn-cgi/trace';
$header = @{ host="engage.cloudflareclient.com"}
$(Invoke-WebRequest -Uri $url -Headers $header -UseBasicParsing).RawContent
```

```powershell:result
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
CF-RAY: 89615d019f62347b-NRT
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Cache-Control: no-cache
Content-Type: text/plain
Date: Wed, 19 Jun 2024 06:11:42 GMT
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Server: cloudflare

fl=408f23
h=engage.cloudflareclient.com
ip=x.x.x.x
ts=1718777502.975
visit_scheme=https
uag=Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.21390.1
colo=NRT
sliver=none
http=http/1.1
loc=JP
tls=TLSv1.2
sni=plaintext
warp=off
gateway=off
rbi=off
kex=X25519
```

# 参考：Tunnel Latency チェックを許可
`warp-diag` コマンドで生成される `zip` ファイル内のログで以下のようなエラーが確認できます。

```text:gui-log.log
2024-05-09T02:06:12Z|ERROR|Ping failed to WARP endpoint 162.159.193.x |Warp.UI.Connectivity.StatisticsService|`
```

Tunnel Latency チェックに使われているので、オプショナルで許可します。

```bat:cmd (Wireguard)
netsh advfirewall firewall add rule ^
name="Cloudflare WARP Tunnel Latency Check for Wireguard" ^
dir=out action=allow enable=yes ^
remoteip=162.159.193.0/24 ^
protocol=icmpv4
```

```bat:cmd (MASQUE)
netsh advfirewall firewall add rule ^
name="Cloudflare WARP Tunnel Latency Check for MASQUE" ^
dir=out action=allow enable=yes ^
remoteip=162.159.197.0/24 ^
protocol=icmpv4
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/7cb23c42-0f17-5fcf-1222-b083c9ebf204.png)

# 参考：Captive portal check を許可

- cloudflareportal.com
- cloudflareok.com
- cloudflarecp.com

```bat:cmd
netsh advfirewall firewall add rule ^
name="Captive portal check" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700::6811:e6b8,2606:4700::6811:e7b8,104.17.230.184,104.17.231.184,2606:4700::6812:ee5,2606:4700::6812:fe5,104.18.15.229,104.18.14.229,2606:4700::6810:cbe6,2606:4700::6810:cae6,104.16.203.230,104.16.202.230 ^
protocol=tcp remoteport=443
```

# 参考：`help.teams.cloudflare.com` を許可
トラブルシューティングに役立つ `help.teams.cloudflare.com` への通信を、オプショナルで許可します。

https://help.teams.cloudflare.com/

```bat:cmd
netsh advfirewall firewall add rule ^
name="help.teams.cloudflare.com" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700::6811:815,2606:4700::6811:915,104.17.8.21,104.17.9.21 ^
protocol=tcp remoteport=443
```

DNS resolver のテストに `every1dns.net` が使用されます。

```bat:cmd
netsh advfirewall firewall add rule ^
name="every1dns.net" ^
dir=out action=allow enable=yes ^
remoteip=2803:f800:53::1,2a06:98c1:52::1,162.159.61.1,172.64.41.1 ^
protocol=tcp remoteport=443
```

IPv6 接続確認に `ipv6.teams.cloudflare.com` が使用されます。

```bat:cmd
netsh advfirewall firewall add rule ^
name="ipv6.teams.cloudflare.com" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700::6810:6e15 ^
protocol=tcp remoteport=443
```

# 参考：Digital Experience Monitoring テストを許可 
Digital Experience Monitoring テストを構成している場合は許可します。

https://developers.cloudflare.com/cloudflare-one/insights/dex/

```bat:cmd
netsh advfirewall firewall add rule ^
name="Allow WARP DEX Tests" ^
dir=out action=allow enable=yes ^
program="C:\Program Files\Cloudflare\Cloudflare WARP\warp-dex.exe" ^
protocol=any
```

# 参考：ローカルアドレスを許可

[CF_HOST_UNREACHABLE_CHECK](https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/troubleshooting/client-errors/#cf_host_unreachable_check) となった場合には、

```
Status: Unable to connect
Error reason: Failed to reach host
Error code: CF_HOST_UNREACHABLE_CHECK
Error description: The initial connectivity check failed because the host was unreachable.
Learn more: https://cfl.re/CF_HOST_UNREACHABLE_CHECK
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/1881eaab-36ea-bf3d-2466-eba174ba15a9.png)

以下のローカルアドレスを許可します。

```bat:cmd
netsh advfirewall firewall add rule ^
name="Allow Local IP" ^
dir=out action=allow enable=yes ^
remoteip=127.0.0.0/8 ^
protocol=any
```

# 参考：Override local interface IP
WARP クライアントはトンネル確立時にデフォルトで `172.16.0.2` のアドレスでローカルインターフェースを作成します。

IP 重複の問題がある場合には、`Override local interface IP` により、ローカルインターフェースのアドレスと `100.96.x.x` に設定できます。

https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/configure-warp/warp-settings/#override-local-interface-ip

そのとき `100.96.x.x` からの通信がブロックされる場合には、以下のルールを追加します。

```bat:cmd
netsh advfirewall firewall add rule ^
name="Allow from CGNAT IP" ^
dir=out action=allow enable=yes ^
remoteip=2606:4700:110::/48,100.96.0.0/12 ^
protocol=any
```

# 参考：`MASQUE` プロトコルへの変更
稀に端末の挙動に依存せず、「ネットワークの場所」によって WARP 接続できる・できないが変わることがあります。
その場合、非標準の UDP ポートを使用する `Wireguard` プロトコルが途中経路の ISP で意図せずブロックさせrていることがあります。
その場合には 2024 年 6 月の WARP バージョンから利用できるようになった `MASQUE` プロトコルに変更して WARP 接続できるかを試してみてください。 HTTP/3 ベースの標準 UDP 443 ポートを使用するため、ISP 起因で接続できなくなるような問題を取り除くことができます。

https://developers.cloudflare.com/cloudflare-one/changelog/warp/#2024-06-28

https://blog.cloudflare.com/zero-trust-warp-with-a-masque

>WireGuardはVPNソリューションでは人気がありますが、標準ベースではないため、非標準のトラフィックが意図的にブロックされることもあれば、そうでないこともあるインターネットの世界では、第一級市民のようには扱われません。WireGuardは、デフォルトで非標準のポート51820を使用します。Zero Trust WARPでは、WireGuardトンネルにポート2408を使用するように変更されますが、依然として非標準ポートです。自社のファイアウォールを制御している顧客にとっては、これは問題ではなく、単にそのトラフィックを許可するだけです。しかし、多数の公共Wi-Fiロケーション、または世界の約7,000のISPの多くは、WireGuardについて何も知らず、これらのポートをブロックしています。また、ISPがWireGuardについて知っていて、意図的にブロックしている場合もあります。
これは、ローミングしている Zero Trust WARP ユーザーにとって、地元の喫茶店、ホテル、飛行機、またはキャプティブ・ポータルや公共 Wi-Fi アクセスがあるその他の場所、さらには地元の ISP で大混乱を引き起こす可能性があります。ユーザーはZero Trust WARPによる信頼性の高いアクセスを期待しており、自分のデバイスがCloudflareのグローバルネットワークへの接続をブロックされると不満を感じます。
そして今、HTTP/3とQUICを使用し、拡張するMASQUEという実績のあるテクノロジーが登場した。なぜCloudflareがMASQUEが未来だと信じているのか、その理由をよりよく理解するために、これらについて簡単にレビューしてみましょう。


# 参考：トラブルシュート
以下の要領でプロセス ID を見つけて、どのプロセスのどの通信かを確認する方法があります。

https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/troubleshoot-windows-firewall-with-advanced-security-guidance

`netstat` では `UDP 2408` で通信している様子などが確認できます。
試しに `UDP 2408` をブロックすると、`UDP 500` を使って通信されていることが確認できます。

```bat:cmd
netstat -abno > netstat.txt
tasklist > tasklist.txt
```

また、以下の `powershell` コマンドで Windows ファイアウォールログを `tail -f` できます。

https://gist.github.com/kyouheicf/59543ff7f9e06ba2e7ecc337006625a6

```text:C:\Windows\System32\LogFiles\Filrewall\pfirewall.log
#Version: 1.5
#Software: Microsoft Windows Firewall
#Time Format: Local
#Fields: date time action protocol src-ip dst-ip src-port dst-port size tcpflags tcpsyn tcpack tcpwin icmptype icmpcode info path
2024-05-09 16:13:02 DROP  TCP  100.96.0.20     18.154.144.92   59946    80 - - - SEND
2024-05-09 16:13:03 DROP  TCP  2606:4700:110:8d2e:5414:eca8:25fb:6b59 2001:470:1:18::115 59947    80 - - - SEND
2024-05-09 16:13:03 DROP  TCP  100.96.0.20     216.218.228.115 59948    80 - - - SEND
2024-05-09 16:13:03 DROP  TCP  2606:4700:110:8d2e:5414:eca8:25fb:6b59 2001:470:1:18::115 59949    80 - - - SEND
...
```

# 参考：その他諸々の通信許可
Cloudflare WARP の通信を取り出して見たいため、その他諸々の許可を入れます。

ローカル・プライベート・マルチキャスト・CGNATアドレスを許可します。

```bat:cmd
netsh advfirewall firewall add rule ^
name="Allow Local, RFC 1918, Multicast and CGNAT IP" ^
dir=out action=allow enable=yes ^
remoteip=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,224.0.0.0/4,100.96.0.0/12 ^
protocol=any
```

IPv6 リンクローカルアドレス `fe80::/10` とユニークローカルアドレス `fc00::/7` を許可します。

```bat:cmd
netsh advfirewall firewall add rule ^
name="Allow IPv6 misc" ^
dir=out action=allow enable=yes ^
remoteip=fe80::/10,fd00::/8,ff02::1:3,ff02::c,ff02::16,ff02::fb ^
protocol=any
```

`whois` で調べて Microsoft だった IP レンジを許可します。

```bat:cmd
netsh advfirewall firewall add rule ^
name="Allow Microsoft IP" ^
dir=out action=allow enable=yes ^
remoteip=2603:1000::/24,2620:1EC::/36,20.33.0.0/16,20.36.0.0/14,20.48.0.0/12,20.40.0.0/13,20.34.0.0/15,20.128.0.0/16,20.64.0.0/10,13.96.0.0/13,13.64.0.0/11,13.104.0.0/14,20.180.0.0/14,20.184.0.0/13,52.152.0.0/13,52.160.0.0/11,52.145.0.0/16,52.146.0.0/15,52.148.0.0/14,40.126.0.0/18,40.96.0.0/12,40.74.0.0/15,40.76.0.0/14,40.120.0.0/14,40.125.0.0/17,40.112.0.0/13,40.80.0.0/12,40.124.0.0/16,4.240.0.0/12,20.192.0.0/10,204.79.195.0/24,204.79.196.0/23,4.144.0.0/12,51.104.0.0/15,68.218.0.0/15,68.220.0.0/15,40.64.0.0/13,104.40.0.0/13,51.10.0.0/15,20.0.0.0/11,52.224.0.0/11 ^
protocol=any
```

Microsoft で使われていると思われる CDN ベンダの IP レンジを許可します。

```bat:cmd
netsh advfirewall firewall add rule ^
name="Ignore CDN vendor IP" ^
dir=out action=allow enable=yes ^
remoteip=2600:1400::/24,2606:2800::/32,2a04:4e40::/29,2402:6800::/32,2600:1900::/28,2404:6800::/32,23.192.0.0/11,23.64.0.0/14,23.32.0.0/11,199.232.0.0/16,111.119.27.0/24,142.250.0.0/15,152.176.0.0/12,152.192.0.0/13,117.18.232.0/24,151.139.0.0/16,118.215.176.0/20,35.184.0.0/13 ^
protocol=any
```

# 参考：Invoke-WebRequest エラー
このエラーを解消するには、以下のコマンドを実施します。

`The response content cannot be parsed because the Internet Explorer engine is not available, or
Internet Explorer's first-launch configuration is not complete. Specify the UseBasicParsing parameter and try again.`

https://learn.microsoft.com/ja-jp/windows/privacy/manage-connections-from-windows-operating-system-components-to-microsoft-services

> 初回実行ウィザードを構成するには、次の操作を行います。
> ...
> `HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Internet Explorer\Main` で `DisableFirstRunCustomize` という名前の新しい `REG_DWORD` レジストリ設定を作成し、 `1` を設定します


```bat:cmd
reg.exe add "HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Internet Explorer\Main" /v DisableFirstRunCustomize /t REG_DWORD /d 1 /f
```

# 参考リンク

https://dev.classmethod.jp/articles/cloudflare-zero-trust-warp-architecture/