Browse Source

docs: update tutorial format

v1.x.x
Dnomd343 2 years ago
parent
commit
a86d84d384
  1. 45
      docs/campus_network_cracking.md
  2. 30
      docs/dual_stack_network_proxy.md

45
docs/campus_network_cracking.md

@ -8,13 +8,13 @@
为了方便讲解,我们假设以下典型情况: 为了方便讲解,我们假设以下典型情况:
+ 校园网交换机无 IPv6 支持,同时存在 QoS + 校园网交换机无 IPv6 支持,同时存在 QoS
+ 无认证时允许 53 端口通行,ICMP 流量无法通过 + 无认证时允许 53 端口通行,ICMP 流量无法通过
+ 使用三台公网服务器负载均衡,其 53 端口上运行有代理服务 + 使用三台公网服务器负载均衡,其 53 端口上运行有代理服务
+ 三台服务器只有一台支持 IPv4 与 IPv6 双栈,其余只支持 IPv4 + 三台服务器只有一台支持 IPv4 与 IPv6 双栈,其余只支持 IPv4
## 代理协议 ## 代理协议
@ -26,15 +26,15 @@
## 初始化配置 ## 初始化配置
> 分配 `192.168.2.0/24``fc00::/64` 给内网使用 > 分配 `192.168.2.0/24``fc00::/64` 给内网使用
路由器 WAN 口接入学校交换机,构建一个 NAT 转换,代理流量在路由器转发后送到公网服务器的 53 端口上;假设内网中路由器地址为 `192.168.2.1` ,配置虚拟网关 IPv4 地址为 `192.168.2.2` ,IPv6 地址为 `fc00::2` ;在网关中,无论 IPv4 还是 IPv6 流量都会被透明代理,由于校园网无 IPv6 支持,数据被封装后只通过 IPv4 网络发送,代理服务器接收以后再将其解开,对于 IPv6 流量,这里相当于一个 6to4 隧道。 路由器 WAN 口接入学校交换机,构建一个 NAT 转换,代理流量在路由器转发后送到公网服务器的 53 端口上;假设内网中路由器地址为 `192.168.2.1` ,配置虚拟网关 IPv4 地址为 `192.168.2.2` ,IPv6 地址为 `fc00::2` ;在网关中,无论 IPv4 还是 IPv6 流量都会被透明代理,由于校园网无 IPv6 支持,数据被封装后只通过 IPv4 网络发送,代理服务器接收以后再将其解开,对于 IPv6 流量,这里相当于一个 `6to4` 隧道。
``` ```bash
# 宿主机网卡假定为 eth0 # 宿主机网卡假定为 eth0
shell> ip link set eth0 promisc on $ ip link set eth0 promisc on
shell> modprobe ip6table_filter $ modprobe ip6table_filter
shell> docker network create -d macvlan \ $ docker network create -d macvlan \
--subnet=192.168.2.0/24 \ # 此处指定的参数为容器的默认网络配置 --subnet=192.168.2.0/24 \ # 此处指定的参数为容器的默认网络配置
--gateway=192.168.2.1 \ --gateway=192.168.2.1 \
--subnet=fc00::/64 \ --subnet=fc00::/64 \
@ -44,8 +44,8 @@ shell> docker network create -d macvlan \
我们将配置文件保存在 `/etc/scutweb` 目录下,使用以下命令开启 XProxy 服务: 我们将配置文件保存在 `/etc/scutweb` 目录下,使用以下命令开启 XProxy 服务:
``` ```bash
shell> docker run --restart always \ docker run --restart always \
--privileged --network macvlan -dt \ --privileged --network macvlan -dt \
--name scutweb --hostname scutweb \ --name scutweb --hostname scutweb \
--volume /etc/scutweb/:/xproxy/ \ --volume /etc/scutweb/:/xproxy/ \
@ -110,7 +110,7 @@ custom:
在开始代理前,我们使用 `custom` 注入了一段脚本配置:由于这里我们只代理 TCP 与 UDP 流量,ICMP 数据包不走代理,内网设备 ping 外网时会一直无响应,加入这段脚本可以创建一个 NAT,假冒远程主机返回成功回复,但实际上 ICMP 数据包并未实际到达,效果上表现为 ping 成功且延迟为内网访问时间。 在开始代理前,我们使用 `custom` 注入了一段脚本配置:由于这里我们只代理 TCP 与 UDP 流量,ICMP 数据包不走代理,内网设备 ping 外网时会一直无响应,加入这段脚本可以创建一个 NAT,假冒远程主机返回成功回复,但实际上 ICMP 数据包并未实际到达,效果上表现为 ping 成功且延迟为内网访问时间。
> 这段脚本并无实质作用,只是演示 `custom` 功能 > 这段脚本并无实质作用,仅用于演示 `custom` 功能。
## 代理配置 ## 代理配置
@ -184,15 +184,15 @@ custom:
重启 XProxy 容器使配置生效: 重启 XProxy 容器使配置生效:
``` ```bash
shell> docker restart scutweb docker restart scutweb
``` ```
最后,验证代理服务是否正常工作,若出现问题可以查看 `/etc/scutweb/log` 文件夹下的日志,定位错误原因。 最后,验证代理服务是否正常工作,若出现问题可以查看 `/etc/scutweb/log` 文件夹下的日志,定位错误原因。
## 代理 ICMP 流量 ## 代理 ICMP 流量
> 这一步仅用于修复 ICMP 代理,无此需求可以忽略 > 这一步仅用于修复 ICMP 代理,无此需求可以忽略
由于 socks5 代理服务不支持 ICMP 协议,当前搭建的网络只有 TCP 与 UDP 发往外网,即使在上文我们注入了一段命令用于劫持 PING 流量,但是返回的仅仅是虚假结果,并没有实际意义;所以如果对这个缺陷不满,您可以考虑使用以下方法修复这个问题。 由于 socks5 代理服务不支持 ICMP 协议,当前搭建的网络只有 TCP 与 UDP 发往外网,即使在上文我们注入了一段命令用于劫持 PING 流量,但是返回的仅仅是虚假结果,并没有实际意义;所以如果对这个缺陷不满,您可以考虑使用以下方法修复这个问题。
@ -235,23 +235,22 @@ with open(os.path.join(workDir, 'setup'), 'w') as script:
os.system('chmod +x %s' % os.path.join(workDir, 'setup')) os.system('chmod +x %s' % os.path.join(workDir, 'setup'))
``` ```
``` ```bash
# fetch.py 为上述脚本 # fetch.py 为上述脚本
$ cd /etc/scutweb
shell> cd /etc/scutweb $ mkdir -p ./toolset && cd ./toolset
shell> mkdir -p ./toolset && cd ./toolset $ python3 fetch.py wireguard-tools # 拉取wireguard-tools依赖
shell> python3 fetch.py wireguard-tools # 拉取wireguard-tools依赖
··· ···
··· ···
``` ```
拉取成功后将生成 `wireguard-tools` 文件夹,包含多个依赖的 `.apk` 安装包与 `setup` 安装脚本 拉取成功后将生成 `wireguard-tools` 文件夹,包含多个依赖的 `.apk` 安装包与 `setup` 安装脚本
### 2. 写入 WireGuard 配置文件 ### 2. 写入 WireGuard 配置文件
一个典型的客户端配置文件如下: 一个典型的客户端配置文件如下:
``` ```ini
[Interface] [Interface]
PrivateKey = 客户端私钥 PrivateKey = 客户端私钥

30
docs/dual_stack_network_proxy.md

@ -1,4 +1,4 @@
## 家庭网络的 IPv4 与 IPv6 透明代理 # 家庭网络的 IPv4 与 IPv6 透明代理
家庭网络光纤入网,支持 IPv4 与 IPv6 网络,需要在内网搭建透明代理,让设备的国内流量直连,出境流量转发到代理服务器上,避开 GFW 的流量审查。 家庭网络光纤入网,支持 IPv4 与 IPv6 网络,需要在内网搭建透明代理,让设备的国内流量直连,出境流量转发到代理服务器上,避开 GFW 的流量审查。
@ -12,15 +12,15 @@
大多数地区的运营商不会提供 IPv4 公网地址,IPv6 分配一般为 64 位长度的公网网段;虚拟网关在这里需要收集内网的所有 IPv4 与 IPv6 流量,将国内流量直接送出,国外流量发往代理服务器;为了增加难度,我们假设有两台境外代理服务器,一台支持IPv6,一台只支持IPv4,我们需要将IPv6代理流量发送给前者,其余代理流量送往后者。 大多数地区的运营商不会提供 IPv4 公网地址,IPv6 分配一般为 64 位长度的公网网段;虚拟网关在这里需要收集内网的所有 IPv4 与 IPv6 流量,将国内流量直接送出,国外流量发往代理服务器;为了增加难度,我们假设有两台境外代理服务器,一台支持IPv6,一台只支持IPv4,我们需要将IPv6代理流量发送给前者,其余代理流量送往后者。
### 分流规则 ## 分流规则
代理内核需要区分出哪些流量可以直连,哪些流量需要送往代理服务器,为了更准确地分流,这里需要开启嗅探功能,获取访问的域名信息,同时允许流量重定向(目标地址修改为域名,送至代理服务器解析,避开 DNS 污染) 代理内核需要区分出哪些流量可以直连,哪些流量需要送往代理服务器,为了更准确地分流,这里需要开启嗅探功能,获取访问的域名信息,同时允许流量重定向(目标地址修改为域名,送至代理服务器解析,避开 DNS 污染)
目前路由资源中包含了一份国内常见域名列表(即 `geosite.dat` ,XProxy 已集成),如果嗅探后的域名在其中,那可以直接判定为直连流量,但是对于其他流量,即使它不在列表内,但仍可能是国内服务,我们不能直接将它送往代理服务器;因此下一步我们需要引出分流的核心规则,它取决于 DNS 污染的一个特性:受污染的域名返回解析必然为境外 IP ,基于这个原则,我们将嗅探到的域名使用国内 DNS 进行一次解析,如果结果是国内 IP 地址,那就直连该流量,否则发往代理服务器,IPv4 与 IPv6 均使用该逻辑分流。 目前路由资源中包含了一份国内常见域名列表(即 `geosite.dat` ,XProxy 已集成),如果嗅探后的域名在其中,那可以直接判定为直连流量,但是对于其他流量,即使它不在列表内,但仍可能是国内服务,我们不能直接将它送往代理服务器;因此下一步我们需要引出分流的核心规则,它取决于 DNS 污染的一个特性:受污染的域名返回解析必然为境外 IP ,基于这个原则,我们将嗅探到的域名使用国内 DNS 进行一次解析,如果结果是国内 IP 地址,那就直连该流量,否则发往代理服务器,IPv4 与 IPv6 均使用该逻辑分流。
如果有可能的话,您可以在内网搭建一个无污染的解析服务,比如 [ClearDNS](https://github.com/dnomd343/ClearDNS),它的作用在于消除 DNS 污染,准确地给出国内外的解析地址,这样子可以在分流时就不用多做一次 DNS 解析,减少这一步导致的延迟(DNS 流量通过代理送出,远程解析以后再返回,其耗时较长且不稳定),无污染 DNS 可以更快更准确地进行分流。 如果有可能的话,您可以在内网搭建一个无污染的解析服务,比如 [ClearDNS](https://github.com/dnomd343/ClearDNS),它的作用在于消除 DNS 污染,准确地给出国内外的解析地址,这样子可以在分流时就不用多做一次 DNS 解析,减少这一步导致的延迟(DNS 流量通过代理送出,远程解析以后再返回,其耗时较长且不稳定),无污染 DNS 可以更快更准确地进行分流。
### 网络配置 ## 网络配置
网络地址方面,内网 IPv4 段由我们自己决定,这一部分取决于路由器设置的 LAN 侧 IP 段,我们假设为 `192.168.2.0/24` ,其中路由器地址为 `192.168.2.1` ,虚拟网关分配为 `192.168.2.2` ,由于 IPv4 部分由路由器 NAT 隔离,这里不需要修改光猫配置;虚拟网关上游配置为路由器地址,修改内网 DHCP 服务,让网关指向 `192.168.2.2` 网络地址方面,内网 IPv4 段由我们自己决定,这一部分取决于路由器设置的 LAN 侧 IP 段,我们假设为 `192.168.2.0/24` ,其中路由器地址为 `192.168.2.1` ,虚拟网关分配为 `192.168.2.2` ,由于 IPv4 部分由路由器 NAT 隔离,这里不需要修改光猫配置;虚拟网关上游配置为路由器地址,修改内网 DHCP 服务,让网关指向 `192.168.2.2`
@ -40,22 +40,22 @@ IPv6部分,由于路由器桥接,地址分配等操作均为光猫负责,
这是 IPv6 在代理方面的缺点,它将发送 RA 广播的链路地址直接视为路由网关,且该地址无法通过其他协议更改,我们没法像 DHCPv4 一样直接配置网关地址,这在透明代理时远没有 IPv4 方便,只能将 RA 广播源放在网关上。 这是 IPv6 在代理方面的缺点,它将发送 RA 广播的链路地址直接视为路由网关,且该地址无法通过其他协议更改,我们没法像 DHCPv4 一样直接配置网关地址,这在透明代理时远没有 IPv4 方便,只能将 RA 广播源放在网关上。
### 启动服务 ## 启动服务
首先创建 macvlan 网络: 首先创建 macvlan 网络:
``` ```bash
# 宿主机网卡假定为 eth0 # 宿主机网卡假定为 eth0
shell> ip link set eth0 promisc on $ ip link set eth0 promisc on
shell> modprobe ip6table_filter $ modprobe ip6table_filter
# IPv6网段后续由XProxy更改,这里可以随意指定 # IPv6网段后续由XProxy更改,这里可以随意指定
shell> docker network create -d macvlan --subnet=fe80::/10 --ipv6 -o parent=eth0 macvlan $ docker network create -d macvlan --subnet=fe80::/10 --ipv6 -o parent=eth0 macvlan
``` ```
将配置文件保存在 `/etc/route` 目录下,使用以下命令开启 XProxy 服务: 将配置文件保存在 `/etc/route` 目录下,使用以下命令开启 XProxy 服务:
``` ```bash
shell> docker run --restart always \ docker run --restart always \
--privileged --network macvlan -dt \ --privileged --network macvlan -dt \
--name route --hostname route \ --name route --hostname route \
--volume /etc/route/:/xproxy/ \ --volume /etc/route/:/xproxy/ \
@ -64,7 +64,7 @@ shell> docker run --restart always \
dnomd343/xproxy:latest dnomd343/xproxy:latest
``` ```
### 参数配置 ## 参数配置
在设计上,应该配置四个出口,分别为 IPv4 直连、IPv4 代理、IPv6 直连、IPv6 代理,这里创建 4 个对应的 socks5 接口 `direct4` 、`proxy4` 、`direct6` 、`proxy6` ,用于检测对应出口是否正常工作。 在设计上,应该配置四个出口,分别为 IPv4 直连、IPv4 代理、IPv6 直连、IPv6 代理,这里创建 4 个对应的 socks5 接口 `direct4` 、`proxy4` 、`direct6` 、`proxy6` ,用于检测对应出口是否正常工作。
@ -121,7 +121,7 @@ asset:
geosite.dat: "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat" geosite.dat: "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"
``` ```
### 代理配置 ## 代理配置
配置出站代理,修改 `config/outbounds.json` 文件,其中 direct 直连到国内网络,proxy 填入代理服务器参数: 配置出站代理,修改 `config/outbounds.json` 文件,其中 direct 直连到国内网络,proxy 填入代理服务器参数:
@ -228,8 +228,8 @@ asset:
重启 XProxy 容器使配置生效: 重启 XProxy 容器使配置生效:
``` ```bash
shell> docker restart route docker restart route
``` ```
最后,验证代理服务是否正常工作,若出现问题可以查看 `/etc/route/log` 文件夹下的日志,定位错误原因。 最后,验证代理服务是否正常工作,若出现问题可以查看 `/etc/route/log` 文件夹下的日志,定位错误原因。

Loading…
Cancel
Save