Proxy Server

来自牛奶河Wiki
跳到导航 跳到搜索

设置代理服务器,使内网客户端可以通过代理服务器的 Wireguard 上网。

Windows11

环境:两个网卡,其中一个 WiFi 可上网(192.168.0.100),另一个有线(192.168.137.1),Wireguard(10.0.0.10)。

配置:192.168.137 网段上的主机,可通过 10.0.0.10 上网。

啟用 IP 轉發功能

reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v IPEnableRouter /t REG_DWORD /d 1 /f
# 重启

設置 VPN 網絡共享

VPN 網卡(10.0.0.10),右鍵屬性 --> 共享,選擇本地網卡(192.168.137.1)。
確保本地網卡(192.168.137.1)使用靜態 IP
192.168.137.1
255.255.255.0
DNS: 8.8.8.8

檢查路由表

確保有一條路由,將流量發送到 VPN 的網卡
route print
  Network Destination    Netmask        Gateway          Interface    Metric
  0.0.0.0                0.0.0.0        10.0.0.10        [VPN Interface]

設置 137 網段的主機

192.168.137.101
255.255.255.0
網關:192.168.137.1
DNS: 8.8.8.8

Ubuntu 20.04

环境:一个网卡(ens160 - 192.168.0.100),Wireguard(u01 - 10.0.0.10)

配置:192.168.0 网段上的主机,可通过 10.0.0.10 上网

啟用 IP 轉發功能

# /etc/sysctl.conf
# sysctl -p
net.ipv4.ip_forward = 1

設置 NAT

# 設置 NAT,讓來自 192.168.0 網段的流量通過 u01(10.0.0.10)轉發
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o u01 -j MASQUERADE
  -t nat:使用 NAT 表
  -A POSTROUTING:在 POSTROUTING 鏈中添加規則
  -s 192.168.0.0/24:源地址是 192.168.0 網段
  -o u01:指定 VPN 網卡(通过 wg-quick up u01 产生,u01 是 /etc/wireguard/u01.conf,可以通過 ip a 查確認)
  -j MASQUERADE:啟用地址偽裝
# 删除:iptables -t nat -D POSTROUTING -s 192.168.0.0/24 -o u01 -j MASQUERADE
# 清空:iptables -t nat -F POSTROUTING

配置內部網段流量轉發

iptables -A FORWARD -i ens160 -o u01 -j ACCEPT
iptables -A FORWARD -i u01 -o ens160 -j ACCEPT
# 删除:iptables -D FORWARD -i ens160 -o u01 -j ACCEPT
# 清空:iptables -F FORWARD

保存防火牆規則

# Ubuntu 中,iptables 設置默認不會持久化
apt install iptables-persistent
netfilter-persistent save
netfilter-persistent reload

設置 192.168.0 網段的主機

192.168.0.101
255.255.255.0
網關:192.168.0.100
DNS: 8.8.8.8

MTU

如果出现访问网站、视频(如 Youtube)正常,但有些游戏 load 中间卡住情况,可能是 MTU 问题。

MTU 排查
# ping 一个远程主机,使用 -M do 禁用分片,找到不分片的最大值:
ping -c 3 -M do -s 1420 8.8.8.8
-> ping: local error: message too long, mtu=1420 -> 缩小 -s 的值,直到:
ping -c 3 -M do -s 1392 8.8.8.8
-> 1400 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=166 ms
# 此时:
路径 MTU = 1392
PMTU = 1392 + 28(IP 头 20 字节 + ICMP 头 8 字节) = 1420
调整各路径 MTU
  1. 调整 WireGuard 的 MTU(u31.conf)
  2. 调整 u31  : ip link set dev u31 mtu 1420(这个貌似没用)
  3. 调整 ens160 : ip link set dev ens160 mtu 1420(这个貌似没用)

说上面两个没用的,尤其是 u31 这个,如果两个同时改为 1422,ping -c 3 -M do -s 1393 8.8.8.8 是可以正常的,但游戏又会卡住了。因为跟下面的 MSS 钳制有关。

调整 iptables (MSS 钳制)
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -o u31 -j TCPMSS --clamp-mss-to-pmtu

这条规则将通过 u31 接口的 TCP SYN 数据包的 MSS 值钳制到 PMTU,这通常是解决 MTU 问题的最有效方法。