diff --git a/docs/issues/easytier.md b/docs/issues/easytier.md index a794873..16a8b93 100644 --- a/docs/issues/easytier.md +++ b/docs/issues/easytier.md @@ -1,35 +1,10 @@ -# easytier 被 transparent OUTPUT 规则截获 +# easytier 连接 peer 超时 -## 现象 +## 问题原因 -开启 `pyxray` transparent redirect 后,`easytier` 持续连接 peer 超时: +`easytier` 使用 `network_mode: host`,它发起的 peer 连接属于宿主机本机流量,会经过 `nat OUTPUT`。 -```text -connecting to peer dst=tcp://117.72.47.28:33010 -connect to peer error ... Timeout -``` - -临时添加绕过规则后立即恢复: - -```sh -sudo iptables -w 2 -t nat -I TP_OUT 1 -p tcp -d 117.72.47.28 --dport 33010 -j RETURN -``` - -## 机理 - -```mermaid -flowchart LR - E[easytier-core
host network + UID 0] --> O[nat OUTPUT] - O --> TPO[TP_OUT] - TPO --> TPR[TP_RULE] - TPR --> R[REDIRECT :52345] - R --> X[Xray transparent inbound] - X --> P[peer 117.72.47.28:33010] -``` - -`easytier` 使用 `network_mode: host`,它发出的 peer TCP 连接属于宿主机本机流量,会进入 `nat OUTPUT`。 - -`pyxray` redirect transparent 会安装: +`pyxray` 开启 transparent redirect 后,会把宿主机本机 TCP 流量转到 Xray transparent inbound: ```sh iptables -t nat -I OUTPUT -p tcp -j TP_OUT @@ -37,43 +12,63 @@ iptables -t nat -A TP_OUT -j TP_RULE iptables -t nat -A TP_RULE -p tcp -j REDIRECT --to-ports 52345 ``` -因此 `easytier -> 117.72.47.28:33010` 被重定向到 `127.0.0.1:52345`,不再按 easytier 预期直连 peer,最终表现为连接超时。 - -## 为什么不用 UID 绕过 - -```mermaid -flowchart TD - R[按 UID 绕过] --> U0{easytier UID} - U0 -->|0/root| Wide[会放过所有 root 本机连接] - U0 -->|非 root| OK[可精确绕过] -``` - -当前 `easytier`、`pyxray`、`xray` 都以 root 运行。按 UID 0 绕过范围过大,不适合作为默认方案。 - -## 推荐修复 - -在 `TP_OUT` 跳转到 `TP_RULE` 前,按目标地址和端口添加 RETURN: +因此 easytier 访问 peer 时,连接会被改写: ```mermaid flowchart LR - E[easytier-core] --> O[nat OUTPUT] + E[easytier-core
tcp://117.72.47.28:33010] --> O[nat OUTPUT] O --> TPO[TP_OUT] - TPO --> B{match tcp
117.72.47.28:33010} - B -->|yes| D[RETURN 直连] - B -->|no| TPR[TP_RULE -> REDIRECT :52345] + TPO --> TPR[TP_RULE] + TPR --> R[REDIRECT :52345] + R --> X[Xray transparent inbound] ``` -配置示例: +结果是 easytier 没有直连到自己的 peer,日志表现为: + +```text +connecting to peer dst=tcp://117.72.47.28:33010 +connect to peer error ... Timeout +``` + +## 解决方案 + +在 UI 的“核心 -> transparent”里添加 OUTPUT 绕过规则,让 easytier peer 连接在进入 `TP_RULE` 前直接 `RETURN`。 + +示例: ```text tcp 117.72.47.28:33010 ``` -也支持网段: +生成后的关键规则: + +```sh +iptables -t nat -A TP_OUT -p tcp -d 117.72.47.28 --dport 33010 -j RETURN +iptables -t nat -A TP_OUT -j TP_RULE +``` + +修复后的流量路径: + +```mermaid +flowchart LR + E[easytier-core
tcp://117.72.47.28:33010] --> O[nat OUTPUT] + O --> TPO[TP_OUT] + TPO --> B{match tcp
117.72.47.28:33010} + B -->|yes| D[RETURN
直连 peer] + B -->|no| TPR[TP_RULE] + TPR --> R[REDIRECT :52345] +``` + +规则格式: ```text +tcp 117.72.47.28:33010 all 192.168.0.0/24 udp 198.51.100.10:3478 ``` -该规则只影响宿主机本机 `OUTPUT`,不改变 Docker 容器透明代理的 `PREROUTING` 行为。 +说明: + +- `redirect` 模式只处理 TCP,因此只生成 TCP 绕过规则。 +- `tproxy` 模式支持 TCP 和 UDP。 +- 规则只作用于宿主机本机 `OUTPUT`,不改变 Docker 容器透明代理的 `PREROUTING` 行为。 diff --git a/pyproject.toml b/pyproject.toml index 5cc38ea..f0cac4a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pyxray" -version = "1.0.2" +version = "1.0.3" description = "A lightweight Linux xray control plane." readme = "README.md" requires-python = ">=3.14"