一般大家在翻墙时采用的 vpn 节点可能是节点服务商买的现成节点,他们提供可订阅的地址,直接通过 Clash 或纸飞机订阅。
因为考虑到是别人的机器,流量需要经过他们机器代理,担心数据安全隐私性问题。如果墙外机器是我自己的机器,那就放心了,所以我买了阿里云香港、新加坡等这种墙外机器来用于翻墙。
但若机器上直接搭建 vpn 服务如纸飞机,阿里云会直接封禁。所以采用了最直接“ssh代理”的方式翻,无需搭建任何服务。
如本地直接ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=60 -D 6666 -f -q -C -N aliyun.singapor
后即可通过 6666 端口进行流量的转发,由该新加坡机器代替请求墙外资源。
多数 Linux 命令也支持这种方式进行代理加速,可见 https://blog.humh.cn/?p=908
Chrome 也可通过 SwitchyOmega 插件配置 socks 代理进行翻墙

对于 Mac 来说,一般我们通过 Terminal 或 Iterm 等工具开启一个会话,在其中输入 ssh 命令完成 socks 代理,但这个进程是挂在开启会话下,若该会话结束代理也就结束了,否则一直不能关闭会话。当然我们能使用 tmux 等手段挂在后台上,但若电脑重启仍需手动再敲一遍命令。
于是就寻思可通过定时任务无论任何时候都能自动运行命令,但非每次都需新 ssh,仅在原先 ssh 已失效再重试。
下方是核心的 shell 脚本,会记录日志。当代理无法成功时会弹窗提示。
#!/usr/bin/env bash job_log=$(dirname $0)/keep_vpn.log echo "$(date) vpn job start ==============>" >> ${job_log} # 如果端口不通,则说明ssh sockets链接已断。先清除遗留进程,然后重新链接。 result=$(nc -w 1 127.0.0.1 -z 6666 2>&1 | grep 'Connection to 127.0.0.1 port 6666 \[tcp/\*\] succeeded!' | wc -l | sed 's/ //g') notifaction(){ osascript <<EOF tell application "System Events" activate display alert "vpn error" message "$1" end tell EOF } if [ ${result} != "1" ] then old_vpn_proccess_id=$(ps aux | grep '6666' | grep 'ssh' | awk -F ' ' '{print $2}') if [[ ${old_vpn_proccess_id} ]] then echo "$(date) have old_vpn, id -> ${old_vpn_proccess_id}" >> ${job_log} echo ${old_vpn_proccess_id} | xargs -I {} kill {} # 如果进程仍存活,则报警,需排查杀死失败的原因 if [ $(echo ${old_vpn_proccess_id} | xargs -I {} ps {} | wc -l | sed 's/ //g') -gt "1" ] then notifaction 'kill old proccess error!! please check' fi fi # 如果墙可用(墙不可用,基本是因为被网络运营商限制),再ssh,否则不尝试 ping_error_count=$(ping -c 1 -t 10 aliyun.singapore | grep '100% packet loss' | wc -l | sed 's/ //g') if [ ${ping_error_count} -ne "0" ] then echo "fuck!! ip unavailable!!" >> ${job_log} exit 1 fi ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=60 -D 6666 -f -q -C -N aliyun.singapore if [ $? != "0" ] then notifaction 'ssh singapore failure for vpn!! please check' fi fi
开启定时任务(开机自启)
humh@MacBook-Pro-2 ~ crontab -l * * * * * cd /Users/humh/cron_job_sh && ./keep_vpn.sh >> /Users/humh/cron_job_sh/keep_vpn.log 2>&1
现存 BUG:Mac未完全睡眠仍在工作情况,点击了“睡眠”合上电脑后但误触导致“唤醒”但已无网后会一直弹窗(弹窗个数取决于期间定时任务已执行次数),实际预期定时任务睡眠期间应停止,暂未研究排查。

对于 Windows 来说,一般我们通过 Xshell 来完成 ssh 机器连接而非本地终端会话。Xshell 可通过会话配置就能完成自动重试且 socks 端口暴漏,无需任何开发。
发表评论