– 【1】题记 –

我曾经买过2个小米的摄像头,结果都是严重入坑,因为其海外地区限制;无一例外都需要国内IP地址。外加各种懒,折腾固件就算了;国外转了一圈又回国送人了。

最近聊过领事APP和交警12123 点我穿越门 你可以通过国内手机漫游方式曲线救国一把。但是如果诸如摄像头和扫地机器人这些随时在线的,你就需要来个一键穿梭回国了。这玩意很是神奇,外加爱奇艺,CCTV5的加持,对海外兄弟简直是妥妥的刚需。于是乎,市场上充斥着各种靠谱不靠谱的穿梭机;当然这不是我今天讨论的重点。

划重点:自建一个穿梭机。

  • 国内朋友/家人路由器(没有固定公网IP,链路不稳定,需要较高本地维护)
  • 国内云服务商买一个VPS(Virtual Private Server), 在VPS上部署穿梭机软件

2024.10 更新:

标题党就是各种忙,我5月写的这篇,弄到现在才更新。今天是值得纪念的日子,今年工作上各种苦逼的忙到此就告一段落。一是把新来的团队成员给带了起来,至少我不用再冲在一线没日没夜了;二是mission impossible的项目居然就被我硬生生的交付下来了。

项目管理的交付三角一个都没有拉下,还成长了团队;感觉格局高了不是一个档次,给公司赚了几个“亿”有没有。周五是最后一天验收,我只想说一句:海阔天空。

拉回来,前段时间小伙伴说wireguard封端口;测试了一下,Wireguard的UDP特征非常明显,所以被封是早晚的事情。于是我想到了udp2raw做封装,再跑wireguard。

尝试了一把,链路是建立起来了,但是速度奇慢,2Mbps的VPS的带宽完全跑不起来;最后放弃此方案。

所谓柳暗花明,至此Hysteria 2隆重登场:

  • 部署OpenWrt软路由(LuCi界面 )
  • 安装passwall图形化插件
  • 安装/升级 Hysteria 2核心

如此通过passwall图形化界面配置hysteria 2

–【2】国内云服务商VPS –

主流的几家:

  • Azure
  • 腾讯云
  • 百度云
  • 阿里云
  • 华为云

VPS和亚马逊的EC2技术实现上虽然不一样,但功能一致,殊途同归。VPS偏向轻型化主机;部署一键穿梭回国那是足够足够了。

特想吐槽的是,国内严格的网络监管,让VPS的配置非常的畸形,用腾讯云举例(其他云大同小异),最便宜的VPS限制3Mbps带宽,然后每月200GB的流量。

呵呵,3M带宽,也就勉强拉个CCTV5。

好吧,哪个便宜那个来,挑了腾讯云(第一年RMB 82),满足VPS的基本需求:

  • 公网IP
  • 2 vCPU, 2G RAM, 40G SSD
  • 3Mbps带宽,200GB每月总流量
  • SSH密钥登录
  • snapshot快照
  • 试用30天
  • 微信绑定(需实名认证)
  • Authenticator 2FA

– 【3】一键穿梭软件部署 –

VPS操作系统可以选CentOS (已经EOL了) 或者Ubuntu;搞定SSH密钥之后,就可以远程登录VPS了。

现在主流的软件有两个:wireguard和Shadowsocks

  • 两者都是open source
  • 两者技术实现不一样,Shadowsocks基于SOCKS5 proxy(server/client);然后wireguard基于密钥点对点(peer to peer)
  • 两者都可以实现一键穿梭回国(国内地址)

成人的世界我全要,两个我都部署了一遍,性能比较如下:

  • Shadowsocks数据转发上会快一些,3M的带宽挂CCTV5还是可以接受的。
  • Wireguard毕竟先点对点Tunnel,再做数据转发,一般都有300ms的延迟,冲击CCTV5有点困难。

好在我的需求就是懒人包,存粹冲着扫地机器人去的;最后选择:wireguard

– wireguard –

wireguard 虽然应用模式上server/client,但严格意义上是点对点Tunnel。

VPS服务器端

  • sudo apt update
  • sudo apt install wireguard
  • sudo wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key

生成密钥,private key自己用,public key给对方(点对点)

  • sudo cat /etc/wireguard/server_private.key

查看private key密钥

  • sudo ip address

确认VPS出口网卡,一般都是eth0

  • sudo nano /etc/wireguard/wg0.conf

创建配置文件,这样用systemctl自动启动wireguard

服务器端配置文件

[Interface]

Address = 172.16.1.254/24 
Wireguard 生成虚拟网卡wg0,然后需要给这个虚拟网卡设置一个私有地址,随便挑一个,只要和VPS内网地址不冲突即可。

ListenPort = 51820 
Wireguard 监听端口,VPS防火墙要开放这个UDP端口号

SaveConfig = true

每次重启,配置会保留
sudo wg-quick down wg0
sudo nano /etc/wireguard/wg0.conf
sudo wg-quick up wg0
修改配置

PrivateKey = xxxx

粘贴前面生成的private key
PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE


客户端连接到服务器端的wg0虚拟网卡后做NAT转换到VPS的出口网卡

[Peer]

配置客户端(wireguard需要点对点)

PublicKey = xxx

粘贴客户端生成的public key

AllowedIPs = 172.16.1.0/24 

服务端设置成单点172.16.1.254对多点客户端172.16.1.1-253
  • sudo systemctl start wg-quick@wg0
  • sudo systemctl enable wg-quick@wg0
  • sudo systemctl status wg-quick@wg0
  • sudo wg

wireguard服务器端部署完成

  • sudo nano /etc/sysctl.conf

    net.ipv4.ip_forward = 1

  • sudo sysctl -p

    修改系统配置,允许VPS做路由转发

  • sudo ufw allow 51820/udp

    修改VPS防火墙设置

PC客户端

配置文件和VPS服务器端类似,以Windows为例,手工创建一个配置文件:

[Interface]

PrivateKey = xxxx

粘贴PC客户端的private key

ListenPort = 51820

设置PC客户端的监听端口

Address = 172.16.1.1/24

设置PC客户端wg0虚拟网卡地址

DNS = 223.5.5.5

设置阿里云的DNS服务,Google DNS国内无法使用

[Peer]
PublicKey = xxx

粘贴VPS服务器端的public key

AllowedIPs = 0.0.0.0/0

设置PC客户端的网络数据全部通过VPS转发

Endpoint = VPS服务器端的公网地址:监听端口

PersistentKeepalive = 25

– shadowsocks –

几个版本

  • shadowsocks (ss): python 实现
  • shadowsocks-libev (ss-libev): C 实现,轻量化部署
  • shadowsocks-rust (ss-rust): rust实现

以下以ss-libev进行部署

VPS服务器端

  • sudo apt update
  • sudo apt install shadowsocks-libev
  • sudo nano /etc/shadowsocks-libev/config.json

“server”:[“0.0.0.0”],

简单配置监听端口和密码

"mode":"udp",

"server_port":8388,

VPS服务器端监听端口

"local_port":1080,

"password":"xxxxx",

设置客户端连接密码

"timeout":60,

"method":"aes-256-gcm"

设置客户端加密方式
  • sudo ufw allow 8388

    修改VPS防火墙设置

  • sudo systemctl restart shadowsocks-libev

  • sudo systemctl status shadowsocks-libev

  • sudo systemctl enable shadowsocks-libev.service

客户端

  • Apple可以装免费的potatso和sockswitch-shadowsokcs;付费用shadowrocket
  • Andriod Google Play:Shadowsocks
  • Windows:Shadowsocks

注:

  • Windows shadowsocks client开启PAC模式
  • Firefox network setting:manual proxy: SOCKS Host 127.0.0.1:1080

– 【4】旁路由/旁路网关部署 –

Openwrt可以同时支持Wireguard和Shadowsocks。但Shadowsocks终究是client proxy模式,想要使用旁路节点的还是Wireguard的部署比较容易。

选择上:

  • 市面主流WIFI 路由器诸如华硕,TP-Link都内置支持wiregurad
  • 动手能力再强一点就可以上EdgeRouter X,MikroTik这些路由器
  • 如果跑虚拟机,软路由的话可以上penwrt和pfsense

– 【5】Hysteria 2 –

VPS服务器端配置

cat << EOF > /etc/hysteria/config.yaml
listen: :443 #监听端口
#使用自签证书(self-signed)
tls:
    cert: /etc/hysteria/server.crt
    key: /etc/hysteria/server.key
auth:
    type: password
    password: <设置VPS认证密码>

masquerade:
    type: proxy
    proxy:
    url: https://baidu.com #伪装网址
    rewriteHost: true
EOF

OpenWRT客户端配置

server: :443 #注意开放VPS防火墙 auth:

bandwidth: up: 10 mbps #VPS上行带宽 down: 4 mbps #VPS下行带宽

tls: sni: baidu.com # 伪装网站 insecure: true

socks5: listen: 127.0.0.1:1080 #passwall 监听端口1080 http: listen: 127.0.0.1:8080 #passwall 监听端口1080

– 【6】Summary –

部署Hysteria 2在OpenWRT软路由之后,开个CCTV还是奇慢,但是至少解决了扫地机器人联网问题。

进阶玩法可以继续在Hysteria 2通道上封装wireguard;嗯,这个就不折腾了。

–【7】Tips –

  1. WireGuard on pfSense
  2. wireguard on Edgerouter
  3. wireguard on MikroTik
  4. wireguard on Ubuntu
  5. wireguard 官网
  6. Shadowsocks Windows
  7. Hysteria 2
  8. Passwall

AD

S