|
|
@ -32,13 +32,13 @@ XProxy 部署在内网 Linux 主机上,通过 `macvlan` 网络创建独立 MAC |
|
|
|
end |
|
|
|
``` |
|
|
|
|
|
|
|
XProxy 运行以后,内网流量将被收集到代理内核上,支持 `xray` ,`v2ray` ,`sagray` 等多种内核,支持 `Shadowsocks` ,`ShadowsocksR` ,`VMess` ,`VLESS` ,`Trojan` ,`WireGuard` ,`SSH` ,`PingTunnel` 等多种代理协议,支持 `XTLS` ,`WebSocket` ,`QUIC` ,`gRPC` 等多种传输方式。同时,得益于 V2ray 的路由设计,代理的网络流量可被精确地分流,可以依据内网设备、目标地址、访问端口、连接域名、流量类型等多种方式进行路由。 |
|
|
|
XProxy 运行以后,内网流量将被收集到代理内核上,支持 `xray` ,`v2ray` ,`sagray` 等多种内核,支持 `Shadowsocks` ,`ShadowsocksR` ,`VMess` ,`VLESS` ,`Trojan` ,`WireGuard` ,`SSH` ,`PingTunnel` 等多种代理协议,支持 `XTLS` ,`Reality` ,`WebSocket` ,`QUIC` ,`gRPC` 等多种传输方式。同时,得益于 V2ray 的路由设计,代理的网络流量可被精确地分流,可以依据内网设备、目标地址、访问端口、连接域名、流量类型等多种方式进行路由。 |
|
|
|
|
|
|
|
由于 XProxy 与宿主机网络完全解耦,一台主机上可运行多个虚拟网关,它们拥有不同的 MAC 地址,在网络模型上是多台独立的主机;因此各个虚拟网关能负责不同的功能,甚至它们之间还能互为上下级路由的关系,灵活实现多种网络功能。 |
|
|
|
|
|
|
|
## 配置格式 |
|
|
|
|
|
|
|
> XProxy 支持 JSON , YAML 与 TOML 格式的配置文件,其中 `.json` 与 `.toml` 后缀的文件分别以 JSON 与 TOML 格式解析,其余将以 YAML 格式解析 |
|
|
|
> XProxy 支持 JSON 、YAML 与 TOML 格式的配置文件,其中 `.json` 与 `.toml` 后缀的文件分别以 JSON 与 TOML 格式解析,其余将以 YAML 格式解析。 |
|
|
|
|
|
|
|
XProxy 的配置文件包含以下部分: |
|
|
|
|
|
|
@ -91,19 +91,19 @@ proxy: |
|
|
|
- courier.push.apple.com |
|
|
|
``` |
|
|
|
|
|
|
|
> 入站代理中内置 `tproxy4` 与 `tproxy6` 两个接口,分别对应 IPv4 与 IPv6 的透明代理,可作为 `inboundTag` 在路由中引用 |
|
|
|
> 入站代理中内置 `tproxy4` 与 `tproxy6` 两个接口,分别对应 IPv4 与 IPv6 的透明代理,可作为 `inboundTag` 在路由中引用。 |
|
|
|
|
|
|
|
+ `bin` :指定内核名称,默认为 `xray` |
|
|
|
|
|
|
|
> 自 `1.0.2` 起,XProxy 镜像仅自带 `xray` 内核,其他内核需要用户自行添加 |
|
|
|
|
|
|
|
> 例:在 Docker 启动命令中加入 `-v {V2RAY_BIN}:/usr/bin/v2ray` 可以将 `v2ray` 内核添加到容器中,在 `bin` 选项中指定内核名称即可生效,或者使用 `PROXY_BIN=v2ray` 环境变量指定。 |
|
|
|
> 自 `1.0.2` 起,XProxy 镜像仅自带 `xray` 内核,其他内核需要用户自行添加。 |
|
|
|
> |
|
|
|
> 例如在 Docker 启动命令中加入 `-v {V2RAY_BIN}:/usr/bin/v2ray` 可以将 `v2ray` 内核添加到容器中,在 `bin` 选项中指定内核名称即可生效,或者使用 `PROXY_BIN=v2ray` 环境变量指定。 |
|
|
|
|
|
|
|
+ `log` :代理日志级别,可选 `debug` 、`info` 、`warning` 、`error` 、`none` ,默认为 `warning` |
|
|
|
|
|
|
|
+ `http` 与 `socks` :配置 http 与 socks5 入站代理,使用 `key: value` 格式,前者指定入站标志(路由配置中的 inboundTag),后者指定监听端口,默认为空 |
|
|
|
+ `http` 与 `socks` :配置 http 与 socks5 入站代理,使用 `key: value` 格式,前者指定入站标志(路由配置中的 inboundTag),后者指定监听端口,默认为空。 |
|
|
|
|
|
|
|
+ `addon` :自定义入站配置,每一项为单个内核 inbound 接口,具体格式可见[内核文档](https://xtls.github.io/config/inbound.html#inboundobject),默认为空 |
|
|
|
+ `addon` :自定义入站配置,每一项为单个内核 inbound 接口,具体格式可见[内核文档](https://xtls.github.io/config/inbound.html#inboundobject),默认为空。 |
|
|
|
|
|
|
|
+ `sniff` :嗅探选项,用于获取透明代理中的连接域名: |
|
|
|
|
|
|
@ -139,11 +139,11 @@ network: |
|
|
|
- 192.168.2.240/28 |
|
|
|
``` |
|
|
|
|
|
|
|
+ `dev` :指定运行的网卡,一般与物理网卡同名,默认为空 |
|
|
|
+ `dev` :指定运行的网卡,一般与物理网卡同名,默认为空。 |
|
|
|
|
|
|
|
+ `dns` :指定系统默认 DNS 服务器,留空时保持原配置不变,默认为空 |
|
|
|
+ `dns` :指定系统默认 DNS 服务器,留空时保持原配置不变,默认为空。 |
|
|
|
|
|
|
|
+ `ipv4` 与 `ipv6` :指定 IPv4 与 IPv6 的网络信息,其中 `gateway` 为上游网关地址,`address` 为虚拟网关地址(CIDR 格式,包含子网长度),不填写时保持不变,默认为空 |
|
|
|
+ `ipv4` 与 `ipv6` :指定 IPv4 与 IPv6 的网络信息,其中 `gateway` 为上游网关地址,`address` 为虚拟网关地址(CIDR 格式,包含子网长度),不填写时保持不变,默认为空。 |
|
|
|
|
|
|
|
+ `bypass` :绕过代理的目标网段或 IP,默认为空,建议绕过以下5个网段: |
|
|
|
|
|
|
@ -159,7 +159,7 @@ network: |
|
|
|
|
|
|
|
+ `exclude` :不代理的来源网段或 IP |
|
|
|
|
|
|
|
> `bypass` 与 `exclude` 中指定的 IP 或 CIDR,在运行时将不会被 TProxy 捕获,即不进入用户态的代理路由,相当于无损耗的直连 |
|
|
|
> `bypass` 与 `exclude` 中指定的 IP 或 CIDR,在运行时将不会被 TProxy 捕获,即不进入用户态的代理路由,相当于无损耗的直连。 |
|
|
|
|
|
|
|
### 路由资源 |
|
|
|
|
|
|
@ -177,11 +177,11 @@ asset: |
|
|
|
|
|
|
|
+ `disable` :是否关闭路由资源文件载入,默认为 `false` |
|
|
|
|
|
|
|
+ `cron` :触发更新的 Cron 表达式,留空时关闭自动升级,默认为空 |
|
|
|
+ `cron` :触发更新的 Cron 表达式,留空时关闭自动升级,默认为空。 |
|
|
|
|
|
|
|
+ `proxy` :通过指定的代理服务更新资源文件,留空时直连更新,默认为空 |
|
|
|
+ `proxy` :通过指定的代理服务更新资源文件,留空时直连更新,默认为空。 |
|
|
|
|
|
|
|
+ `url` :更新的文件名及下载地址,文件保存至 `assets` 中,默认为空 |
|
|
|
+ `url` :更新的文件名及下载地址,文件保存至 `assets` 中,默认为空。 |
|
|
|
|
|
|
|
> 默认链接为 `Loyalsoldier/v2ray-rules-dat` 的镜像,如果您可以正常访问 Github,请换用以下 URL: |
|
|
|
> |
|
|
@ -210,17 +210,17 @@ custom: |
|
|
|
- "echo Goodbye" |
|
|
|
``` |
|
|
|
|
|
|
|
> 本功能用于注入自定义功能,基于 Alpine 的 ash 执行,可能不支持部分 bash 语法 |
|
|
|
> 本功能用于注入自定义功能,基于 Alpine 的 ash 执行,可能不支持部分 bash 语法。 |
|
|
|
|
|
|
|
+ `pre` :自定义脚本命令,在代理启动前执行,默认为空 |
|
|
|
+ `pre` :自定义脚本命令,在代理启动前执行,默认为空。 |
|
|
|
|
|
|
|
+ `post` :自定义脚本命令,在服务关闭前执行,默认为空 |
|
|
|
+ `post` :自定义脚本命令,在服务关闭前执行,默认为空。 |
|
|
|
|
|
|
|
### IPv6路由广播 |
|
|
|
|
|
|
|
> `radvd` 有大量配置选项,`XProxy` 均对其保持兼容,以下仅介绍部分常用选项,更多详细参数可参考[man文档](https://www.systutorials.com/docs/linux/man/5-radvd.conf/) |
|
|
|
Radvd 有大量配置选项,`XProxy` 均对其保持兼容,以下仅介绍部分常用选项,更多详细参数可参考[man文档](https://www.systutorials.com/docs/linux/man/5-radvd.conf/)。 |
|
|
|
|
|
|
|
> 注意以下的 `on` 与 `off` 为字符串,但在部分 YAML 库中可能被解析成布尔值,为了安全起见,下游项目请注意转换时添加引号限定 |
|
|
|
> 注意以下的 `on` 与 `off` 为字符串,但在部分 YAML 库中可能被解析成布尔值,为了安全起见,下游项目请注意转换时添加引号限定。 |
|
|
|
|
|
|
|
```yaml |
|
|
|
# 以下配置仅为示范 |
|
|
@ -259,7 +259,7 @@ radvd: |
|
|
|
|
|
|
|
+ `log` :RADVD 日志级别,可选 `0-5`,数值越大越详细,默认为 `0` |
|
|
|
|
|
|
|
+ `dev` :执行 RA 广播的网卡,`enable` 为 `true` 时必选,一般与 `network` 中配置相同,默认为空 |
|
|
|
+ `dev` :执行 RA 广播的网卡,`enable` 为 `true` 时必选,一般与 `network` 中配置相同,默认为空。 |
|
|
|
|
|
|
|
+ `enable` :是否启动 RADVD,默认为 `false` |
|
|
|
|
|
|
@ -273,29 +273,29 @@ radvd: |
|
|
|
|
|
|
|
+ > M 位和 O 位的详细定义在 [RFC4862](https://www.rfc-editor.org/rfc/rfc4862) 中给出: |
|
|
|
|
|
|
|
+ `M=off` 且 `O=off` :使用 `Stateless` 模式,设备通过 RA 广播的前缀,配合 `EUI-64` 算法直接得到接口地址,即 `SLAAC` 方式 |
|
|
|
+ `M=off` 且 `O=off` :使用 `Stateless` 模式,设备通过 RA 广播的前缀,配合 `EUI-64` 算法直接得到接口地址,即 `SLAAC` 方式。 |
|
|
|
|
|
|
|
+ `M=off` 且 `O=on` :使用 `Stateless DHCPv6` 模式,设备通过 RA 广播前缀与 `EUI-64` 计算接口地址,同时从 `DHCPv6` 获取 DNS 等其他配置 |
|
|
|
+ `M=off` 且 `O=on` :使用 `Stateless DHCPv6` 模式,设备通过 RA 广播前缀与 `EUI-64` 计算接口地址,同时从 `DHCPv6` 获取 DNS 等其他配置。 |
|
|
|
|
|
|
|
+ `M=on` 且 `O=on` :使用 `Stateful DHCPv6` 模式,设备通过 `DHCPv6` 获取地址以及 DNS 等其他配置 |
|
|
|
+ `M=on` 且 `O=on` :使用 `Stateful DHCPv6` 模式,设备通过 `DHCPv6` 获取地址以及 DNS 等其他配置。 |
|
|
|
|
|
|
|
+ `M=on` 且 `O=off` :理论上不存在此配置 |
|
|
|
+ `M=on` 且 `O=off` :理论上不存在此配置。 |
|
|
|
|
|
|
|
+ `client` :配置此项后,仅发送 RA 通告到指定 IPv6 单播地址而非组播地址,默认为空(组播发送) |
|
|
|
|
|
|
|
+ `prefix` :IPv6 地址前缀配置,`cidr` 指定分配的前缀及掩码长度,`option` 指定[前缀选项](https://code.tools/man/5/radvd.conf/#lbAE) |
|
|
|
+ `prefix` :IPv6 地址前缀配置,`cidr` 指定分配的前缀及掩码长度,`option` 指定[前缀选项](https://code.tools/man/5/radvd.conf/#lbAE)。 |
|
|
|
|
|
|
|
+ `route` :指定 IPv6 路由,`cidr` 为通告的路由 CIDR(注意客户端仅将 RA 报文来源链路地址设置为 IPv6 网关,此处设置并不能更改路由网关地址),`option` 指定[路由选项](https://code.tools/man/5/radvd.conf/#lbAF) |
|
|
|
+ `route` :指定 IPv6 路由,`cidr` 为通告的路由 CIDR(注意客户端仅将 RA 报文来源链路地址设置为 IPv6 网关,此处设置并不能更改路由网关地址),`option` 指定[路由选项](https://code.tools/man/5/radvd.conf/#lbAF)。 |
|
|
|
|
|
|
|
+ `rdnss` :递归 DNS 服务器地址,`ip` 指定 IPv6 下的 DNS 服务器列表,`option` 指定[RDNSS选项](https://code.tools/man/5/radvd.conf/#lbAG) |
|
|
|
+ `rdnss` :递归 DNS 服务器地址,`ip` 指定 IPv6 下的 DNS 服务器列表,`option` 指定[RDNSS选项](https://code.tools/man/5/radvd.conf/#lbAG)。 |
|
|
|
|
|
|
|
+ `dnssl` :DNS 搜寻域名,`suffix` 指定 DNS 解析的搜寻后缀列表,`option` 指定[DNSSL选项](https://code.tools/man/5/radvd.conf/#lbAH) |
|
|
|
+ `dnssl` :DNS 搜寻域名,`suffix` 指定 DNS 解析的搜寻后缀列表,`option` 指定[DNSSL选项](https://code.tools/man/5/radvd.conf/#lbAH)。 |
|
|
|
|
|
|
|
> `RDNSS` 与 `DNSSL` 在 [RFC6106](https://www.rfc-editor.org/rfc/rfc6106) 中定义,将 DNS 配置信息直接放置在 RA 报文中发送,使用 `SLAAC` 时无需 `DHCPv6` 即可获取 DNS 服务器,但旧版本 Windows 与 Android 等系统不支持该功能。 |
|
|
|
|
|
|
|
### DHCP服务选项 |
|
|
|
|
|
|
|
> DHCP 与 DHCPv6 功能由 [ISC-DHCP](https://www.isc.org/dhcp/) 项目提供 |
|
|
|
> DHCP 与 DHCPv6 功能由 [ISC-DHCP](https://www.isc.org/dhcp/) 项目提供。 |
|
|
|
|
|
|
|
```yaml |
|
|
|
# 以下配置仅为示范 |
|
|
@ -320,17 +320,17 @@ dhcp: |
|
|
|
... |
|
|
|
``` |
|
|
|
|
|
|
|
+ `ipv4` 和 `ipv6` :分别配置 DHCPv4 与 DHCPv6 服务 |
|
|
|
+ `ipv4` 和 `ipv6` :分别配置 DHCPv4 与 DHCPv6 服务。 |
|
|
|
|
|
|
|
+ `enable` :是否启动 DHCP 服务,默认为 `false` |
|
|
|
|
|
|
|
+ `config` :DHCP 服务配置文件,具体配置内容参考 [man文档](https://linux.die.net/man/5/dhcpd.conf) |
|
|
|
+ `config` :DHCP 服务配置文件,具体配置内容参考[man文档](https://linux.die.net/man/5/dhcpd.conf)。 |
|
|
|
|
|
|
|
## 部署流程 |
|
|
|
|
|
|
|
### 1. 初始配置 |
|
|
|
|
|
|
|
> XProxy 基于 macvlan 网络,开启网卡混杂模式后可以捕获非本机 MAC 地址的数据包,以此模拟出不同 MAC 地址的网卡 |
|
|
|
> XProxy 基于 macvlan 网络,开启网卡混杂模式后可以捕获非本机 MAC 地址的数据包,以此模拟出不同 MAC 地址的网卡。 |
|
|
|
|
|
|
|
```bash |
|
|
|
# 开启混杂模式,网卡按实际情况指定 |
|
|
@ -340,7 +340,7 @@ $ ip link set eth0 promisc on |
|
|
|
$ modprobe ip6table_filter |
|
|
|
``` |
|
|
|
|
|
|
|
在 Docker 中创建 macvlan 网络 |
|
|
|
在 Docker 中创建 macvlan 网络: |
|
|
|
|
|
|
|
```bash |
|
|
|
# 网络配置按实际情况指定 |
|
|
@ -362,7 +362,7 @@ XProxy 同时发布在多个镜像源上: |
|
|
|
|
|
|
|
+ `阿里云镜像` :`registry.cn-shenzhen.aliyuncs.com/dnomd343/xproxy` |
|
|
|
|
|
|
|
> 下述命令中,容器路径可替换为上述其他源,国内网络建议首选阿里云仓库 |
|
|
|
> 下述命令中,容器路径可替换为上述其他源,国内网络建议首选阿里云仓库。 |
|
|
|
|
|
|
|
使用以下命令启动虚拟网关,配置文件将存储在本机 `/etc/xproxy/` 目录下: |
|
|
|
|
|
|
@ -459,13 +459,13 @@ docker logs -f xproxy |
|
|
|
|
|
|
|
### 4. 宿主机访问虚拟网关 |
|
|
|
|
|
|
|
> 这一步旨在让宿主机能够使用虚拟网关,若无此需求可以跳过 |
|
|
|
> 这一步旨在让宿主机能够使用虚拟网关,若无此需求可以跳过。 |
|
|
|
|
|
|
|
由于 macvlan 限制,宿主机网卡无法直接与虚拟网关通讯,需要另外配置网桥才可连接 |
|
|
|
由于 macvlan 限制,宿主机网卡无法直接与虚拟网关通讯,需要另外配置网桥才可连接。 |
|
|
|
|
|
|
|
> 以下为配置基于 Debian,基于 RH、Arch 等的发行版配置略有不同 |
|
|
|
> 以下为配置基于 Debian,基于 RH、Arch 等的发行版配置略有不同。 |
|
|
|
|
|
|
|
编辑网卡配置文件 |
|
|
|
编辑网卡配置文件: |
|
|
|
|
|
|
|
```bash |
|
|
|
vim /etc/network/interfaces |
|
|
@ -497,11 +497,11 @@ $ /etc/init.d/networking restart |
|
|
|
|
|
|
|
### 5. 局域网设备访问 |
|
|
|
|
|
|
|
> 对于手动配置了静态IP的设备,需要修改网关地址为虚拟网关IP |
|
|
|
> 对于手动配置了静态 IP 的设备,需要修改网关地址为虚拟网关 IP 地址。 |
|
|
|
|
|
|
|
配置完成后,容器 IP 即为虚拟网关地址,内网其他设备的网关设置为该地址即可被透明代理,因此这里需要配置 DHCP 与 RADVD 路由广播,让内网设备自动接入虚拟网关。 |
|
|
|
|
|
|
|
> 您可以监视 `log/access.log` 文件,设备正常接入后会在此输出访问日志 |
|
|
|
> 您可以监视 `log/access.log` 文件,设备正常接入后会在此输出访问日志。 |
|
|
|
|
|
|
|
+ IPv4 下,修改内网 DHCP 服务器配置(一般位于路由器上),将网关改为容器 IP 地址,保存后重新接入设备即可生效。 |
|
|
|
|
|
|
@ -509,7 +509,7 @@ $ /etc/init.d/networking restart |
|
|
|
|
|
|
|
## 演示实例 |
|
|
|
|
|
|
|
> 由于 XProxy 涉及较为复杂的网络配置,这里准备了两个详细的实例供您了解 |
|
|
|
由于 XProxy 涉及较为复杂的网络配置,这里准备了两个详细的实例供您了解: |
|
|
|
|
|
|
|
+ 实例1. [使用 XProxy 绕过校园网认证登录](./docs/campus_network_cracking.md) |
|
|
|
|
|
|
@ -519,9 +519,9 @@ $ /etc/init.d/networking restart |
|
|
|
|
|
|
|
### 运行参数 |
|
|
|
|
|
|
|
> XProxy 默认使用 `/xproxy` 作为存储文件夹,该文件夹映射到外部主机作为持久存储,您可以使用 `EXPOSE_DIR` 环境变量修改该文件夹路径 |
|
|
|
XProxy 默认使用 `/xproxy` 作为存储文件夹,该文件夹映射到外部主机作为持久存储,您可以使用 `EXPOSE_DIR` 环境变量修改该文件夹路径。 |
|
|
|
|
|
|
|
> XProxy 默认使用 `xray` 作为代理内核,您可以使用 `PROXY_BIN` 环境变量来指定其他内核 |
|
|
|
XProxy 默认使用 `xray` 作为代理内核,您可以使用 `PROXY_BIN` 环境变量来指定其他内核。 |
|
|
|
|
|
|
|
+ `--config` :指定配置文件名称,默认为 `xproxy.yml` |
|
|
|
|
|
|
@ -531,13 +531,13 @@ $ /etc/init.d/networking restart |
|
|
|
|
|
|
|
XProxy 默认使用以下配置: |
|
|
|
|
|
|
|
+ IPv4 路由表号:`104`,使用 `IPV4_TABLE` 环境变量修改 |
|
|
|
+ IPv4 路由表号:`104`,使用 `IPV4_TABLE` 环境变量修改。 |
|
|
|
|
|
|
|
+ IPv6 路由表号:`106`,使用 `IPV6_TABLE` 环境变量修改 |
|
|
|
+ IPv6 路由表号:`106`,使用 `IPV6_TABLE` 环境变量修改。 |
|
|
|
|
|
|
|
+ IPv4 透明代理端口:`7288`,使用 `IPV4_TPROXY` 环境变量修改 |
|
|
|
+ IPv4 透明代理端口:`7288`,使用 `IPV4_TPROXY` 环境变量修改。 |
|
|
|
|
|
|
|
+ IPv6 透明代理端口:`7289`,使用 `IPV6_TPROXY` 环境变量修改 |
|
|
|
+ IPv6 透明代理端口:`7289`,使用 `IPV6_TPROXY` 环境变量修改。 |
|
|
|
|
|
|
|
### 容器构建 |
|
|
|
|
|
|
|