diff --git a/docs/document/level-2/README.md b/docs/document/level-2/README.md index ce202f0af..a55b0c414 100644 --- a/docs/document/level-2/README.md +++ b/docs/document/level-2/README.md @@ -1,23 +1,19 @@ # 进阶文档 -**这个章节包含进阶级的Xray使用心得分享, 如果您已经熟悉Xray, 那么这里的经验可以让您更加发挥Xray的威力** - - +**这个章节包含进阶级的 Xray 使用心得分享, 如果您已经熟悉 Xray, 那么这里的经验可以让您更加发挥 Xray 的威力** [透明代理入门](./transparent_proxy/transparent_proxy.md) by a [@kirin](https://github.com/kirin10000) -透明代理(TProxy)的入门篇章。 +透明代理的入门篇章。 [透明代理(TProxy)配置教程 ](./tproxy.md) by a [@BioniCosmos](https://github.com/BioniCosmos) -基于Xray的透明代理(TProxy)配置完整教程。 +基于 Xray 的透明代理(TProxy)配置完整教程。 +[[透明代理]通过 gid 规避 Xray 流量](./iptables_gid.md) by a [@kirin](https://github.com/kirin10000) -[[透明代理]通过gid规避Xray流量](./iptables_gid.md) by a [@kirin](https://github.com/kirin10000) +在 iptables/nftables 实现的透明代理中,一种新的规避 Xray 流量的方式。 -在iptables/nftables实现的透明代理中,一种新的规避Xray流量的方式。 +[通过 Xray 将特定的流量指向特定出口,实现全局路由“分流”](./redirect.md) by a [@Zzz3m](https://github.com/Zzz3m) - -[通过Xray将特定的流量指向特定出口,实现全局路由“分流”](./redirect.md) by a [@Zzz3m](https://github.com/Zzz3m) - -将Xray玩出花:基于 fwmark 或 sendThrough 方式实现“分流”。 +将 Xray 玩出花:基于 fwmark 或 sendThrough 方式实现“分流”。 diff --git a/docs/document/level-2/iptables_gid.md b/docs/document/level-2/iptables_gid.md index ffb83d6fc..2e459821a 100644 --- a/docs/document/level-2/iptables_gid.md +++ b/docs/document/level-2/iptables_gid.md @@ -1,74 +1,98 @@ -# 透明代理通过gid规避Xray流量 +# 透明代理通过 gid 规避 Xray 流量 -在现有的iptables透明代理白话文(**[新 V2Ray 白话文指南-透明代理](https://guide.v2fly.org/app/transparent_proxy.html)** 、 **[新 V2Ray 白话文指南-透明代理(TPROXY)](https://guide.v2fly.org/app/tproxy.html)** 、 **[透明代理(TProxy)配置教程](./tproxy)**)教程中,对Xray流量的规避处理是打mark实现的。即对Xray出站流量打mark,通过设置iptables规则对对应mark的流量直连,来规避Xray流量,防止回环。 +在现有的 iptables 透明代理白话文(**[新 V2Ray 白话文指南-透明代理](https://guide.v2fly.org/app/transparent_proxy.html)** 、 **[新 V2Ray 白话文指南-透明代理(TPROXY)](https://guide.v2fly.org/app/tproxy.html)** 、 **[透明代理(TProxy)配置教程](./tproxy)**)教程中,对 Xray 流量的规避处理是打 mark 实现的。即对 Xray 出站流量打 mark,通过设置 iptables 规则对对应 mark 的流量直连,来规避 Xray 流量,防止回环。 这么做有以下几个问题: -1. **[莫名流量进入PREROUTING链](https://github.com/v2ray/v2ray-core/issues/2621)** +1. **[莫名流量进入 PREROUTING 链](https://github.com/v2ray/v2ray-core/issues/2621)** -2. 安卓系统有自己的mark机制,该方案在安卓上不可用 +2. 安卓系统有自己的 mark 机制,该方案在安卓上不可用 + +本教程的方案不需要设置 mark,理论性能更高,同时也不存在上述问题。 -本教程的方案不需要设置mark,理论性能更高,同时也不存在上述问题。 ## 思路 -tproxy流量只能被root权限用户(uid==0)或其他有CAP_NET_ADMIN权限的用户接收。 -iptables规则可以通过uid(用户id)和gid(用户组id)分流。 +tproxy 流量只能被 root 权限用户(uid==0)或其他有 CAP_NET_ADMIN 权限的用户接收。 -让Xray运行在一个uid==0但gid!=0的用户上,设置iptables规则不代理该gid的流量来规避Xray流量。 +iptables 规则可以通过 uid(用户 id)和 gid(用户组 id)分流。 + +让 Xray 运行在一个 uid==0 但 gid!=0 的用户上,设置 iptables 规则不代理该 gid 的流量来规避 Xray 流量。 ## 配置过程 + ### 1. 前期准备 + **安卓系统** -1. 系统已root +1. 系统已 root 2. 安装 **[busybox](https://play.google.com/store/apps/details?id=stericson.busybox)** -3. 有一个可以执行命令的终端,可以使用adb shell,termux等。 +3. 有一个可以执行命令的终端,可以使用 adb shell,termux 等。 -**其它Linux系统** +**其它 Linux 系统** -需要依赖sudo,iptables的tproxy模块和extra模块。 +需要依赖 sudo,iptables 的 tproxy 模块和 extra 模块。 + +一般系统都有自带,openwrt 运行: -一般系统都有自带,openwrt运行: ```bash opkg install sudo iptables-mod-tproxy iptables-mod-extra ``` -另附上一些openwrt常用的依赖,缺少可能导致Xray无法运行 + +另附上一些 openwrt 常用的依赖,缺少可能导致 Xray 无法运行 + ```bash opkg install libopenssl ca-certificates ``` + ### 2. 添加用户(安卓用户请忽略) -安卓系统不支持/etc/passwd文件来管理用户,请忽略,直接下一步。 + +安卓系统不支持/etc/passwd 文件来管理用户,请忽略,直接下一步。 + ```bash grep -qw xray_tproxy /etc/passwd || echo "xray_tproxy:x:0:23333:::" >> /etc/passwd ``` -其中xray_tproxy是用户名,0是uid,23333是gid,用户名和gid可以自己定,uid必须为0。 + +其中 xray_tproxy 是用户名,0 是 uid,23333 是 gid,用户名和 gid 可以自己定,uid 必须为 0。 检查用户是否添加成功,运行 + ```bash sudo -u xray_tproxy id ``` -显示的结果应该是uid为0,gid为23333 -### 3. 配置运行Xray,配置iptables规则 -在现有的iptables透明代理白话文(**[新 V2Ray 白话文指南-透明代理](https://guide.v2fly.org/app/transparent_proxy.html)** 、 **[新 V2Ray 白话文指南-透明代理(TPROXY)](https://guide.v2fly.org/app/tproxy.html)** 、 **[透明代理(TProxy)配置教程](./tproxy)**)教程的基础上修改: -1. 修改json配置文件,删除mark相关内容 +显示的结果应该是 uid 为 0,gid 为 23333 -2. 修改iptables规则,删除mark相关内容,并在OUTPUT链应用规则处添加选项"-m owner ! --gid-owner 23333"。 +### 3. 配置运行 Xray,配置 iptables 规则 + +在现有的 iptables 透明代理白话文(**[新 V2Ray 白话文指南-透明代理](https://guide.v2fly.org/app/transparent_proxy.html)** 、 **[新 V2Ray 白话文指南-透明代理(TPROXY)](https://guide.v2fly.org/app/tproxy.html)** 、 **[透明代理(TProxy)配置教程](./tproxy)**)教程的基础上修改: + +1. 修改 json 配置文件,删除 mark 相关内容 + +2. 修改 iptables 规则,删除 mark 相关内容,并在 OUTPUT 链应用规则处添加选项"-m owner ! --gid-owner 23333"。 如: + ```bash iptables -t mangle -A OUTPUT -j XRAY_SELF ``` + 改为 + ```bash iptables -t mangle -A OUTPUT -m owner ! --gid-owner 23333 -j XRAY_SELF ``` -3. 修改运行Xray的方式,使其运行在uid为0,gid为23333的用户上,参考[这里](#3-配置最大文件大开数运行xray客户端)。 -## 下面提供一个实现tproxy全局代理的完整配置过程 + +3. 修改运行 Xray 的方式,使其运行在 uid 为 0,gid 为 23333 的用户上,参考[这里](#3-配置最大文件大开数运行xray客户端)。 + +## 下面提供一个实现 tproxy 全局代理的完整配置过程 + ### 1. 完成 **[前期准备](#1-前期准备)** 和 **[添加用户](#2-添加用户安卓用户请忽略)** -### 2. 准备Xray配置文件 -配置Xray任意门监听12345,开启followRedirect和tproxy,不需要设置sniffing: + +### 2. 准备 Xray 配置文件 + +配置 Xray 任意门监听 12345,开启 followRedirect 和 tproxy,不需要设置 sniffing: + ```json { "inbounds": [ @@ -88,44 +112,54 @@ iptables -t mangle -A OUTPUT -m owner ! --gid-owner 23333 -j XRAY_SELF ], "outbounds": [ { - 你的服务器配置 + 你的服务器配置 } ] } ``` -### 3. 配置最大文件大开数&运行Xray客户端 + +### 3. 配置最大文件大开数&运行 Xray 客户端 + 关于最大文件大开数问题见: **[too many open files 问题](https://guide.v2fly.org/app/tproxy.html#解决-too-many-open-files-问题)** -目前Xray服务端使用官方脚本安装的已经自动配置了最大文件大开数,无需再修改。 +目前 Xray 服务端使用官方脚本安装的已经自动配置了最大文件大开数,无需再修改。 **安卓系统** + ```bash ulimit -SHn 1000000 setuidgid 0:23333 "运行Xray的命令"& ``` -**其它Linux系统** + +**其它 Linux 系统** + ```bash ulimit -SHn 1000000 sudo -u xray_tproxy "运行Xray的命令"& ``` -*第一条命令:* -改变最大打开文件数,只对当前终端有效,每次启动Xray前都要运行,该命令是设置客户端的最大文件大开数 +_第一条命令:_ -*第二条命令:* +改变最大打开文件数,只对当前终端有效,每次启动 Xray 前都要运行,该命令是设置客户端的最大文件大开数 -以uid为0,gid不为0的用户来运行Xray客户端,后面加&代表放在后台运行 +_第二条命令:_ + +以 uid 为 0,gid 不为 0 的用户来运行 Xray 客户端,后面加&代表放在后台运行 **检查最大文件大开数是否设置成功** + ```bash cat /proc/Xray的pid/limits ``` -找到max open files一项,应该是你设置的数值。pid的获取方法为运行`ps`或`ps -aux`或`ps -a` + +找到 max open files 一项,应该是你设置的数值。pid 的获取方法为运行`ps`或`ps -aux`或`ps -a` 服务端和客户端都要检查 -### 4. 设置iptables规则 -**代理ipv4** +### 4. 设置 iptables 规则 + +**代理 ipv4** + ```bash ip rule add fwmark 1 table 100 ip route add local 0.0.0.0/0 dev lo table 100 @@ -137,9 +171,9 @@ iptables -t mangle -A XRAY -d 网关所在ipv4网段1 -j RETURN iptables -t mangle -A XRAY -d 网关所在ipv4网段2 -j RETURN ... -# 组播地址直连 -iptables -t mangle -A XRAY -d 224.0.0.0/4 -j RETURN -iptables -t mangle -A XRAY -d 255.255.255.255/32 -j RETURN +# 组播地址/E类地址/广播地址直连 +iptables -t mangle -A XRAY -d 224.0.0.0/3 -j RETURN + #如果网关作为主路由,则加上这一句,见:https://xtls.github.io/documents/level-2/transparent_proxy/transparent_proxy.md#iptables透明代理的其它注意事项 #网关LAN_IPv4地址段,运行命令"ip address | grep -w "inet" | awk '{print $2}'"获得,是其中的一个 @@ -158,14 +192,14 @@ iptables -t mangle -A XRAY_MASK -m owner --gid-owner 23333 -j RETURN iptables -t mangle -A XRAY_MASK -d 网关所在ipv4网段1 -j RETURN iptables -t mangle -A XRAY_MASK -d 网关所在ipv4网段2 -j RETURN ... -iptables -t mangle -A XRAY_MASK -d 224.0.0.0/4 -j RETURN -iptables -t mangle -A XRAY_MASK -d 255.255.255.255/32 -j RETURN +iptables -t mangle -A XRAY_MASK -d 224.0.0.0/3 -j RETURN iptables -t mangle -A XRAY_MASK -j MARK --set-mark 1 iptables -t mangle -A OUTPUT -p tcp -j XRAY_MASK iptables -t mangle -A OUTPUT -p udp -j XRAY_MASK ``` -**代理ipv6(可选)** +**代理 ipv6(可选)** + ```bash ip -6 rule add fwmark 1 table 106 ip -6 route add local ::/0 dev lo table 106 diff --git a/docs/document/level-2/transparent_proxy/transparent_proxy.md b/docs/document/level-2/transparent_proxy/transparent_proxy.md index 997027748..2d5d06241 100644 --- a/docs/document/level-2/transparent_proxy/transparent_proxy.md +++ b/docs/document/level-2/transparent_proxy/transparent_proxy.md @@ -1,15 +1,18 @@ -# 透明代理入门 +# 透明代理入门 ## 什么是透明代理 -透明代理简单地说就是不让被代理的设备感觉到自己被代理了。简单地说就是,被代理的设备上不需要运行任何代理软件(比如Xray、V2RayNG等),当你连接上网络时,你的设备已经被代理了。 + +透明代理简单地说就是不让被代理的设备感觉到自己被代理了。简单地说就是,被代理的设备上不需要运行任何代理软件(比如 Xray、V2RayNG 等),当你连接上网络时,你的设备已经被代理了。 这也意味着,代理的软件运行在别的地方,比如运行在路由器中,通过路由器上网的设备就自动被代理了。 + ## 透明代理的实现 + 透明代理的实现目前主要有两种方式: ### tun2socks -可用Windows/Linux(包括安卓)实现。因为实现过程比较简单,很少有教程,我这里简单描述一下。 +可用 Windows/Linux(包括安卓)实现。因为实现过程比较简单,很少有教程,我这里简单描述一下。 **Windows** @@ -23,22 +26,23 @@ **Android** -1. 配置连接V2RayNG +1. 配置连接 V2RayNG 2. 开启热点 -3. 热点设置 -> 允许热点使用VPN(部分安卓系统可能没有这个选项) +3. 热点设置 -> 允许热点使用 VPN(部分安卓系统可能没有这个选项) ### iptables/nftables -iptables与nftables实现透明代理的原理相同,下文统一使用iptables。 +iptables 与 nftables 实现透明代理的原理相同,下文统一使用 iptables。 -基于iptables的透明代理实现只能用于Linux系统(包括openwrt/安卓)。由于其比tun2socks更高效率以及适合在路由器中配置而广泛使用。 +基于 iptables 的透明代理实现只能用于 Linux 系统(包括 openwrt/安卓)。由于其比 tun2socks 更高效率以及适合在路由器中配置而广泛使用。 -现存的三篇白话文透明代理教程其实讲的都是基于这种方案的透明代理实现,它们是: **[新 V2Ray 白话文指南-透明代理](https://guide.v2fly.org/app/transparent_proxy.html)** 、 **[新 V2Ray 白话文指南-透明代理(TPROXY)](https://guide.v2fly.org/app/tproxy.html)** 、 **[透明代理(TProxy)配置教程](../tproxy.md)** 。其中第一篇是基于iptables-redirect模式,已经过时了,不建议使用,仅供参考。第二篇和第三篇讲的都是基于iptables-tproxy模式的透明代理实现。 +现存的三篇白话文透明代理教程其实讲的都是基于这种方案的透明代理实现,它们是: **[新 V2Ray 白话文指南-透明代理](https://guide.v2fly.org/app/transparent_proxy.html)** 、 **[新 V2Ray 白话文指南-透明代理(TPROXY)](https://guide.v2fly.org/app/tproxy.html)** 、 **[透明代理(TProxy)配置教程](../tproxy.md)** 。其中第一篇是基于 iptables-redirect 模式,已经过时了,不建议使用,仅供参考。第二篇和第三篇讲的都是基于 iptables-tproxy 模式的透明代理实现。 -## iptables实现透明代理原理 -Linux使用`Netfilter`来管理网络,`Netfilter`模型如下: +## iptables 实现透明代理原理 + +Linux 使用`Netfilter`来管理网络,`Netfilter`模型如下: ![Netfilter](./netfilter.png) @@ -48,7 +52,7 @@ Linux使用`Netfilter`来管理网络,`Netfilter`模型如下: `PREROUTING链->FORWARD链->POSTINGROUTING链` -局域网设备访问路由器的流量(如登陆路由器web管理界面/ssh连接路由器/访问路由器的dns服务器等)方向: +局域网设备访问路由器的流量(如登陆路由器 web 管理界面/ssh 连接路由器/访问路由器的 dns 服务器等)方向: `PREROUTING链->INPUT链->网关本机` @@ -56,7 +60,8 @@ Linux使用`Netfilter`来管理网络,`Netfilter`模型如下: `网关本机->OUTPUT链->POSTINGROUTING链` -**通过使用iptables操控`PREROUTING链`和`OUTPUT链`的流量走向,转发到Xray,就可以代理局域网设备和网关本机。** +**通过使用 iptables 操控`PREROUTING链`和`OUTPUT链`的流量走向,转发到 Xray,就可以代理局域网设备和网关本机。** + ## 透明代理难在哪里 透明代理的难点就在于路由,所谓路由,就是区分哪些流量是直连的,哪些该被代理,所以我个人认为叫做**分流**更加合适。 @@ -65,31 +70,36 @@ Linux使用`Netfilter`来管理网络,`Netfilter`模型如下: 1. 代理全部请求 -2. 本地局域网IP/组播IP请求直连,其它请求代理 +2. 本地局域网 IP/组播 IP 请求直连,其它请求代理 -3. 在2的基础上直连Xray发起的连接请求 +3. 在 2 的基础上直连 Xray 发起的连接请求 -4. 在3的基础上直连指向中国大陆IP的连接请求,并对国内外域名选择国内外DNS服务器解析。 +4. 在 3 的基础上直连指向中国大陆 IP 的连接请求,并对国内外域名选择国内外 DNS 服务器解析。 上面说的三篇教程,都是在第四阶段。所以新手直接阅读可能显得有点难懂。 -## 从零开始一步步实现基于iptables-tproxy的透明代理 +## 从零开始一步步实现基于 iptables-tproxy 的透明代理 + ### 在开始之前,你需要有一定的基础知识: -1. 大概知道什么是TCP/IP协议、域名和DNS服务器 -2. 知道什么是WAN口,LAN口,LAN_IP,WAN_IP以及DHCP服务器。对于旁路由,只有一个网口,这里称其为LAN口 +1. 大概知道什么是 TCP/IP 协议、域名和 DNS 服务器 -3. 对Linux系统有最基础的了解(知道怎么运行命令) +2. 知道什么是 WAN 口,LAN 口,LAN_IP,WAN_IP 以及 DHCP 服务器。对于旁路由,只有一个网口,这里称其为 LAN 口 + +3. 对 Linux 系统有最基础的了解(知道怎么运行命令) + +4. 能够手写客户端 json 文件配置,至少要能看懂 -4. 能够手写客户端json文件配置,至少要能看懂 ### 前期准备工作 -**1. 准备一个运行Linux系统的网关** -比如,刷了OpenWRT的路由器 +**1. 准备一个运行 Linux 系统的网关** -**2. 在网关(路由器)准备好Xray可执行文件以及配置文件** +比如,刷了 OpenWRT 的路由器 + +**2. 在网关(路由器)准备好 Xray 可执行文件以及配置文件** + +配置文件监听 12345 端口,开启 tproxy: -配置文件监听12345端口,开启tproxy: ```json { "log": { @@ -112,16 +122,20 @@ Linux使用`Netfilter`来管理网络,`Netfilter`模型如下: ], "outbounds": [ { - 你的服务器配置 + 你的服务器配置 } ] } ``` -我们由易到难,不写routing,只写一个inbound一个outbound。 -### 首先,我们先试试做到第一阶段 -将所有`PREROUTING链`的流量,都转发到Xray中。 -运行Xray,执行以下指令: +我们由易到难,不写 routing,只写一个 inbound 一个 outbound。 + +### 首先,我们先试试做到第一阶段 + +将所有`PREROUTING链`的流量,都转发到 Xray 中。 + +运行 Xray,执行以下指令: + ```bash ip rule add fwmark 1 table 100 ip route add local 0.0.0.0/0 dev lo table 100 @@ -130,11 +144,13 @@ iptables -t mangle -A XRAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1 iptables -t mangle -A XRAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1 iptables -t mangle -A PREROUTING -j XRAY ``` -当你输入完之后,如果你是使用ssh连接到网关上的,你会发现ssh的连接断开了(不用紧张,断电重启即可恢复),并且透明代理无法上网;如果你是的网关是虚拟机,你会发现网关本身也无法上网,并且Xray日志access_log中出现许多源地址为目标地址,目标地址为WAN_IP的请求。 -理论上网关本机访问公网只会经过`OUTPUT链`和`POSTROUTING链`,为什么操控`PREROUTING链`会导致网关无法上网呢?这是因为网络通讯往往是双向的,虽然网关访问公网IP不需要经过`PREROUTING链`,但被访问的服务器向网关返回信息时要经过`PREROUTING链`,且这部分被转发到Xray了,因此出现了日志中的反向请求。 +当你输入完之后,如果你是使用 ssh 连接到网关上的,你会发现 ssh 的连接断开了(不用紧张,断电重启即可恢复),并且透明代理无法上网;如果你是的网关是虚拟机,你会发现网关本身也无法上网,并且 Xray 日志 access_log 中出现许多源地址为目标地址,目标地址为 WAN_IP 的请求。 + +理论上网关本机访问公网只会经过`OUTPUT链`和`POSTROUTING链`,为什么操控`PREROUTING链`会导致网关无法上网呢?这是因为网络通讯往往是双向的,虽然网关访问公网 IP 不需要经过`PREROUTING链`,但被访问的服务器向网关返回信息时要经过`PREROUTING链`,且这部分被转发到 Xray 了,因此出现了日志中的反向请求。 + +我们修改一下规则,源 IP 不是来自局域网的则返回。重启网关,运行 Xray,执行以下指令: -我们修改一下规则,源IP不是来自局域网的则返回。重启网关,运行Xray,执行以下指令: ```bash ip rule add fwmark 1 table 100 ip route add local 0.0.0.0/0 dev lo table 100 @@ -145,11 +161,15 @@ iptables -t mangle -A XRAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1 iptables -t mangle -A XRAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1 iptables -t mangle -A PREROUTING -j XRAY ``` -然后你会发现,虽然ssh连接断开了,但是透明代理已经可用了。只要我们修改系统dns为公共dns,就能正常上网了(因为现在网关访问不了,所以dns设置为网关是不行的)。 -至此,第一阶段就完成了。之所以无法访问网关,是因为代理规则代理了全部流量,包括访问网关的流量。试想在VPS上访问你本地的网关,肯定是访问不了的,所以我们要对这部分流量直连,请看第二阶段: +然后你会发现,虽然 ssh 连接断开了,但是透明代理已经可用了。只要我们修改系统 dns 为公共 dns,就能正常上网了(因为现在网关访问不了,所以 dns 设置为网关是不行的)。 + +至此,第一阶段就完成了。之所以无法访问网关,是因为代理规则代理了全部流量,包括访问网关的流量。试想在 VPS 上访问你本地的网关,肯定是访问不了的,所以我们要对这部分流量直连,请看第二阶段: + ### 第二阶段 -重启网关,运行Xray,执行以下指令: + +重启网关,运行 Xray,执行以下指令: + ```bash ip rule add fwmark 1 table 100 ip route add local 0.0.0.0/0 dev lo table 100 @@ -161,33 +181,34 @@ iptables -t mangle -A XRAY -d 网关所在网段1 -j RETURN iptables -t mangle -A XRAY -d 网关所在网段2 -j RETURN ... -# 目标地址为组播IP的请求直连 -iptables -t mangle -A XRAY -d 224.0.0.0/4 -j RETURN -iptables -t mangle -A XRAY -d 255.255.255.255/32 -j RETURN +# 目标地址为组播IP/E类地址/广播IP的请求直连 +iptables -t mangle -A XRAY -d 224.0.0.0/3 -j RETURN iptables -t mangle -A XRAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1 iptables -t mangle -A XRAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1 iptables -t mangle -A PREROUTING -j XRAY ``` + 使用这条规则后,上一条规则`iptables -t mangle -A XRAY ! -s 网关LAN_IP地址段 -j RETURN`便成为了多余规则,可以删去。 -至此,第二阶段完成。网关已经可以访问,ssh不会断开。 +至此,第二阶段完成。网关已经可以访问,ssh 不会断开。 ### 第三阶段 -我们平时用的DNS一般来自路由器,但这个iptables规则只代理了局域网中的设备,却没有代理网关本机,这样返回的DNS查询结果可能是错误的或者污染的。 +我们平时用的 DNS 一般来自路由器,但这个 iptables 规则只代理了局域网中的设备,却没有代理网关本机,这样返回的 DNS 查询结果可能是错误的或者污染的。 -iptables-tproxy不支持对`OUTPUT链`操作,但是`Netfilter`有个特性,在`OUTPUT链`给包打标记为`1`后相应的包会重路由到`PREROUTING链`上。所以我们就给网关本机需要代理的请求在`OUTPUT链`上标记`1`即可。 +iptables-tproxy 不支持对`OUTPUT链`操作,但是`Netfilter`有个特性,在`OUTPUT链`给包打标记为`1`后相应的包会重路由到`PREROUTING链`上。所以我们就给网关本机需要代理的请求在`OUTPUT链`上标记`1`即可。 -如果要代理网关本机发出的的全部请求,就会引入一个问题,Xray运行在网关,Xray向代理服务端发送请求,这个请求又被代理了,就形成了回环。 +如果要代理网关本机发出的的全部请求,就会引入一个问题,Xray 运行在网关,Xray 向代理服务端发送请求,这个请求又被代理了,就形成了回环。 -因此要代理网关本机,就要避免回环发生,即代理规则中规避Xray请求的流量。 +因此要代理网关本机,就要避免回环发生,即代理规则中规避 Xray 请求的流量。 **常见的方法有三种:** -1. 直连目标地址为VPS的流量 +1. 直连目标地址为 VPS 的流量 + +重启网关,运行 Xray,执行以下指令: -重启网关,运行Xray,执行以下指令: ```bash #代理局域网设备 #继承上一个阶段的成果 @@ -197,8 +218,7 @@ iptables -t mangle -N XRAY iptables -t mangle -A XRAY -d 网关所在网段1 -j RETURN iptables -t mangle -A XRAY -d 网关所在网段2 -j RETURN ... -iptables -t mangle -A XRAY -d 224.0.0.0/4 -j RETURN -iptables -t mangle -A XRAY -d 255.255.255.255/32 -j RETURN +iptables -t mangle -A XRAY -d 224.0.0.0/3 -j RETURN iptables -t mangle -A XRAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1 iptables -t mangle -A XRAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1 iptables -t mangle -A PREROUTING -j XRAY @@ -208,41 +228,46 @@ iptables -t mangle -N XRAY_MASK iptables -t mangle -A XRAY_MASK -d 网关所在网段1 -j RETURN iptables -t mangle -A XRAY_MASK -d 网关所在网段2 -j RETURN ... -iptables -t mangle -A XRAY_MASK -d 224.0.0.0/4 -j RETURN -iptables -t mangle -A XRAY_MASK -d 255.255.255.255/32 -j RETURN +iptables -t mangle -A XRAY_MASK -d 224.0.0.0/3 -j RETURN iptables -t mangle -A XRAY_MASK -d VPS公网ip/32 -j RETURN iptables -t mangle -A XRAY_MASK -j MARK --set-mark 1 iptables -t mangle -A OUTPUT -p tcp -j XRAY_MASK iptables -t mangle -A OUTPUT -p udp -j XRAY_MASK ``` -但是这么配置有个缺点,如果使用CDN或者VPS很多的话,就不好写规则了。 -2. 通过mark规避 +但是这么配置有个缺点,如果使用 CDN 或者 VPS 很多的话,就不好写规则了。 + +2. 通过 mark 规避 三个白话文教程都是使用这种方法规避,自行参考,这里不再赘述。 -3. 通过gid规避(推荐) +3. 通过 gid 规避(推荐) -参考 **[[透明代理]通过gid规避Xray流量](../iptables_gid.md)** +参考 **[[透明代理]通过 gid 规避 Xray 流量](../iptables_gid.md)** -这样就完成了第三阶段的代理,也就是平时说的全局代理。但是记得把网关的DNS服务器设置为国外的DNS服务器,否则可能依然返回被污染的结果。 +这样就完成了第三阶段的代理,也就是平时说的全局代理。但是记得把网关的 DNS 服务器设置为国外的 DNS 服务器,否则可能依然返回被污染的结果。 ### 第四阶段 + 其实,并不是所有人都需要实现第四阶段。全局代理对于大部分情况已经适用。 -特别是对于旁路由而言。需要代理时,将网关调成旁路由的IP,不需要代理时,将网关换回主路由IP。 +特别是对于旁路由而言。需要代理时,将网关调成旁路由的 IP,不需要代理时,将网关换回主路由 IP。 至于第四阶段的具体实现,那三篇白话文教程讲的都是。在理解了上面的内容后,再去看那三篇白话文教程,就比较容易理解了。 -### 代理ipv6 -上面的规则只对ipv4生效,如果还想要代理ipv6请求,则使用ip6tables命令,用法与iptables基本相同。参考 **[[透明代理]通过gid规避Xray流量#4-设置iptables规则](../iptables_gid#4-设置iptables规则.md)** -# iptables透明代理的其它注意事项 -1. 如果作为代理的网关作为主路由,要在`PREROUTING链`规则中加一条`iptables -t mangle -A XRAY ! -s 网关LAN_IP地址段 -j RETURN`,即在第一阶段使用、第二阶段被删除的指令。如果不写,WAN口中同网段的其它人可以将网关填写成你的WAN_IP,从而蹭你的透明代理用,还可能带来一定的危险性。 -2. **[新 V2Ray 白话文指南-透明代理(TPROXY)#设置网关](https://guide.v2fly.org/app/tproxy.html#设置网关)** 中的第三条说:`手动配置 PC 的网络,将默认网关指向树莓派的地址即 192.168.1.22。此时 PC 应当能正常上网(由于还没设置代理,“正常”是指可以上国内的网站)`。实际上,Ubuntu、CentOS、debian等系统就算开启了IP转发,PC也不能正常上网,这是正常的。事实上只有OpenWRT能做到文中所描述的那样,据 **[@BioniCosmos](https://github.com/BioniCosmos)** 点拨,这是由于一般的Linux系统没有Masquery规则。 +### 代理 ipv6 -3. **[too many open files 问题](https://guide.v2fly.org/app/tproxy.html#解决-too-many-open-files-问题)** ,解决方法见 **[[透明代理]通过gid规避Xray流量-配置最大文件大开数&运行Xray客户端](../iptables_gid#3-配置最大文件大开数运行xray客户端)** +上面的规则只对 ipv4 生效,如果还想要代理 ipv6 请求,则使用 ip6tables 命令,用法与 iptables 基本相同。参考 **[[透明代理]通过 gid 规避 Xray 流量#4-设置 iptables 规则](../iptables_gid#4-设置iptables规则.md)** -4. 关于开启ip_forward,待补充... +# iptables 透明代理的其它注意事项 + +1. 如果作为代理的网关作为主路由,要在`PREROUTING链`规则中加一条`iptables -t mangle -A XRAY ! -s 网关LAN_IP地址段 -j RETURN`,即在第一阶段使用、第二阶段被删除的指令。如果不写,WAN 口中同网段的其它人可以将网关填写成你的 WAN_IP,从而蹭你的透明代理用,还可能带来一定的危险性。 + +2. **[新 V2Ray 白话文指南-透明代理(TPROXY)#设置网关](https://guide.v2fly.org/app/tproxy.html#设置网关)** 中的第三条说:`手动配置 PC 的网络,将默认网关指向树莓派的地址即 192.168.1.22。此时 PC 应当能正常上网(由于还没设置代理,“正常”是指可以上国内的网站)`。实际上,Ubuntu、CentOS、debian 等系统就算开启了 IP 转发,PC 也不能正常上网,这是正常的。事实上只有 OpenWRT 能做到文中所描述的那样,据 **[@BioniCosmos](https://github.com/BioniCosmos)** 点拨,这是由于一般的 Linux 系统没有 Masquery 规则。 + +3. **[too many open files 问题](https://guide.v2fly.org/app/tproxy.html#解决-too-many-open-files-问题)** ,解决方法见 **[[透明代理]通过 gid 规避 Xray 流量-配置最大文件大开数&运行 Xray 客户端](../iptables_gid#3-配置最大文件大开数运行xray客户端)** + +4. 关于开启 ip_forward,待补充... 5. 避免已有连接的包二次通过 TPROXY ,待补充...