# Cloudflare WARP: cài sau mạng nền

WARP trong dự án dùng WireGuard và định tuyến IPv4 chọn lọc trên RouterOS 7. Đây là tích hợp cộng đồng, không phải ứng dụng Cloudflare One Client chính thức chạy trên MikroTik. Không dùng trên RouterOS 6.

## 1. Điều kiện và quyết định có cần cài

- Mạng nền từ generator đã chạy; có danh sách interface `LAN` với BridgeLAN và các VLAN cần thiết. Firewall nhận established/related, NAT và multi-WAN đã qua test.
- Có macOS, Python 3; bản tạo tài khoản thường cần Homebrew và `wgcf`. Nếu chỉ có Windows/Linux, tạo/import từ profile bằng Python theo CLI bên dưới rồi chuyển file qua WinBox; chức năng Clipboard trong launcher dành cho macOS.
- WARP mặc định chọn Telegram, Medium và BBC theo các IP/domain được liệt kê. Không tự đưa Zalo, toàn Internet hoặc mạng LAN qua tunnel.
- Nếu bot gửi trực tiếp được và không cần định tuyến chọn lọc, bỏ qua WARP sẽ giảm phụ thuộc. WARP không làm public IPv4 cho port-forward, không cộng băng thông một kết nối và không thay một WAN dự phòng.

## 2. Tạo WARP thường ngay trên web

Mở [Tạo WARP](https://mikrotik.thachanhitt.vn/warp.html). Chọn dịch vụ cần đi qua tunnel; có thể thêm domain hoặc IPv4/CIDR, mỗi dòng một đích. Tên address list trong RouterOS là `WARP_LIST`. Không nhập mạng LAN, private IP, IP endpoint hay các probe giám sát; bộ tạo chặn các IP/CIDR trùng này.

Đọc điều khoản Cloudflare, tích đồng ý rồi bấm **Tạo WARP mới**. Trình duyệt dùng Web Crypto X25519 để tạo keypair, chỉ gửi public key qua API cùng domain tới Cloudflare. Private key không gửi lên server và không lưu localStorage. Worker không lưu account token/response vào database hoặc log payload. Giới hạn 2 lượt/phút/IP tại điểm xử lý Cloudflare; đây là chống bấm lặp cơ bản, không phải quota toàn cầu tuyệt đối.

Khi có profile hợp lệ, phần xem trước sinh lệnh và mở nút **Copy cấu hình**/**Tải .rsc**. Đổi dịch vụ hoặc thêm domain sẽ dùng lại tài khoản vừa tạo. Tải/copy trước khi đóng trang; tải lại trang làm mất private key trong bộ nhớ. Không có chức năng khôi phục key từ server. Cấu hình chứa key nên phải lưu riêng tư.

Nếu trình duyệt không hỗ trợ X25519 hoặc API từ chối/timeout, trang báo lỗi, không tự tạo profile giả và không tự gửi lại yêu cầu. Với timeout, đăng ký có thể đã diễn ra nhưng chưa nhận response. Dùng command trên macOS bên dưới nếu cần. API client WARP không phải API public có cam kết ổn định, nên khả năng đăng ký có thể thay đổi.

## 3. Tải bộ công cụ dự phòng

Tải [bộ WARP không chứa khóa riêng](https://mikrotik.thachanhitt.vn/downloads/warp-tools.zip), giải nén vào thư mục riêng tư. Đọc `README.md` trong gói. Các file đi cùng nhau: `warp_config.py`, hai launcher `.command`, script gỡ và README.

Không tải profile do người lạ chia sẻ. Các file `*.conf`, `.rsc` đã sinh và Clipboard chứa private key; không đẩy lên Git hoặc gửi nhóm chat.

## 4. Cách A: tạo tài khoản WARP thường trên macOS

Mở `Tao_Acc_WARP_Mikrotik.command`. Nếu macOS chưa cho chạy, mở Terminal, gõ `bash ` rồi kéo đúng file `.command` vào cửa sổ và Enter; kiểm tra đường dẫn trước khi chạy. Không dùng lệnh bỏ bảo mật toàn máy.

Script kiểm tra `wgcf`, dùng Homebrew cài nếu chưa có; `wgcf register --accept-tos` đồng ý điều khoản Cloudflare và đăng ký tài khoản mới mỗi lần chạy. Đọc điều khoản trước; không chạy liên tục để thử. Sau đó nó tạo profile trong thư mục tạm, kiểm tra key/address/endpoint, lưu `mikrotik_warp_generated.rsc` quyền 0600 và copy vào Clipboard.

Nếu đăng ký lỗi, dừng và kiểm tra thông báo của wgcf/network. Không tạo endpoint hoặc public key phỏng đoán. Việc có file RSC chỉ xác nhận sinh file, chưa xác nhận Cloudflare chấp nhận tunnel. [wgcf upstream](https://github.com/ViRb3/wgcf).

## 5. Cách B: chuyển profile WireGuard có sẵn

Nếu đã có profile hợp lệ của chính bạn, dùng `Tao_Cau_Hinh_WARP_Tu_Profile.command`, nhập đường dẫn đầy đủ tới `.conf`. Công cụ xử lý profile tại máy, không nhận JWT và không đăng ký thiết bị Zero Trust. Nó phân giải hostname endpoint qua DNS khi cần.

Trên macOS có thể dùng CLI trong thư mục đã giải nén:

```bash
python3 warp_config.py /duong/dan/profile.conf /duong/dan/mikrotik_warp_generated.rsc
```

Profile phải có `[Interface] PrivateKey`, IPv4 `/32`, `[Peer] PublicKey`, `Endpoint` host:port. Công cụ từ chối khóa sai độ dài/base64, địa chỉ sai và port ngoài 1–65535. Khi dùng nhiều peer/profile kiểu khác, cần chuyển về profile WARP một peer đúng chuẩn trước, không tự chọn đại endpoint.

Với Zero Trust, theo lựa chọn của chủ dự án, chỉ sử dụng `Tao_Acc_WARP_Zero_Trust_Mikrotik.command` trên máy anh để tạo tài khoản/profile. File command này không đưa lên web, không commit và không nằm trong ZIP public; vẫn là helper thử nghiệm dùng API đăng ký client, chưa xác nhận end-to-end. Chạy từ thư mục `Cloudflare WARP` trên máy, đọc hướng dẫn đăng nhập của helper, giữ JWT/profile/RSC riêng tư. Sau khi có profile, dùng bộ chuyển profile ở trên để nhận cấu hình routing đã sửa; không nhập lại RSC cũ do helper tạo. Web không nhận JWT Zero Trust.

Cloudflare One Client có MASQUE và WireGuard, nhưng chuyển profile WireGuard không đồng nghĩa có đầy đủ device posture, DNS proxy hay chính sách của client chính thức. Tài khoản phải được tổ chức cho phép dùng WireGuard và enrollment phù hợp.

Nguồn: [Cloudflare One Client](https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/) và [thiết lập tunnel](https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/).

## 6. Nạp cấu hình trên router

1. Backup router, giữ phiên MAC WinBox tại chỗ. Đọc file sinh ra để biết những object sẽ được thay: `wg-warp`, `to-warp`, `WARP_LIST`, rule comment WARP và watchdog WARP.
2. Xác nhận không có cấu hình khác dùng những tên này. Cài lại sẽ thay cấu hình WARP cũ, không phải tạo tunnel thứ hai.
3. Mở **Files** trong WinBox, tải `mikrotik_warp_generated.rsc` lên router. Kiểm tra đúng tên file, không đăng ảnh chứa Source/private key.
4. Với file tải từ web, tên mặc định là `mikrotik-warp.rsc`; đổi tên trong lệnh bên dưới cho đúng file đã tải. Mở New Terminal và import:

```routeros
/import file-name=mikrotik_warp_generated.rsc
```

5. Đọc output. Nếu lỗi, dừng và kiểm tra phần đã chạy; khối không tự hoàn tác. Nếu không lỗi, thực hiện mục 7 rồi xóa file nhập khỏi **Files**; giữ bản backup riêng trên máy nếu cần.

Không dán lại cấu hình nền generator sau WARP; generator dành cho router trắng. Thay đổi LAN hoặc thêm VLAN sau này phải giữ danh sách LAN đúng.

## 7. Kiểm tra trước khi sử dụng

Trong **WireGuard > Peers**, xem peer của `wg-warp`: **Last Handshake** phải mới, **Rx/Tx** tăng khi thử traffic. Không chia sẻ private key. Đọc thêm:

```routeros
/interface wireguard peers print
/ip route print where routing-table=to-warp
/ip firewall mangle print stats where comment~"WARP"
/tool netwatch print detail where comment="WARP-Watchdog"
/ping 1.1.1.2 count=5
```

`1.1.1.2/32` là canary được ép qua tunnel trong main, không phải DNS mặc định hay probe của PPPoE Monitor. Route blackhole dự phòng ngăn canary đi nhầm WAN khi interface mất; Netwatch dùng kết quả để bật/tắt rule đánh dấu WARP.

Sau cài, đóng/mở lại ứng dụng Telegram/trang cần test để tạo kết nối mới. Các kết nối đã FastTrack hoặc mang mark PCC từ trước không tự đổi tunnel. Counter WARP phải tăng; website thường vẫn dùng WAN. Nếu ping đạt nhưng HTTPS treo, kiểm tra MTU/MSS, endpoint, DNS và chính sách Cloudflare; ping một IP không chứng minh mọi dịch vụ hoạt động.

## 8. Khi chạy chung với PCC, cảnh báo và QoS

- Rule WARP được đặt trước PCC, chỉ bắt kết nối mới từ `LAN` hoặc router và còn `connection-mark=no-mark`. Kết nối đã được đánh dấu đường WAN trả về được giữ nguyên.
- `wg-warp` không thêm vào danh sách WAN: danh sách này còn được generator dùng cho quyền WinBox. Firewall chỉ mở forward từ LAN ra tunnel; traffic ngược cần established/related của cấu hình nền.
- FastTrack giữ `connection-mark=no-mark`, loại kết nối WARP/PCC đã đánh dấu. Nếu QoS đã tắt FastTrack thì WARP không tạo lại rule đó.
- Packet mark download theo `in-interface=pppoe-outN` không bắt gói bên trong tunnel từ `wg-warp`. Vì vậy FQ-CoDel download theo WAN chưa được đảm bảo cho WARP. PCQ LAN chính cần đo riêng; không cam kết tốc độ/CPU khi bật tất cả.
- Telegram Fetch do router phát được chọn qua chain output. Zalo mặc định đi WAN. Muốn thêm Zalo phải xác định hostname API thực tế và kiểm tra dịch vụ; không đưa IP endpoint/probe/mạng private vào WARP_LIST.
- Watchdog đo mỗi 10 giây, timeout 2 giây; lúc khởi động còn có startup delay của Netwatch theo phiên bản. Khi canary down, bỏ mark WARP, đóng các kết nối WARP cũ để phiên mới đi WAN theo cấu hình nền. Nếu ISP vẫn chặn Telegram, fallback WAN không bảo đảm gửi được cảnh báo.
- Khi canary up, rule được bật lại. Phiên đang đi WAN vẫn giữ tới khi ứng dụng kết nối lại. Không xóa toàn bộ connection tracking của router để ép chuyển tuyến.

## 9. Thêm đích và gỡ bỏ

Thêm domain cụ thể nếu thật sự cần:

```routeros
/ip firewall address-list add list=WARP_LIST address=tenmien.com
```

Domain không bao gồm mọi subdomain. CDN dùng IP chung có thể làm dịch vụ khác cùng IP đi tunnel; client dùng DoH có thể phân giải IP khác router. Kiểm tra counter/địa chỉ đích thực tế, không chỉ tên website.

### Định tuyến toàn bộ một VLAN qua WARP

Nếu muốn toàn bộ lưu lượng Internet của một VLAN đi qua WARP thay vì chỉ các domain chọn lọc, thêm rule Mangle sau (thay `VLAN_10` bằng tên interface VLAN của bạn):

```routeros
/ip firewall mangle
add chain=prerouting in-interface=VLAN_10 dst-address-type=!local connection-state=new connection-mark=no-mark action=mark-connection new-connection-mark=warp-conn passthrough=yes place-before=[find where comment="WARP LAN Mark-Conn"] comment="WARP VLAN 10 Mark-Conn"
```

- **Tự động failover:** Tận dụng rule `WARP LAN Mark-Route` sẵn có; khi Watchdog phát hiện WARP down sẽ tự động tạm tắt rule này để VLAN quay về dùng WAN thường và tự bật lại khi tunnel phục hồi.
- **Không kẹt mạng nội bộ:** Điều kiện `dst-address-type=!local` bảo đảm thiết bị trong VLAN vẫn truy vấn được DNS và gateway nội bộ của router.

Khi gỡ, có thể import file `mikrotik_warp_remove.rsc` trong gói đã tải hoặc copy khối lệnh sau chạy trong Terminal để gỡ sạch toàn bộ cấu hình WARP (dừng watchdog trước, không gỡ điều kiện FastTrack `connection-mark=no-mark` mà PCC cần):

```routeros
{
:do { /tool netwatch remove [find comment="WARP-Watchdog"] } on-error={}
:do { /queue tree remove [find name="WARP Download"] } on-error={}
:do { /queue type remove [find name="warp-fq-codel"] } on-error={}
:do { /ip firewall connection remove [find where connection-mark=warp-conn] } on-error={}
:do { /ip firewall filter remove [find comment~"WARP"] } on-error={}
:do { /interface list member remove [find interface=wg-warp] } on-error={}
:do { /ip firewall mangle remove [find comment~"WARP"] } on-error={}
:do { /ip firewall nat remove [find comment~"WARP"] } on-error={}
:do { /ip route remove [find comment~"WARP"] } on-error={}
:do { /ip route remove [find routing-table=to-warp] } on-error={}
:do { /routing table remove [find name=to-warp] } on-error={}
:do {
  :local alItems [/ip firewall address-list find where list=WARP_LIST]
  :while ([:len $alItems] > 0) do={
    :foreach i in=$alItems do={
      :do { /ip firewall address-list remove $i } on-error={}
    }
    :set alItems [/ip firewall address-list find where list=WARP_LIST]
  }
} on-error={}
:do { /ip address remove [find interface=wg-warp] } on-error={}
:do { /interface wireguard peers remove [find interface=wg-warp] } on-error={}
:do { /interface wireguard remove [find name=wg-warp] } on-error={}
:do { /tool netwatch remove [find comment~"WARP"] } on-error={}
# Keep connection-mark=no-mark on FastTrack: PCC also depends on this guard.
:log info "=== CLOUDFLARE WARP CONFIGURATION REMOVED SUCCESSFULLY ==="
}
```

Sau gỡ: kiểm tra không còn `wg-warp`, route `to-warp`, watchdog WARP; web thường và từng WAN vẫn chạy. Bài test mất tunnel và rollback chi tiết nằm trong [kiểm thử hệ thống](kiem-thu.md).


## 10. QoS download WARP sau giải mã

Trang tạo WARP và hai command local có tùy chọn **Giới hạn download WARP (Mbps)**. `0` tắt; số nguyên `1–10000` bật queue FQ-CoDel tên `WARP Download`. Mức nhập là mức giới hạn thực, không tự nhân 95%. Đo tốc độ WARP ổn định trước rồi chọn thấp hơn khoảng 5–10%; không lấy tổng tốc độ 4 WAN làm tốc độ một tunnel.

Ví dụ chuyển profile sẵn có với giới hạn 80 Mbps:

```bash
python3 warp_config.py /duong/dan/profile.conf /duong/dan/mikrotik_warp_generated.rsc --download-mbps 80
```

Bộ sinh đặt packet mark `warp-download` ở forward, chỉ gói từ `wg-warp` ra interface list `LAN`; queue parent `global` xử lý tải xuống đã giải mã. Không đưa tunnel vào WAN list, không sửa mark `download-wanN`, không bật/tắt FastTrack toàn router. Traffic đã mang connection-mark WARP phải được loại khỏi FastTrack như cấu hình nền yêu cầu.

Đây là giới hạn download riêng cho tunnel, **không phải ngân sách tổng chung WARP + WAN thường**. Queue WARP không biết tunnel đang chạy trên WAN vật lý nào; không tự đổi mức khi failover sang ISP chậm hơn. Sau đổi ISP, đo lại và chỉnh mức phù hợp đường chậm nhất nếu cần. Upload vẫn do cấu hình WAN hiện có xử lý lớp ngoài; không có giới hạn upload WARP riêng. PCQ target LAN chính vẫn có thể giới hạn thêm, vì vậy kết quả đo chịu cả hai lớp queue. VLAN chỉ được queue WARP bắt khi thuộc LAN list.

Các tên `WARP Download`, `warp-fq-codel`, comment `WARP QoS` thuộc bộ cài. Không tái dùng queue type này trong queue tùy chỉnh: cài lại/gỡ WARP sẽ xóa nó. Cài lại với mức `0` cũng gỡ queue WARP cũ. Nếu muốn chỉnh mức trên router đã cài queue, không cần tạo tài khoản lại:

```routeros
/queue tree set [find where name="WARP Download"] max-limit=80M
```

Chỉ chạy sau khi xác nhận queue tồn tại; thay 80M bằng mức đã đo. Nếu trước đó chưa bật QoS, tạo lại RSC từ profile giữ riêng hoặc dùng cấu hình còn trong phiên web; đọc phạm vi cleanup trước import. Không đăng ký tài khoản mới chỉ để đổi mức queue.

Xem [bài test QoS](kiem-thu.md) và [chẩn đoán counter](chan-doan.md). Nền tảng queue/packet mark theo [MikroTik Queues](https://help.mikrotik.com/docs/spaces/ROS/pages/328088/Queues). Chưa có phép đo router thật trong bản phát hành này.
