@ -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 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					shell>  ip link set eth0 promisc on 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					shell>  modprobe ip6table_filter 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					shell>  docker network create -d macvlan \ 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					$  ip link set eth0 promisc on 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					$  modprobe ip6table_filter 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					$  docker network create -d macvlan \ 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					  --subnet=192.168.2.0/24 \  # 此处指定的参数为容器的默认网络配置 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					  --gateway=192.168.2.1 \ 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					  --subnet=fc00::/64 \ 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -44,8 +44,8 @@ shell> docker network create -d macvlan \ 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					我们将配置文件保存在 `/etc/scutweb`  目录下,使用以下命令开启 XProxy 服务: 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					``` 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					shell>  docker run --restart always \ 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					```bash  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					docker run --restart always \ 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					  --privileged --network macvlan -dt \ 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					  --name scutweb --hostname scutweb \ 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					  --volume /etc/scutweb/:/xproxy/ \ 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -110,7 +110,7 @@ custom: 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					在开始代理前,我们使用 `custom`  注入了一段脚本配置:由于这里我们只代理 TCP 与 UDP 流量,ICMP 数据包不走代理,内网设备 ping 外网时会一直无响应,加入这段脚本可以创建一个 NAT,假冒远程主机返回成功回复,但实际上 ICMP 数据包并未实际到达,效果上表现为 ping 成功且延迟为内网访问时间。 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					> 这段脚本并无实质作用,只是演示 `custom`  功能  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					> 这段脚本并无实质作用,仅用于演示 `custom`  功能。  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					## 代理配置 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -184,15 +184,15 @@ custom: 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					重启 XProxy 容器使配置生效: 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					``` 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					shell>  docker restart scutweb 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					```bash  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					docker restart scutweb 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					``` 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					最后,验证代理服务是否正常工作,若出现问题可以查看 `/etc/scutweb/log`  文件夹下的日志,定位错误原因。 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					## 代理 ICMP 流量 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					> 这一步仅用于修复 ICMP 代理,无此需求可以忽略 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					> 这一步仅用于修复 ICMP 代理,无此需求可以忽略。  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					由于 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')) 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					``` 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					``` 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					```bash  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# fetch.py 为上述脚本 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					shell> cd /etc/scutweb 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					shell> mkdir -p ./toolset & &  cd ./toolset 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					shell> python3 fetch.py wireguard-tools  # 拉取wireguard-tools依赖 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					$ cd /etc/scutweb 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					$ mkdir -p ./toolset & &  cd ./toolset 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					$ python3 fetch.py wireguard-tools  # 拉取wireguard-tools依赖 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					··· 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					··· 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					``` 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					拉取成功后将生成 `wireguard-tools`  文件夹,包含多个依赖的 `.apk`  安装包与 `setup`  安装脚本 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					拉取成功后将生成 `wireguard-tools`  文件夹,包含多个依赖的 `.apk`  安装包与 `setup`  安装脚本。  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					### 2. 写入 WireGuard 配置文件 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					一个典型的客户端配置文件如下: 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					``` 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					```ini  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					[Interface] 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					PrivateKey = 客户端私钥