阿毛
It's me !
想你所想

VPN Socks代理Mac篇

一般大家在翻墙时采用的 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 代理进行翻墙

https://file.blog.humh.cn/wp-content/uploads/2025/02/20250208141942329-1024x218.png

对于 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未完全睡眠仍在工作情况,点击了“睡眠”合上电脑后但误触导致“唤醒”但已无网后会一直弹窗(弹窗个数取决于期间定时任务已执行次数),实际预期定时任务睡眠期间应停止,暂未研究排查。

https://file.blog.humh.cn/wp-content/uploads/2025/02/20250208154551295.png

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

humh

文章作者

站长本人,一个憨批!

发表评论

textsms
account_circle
email

想你所想

VPN Socks代理Mac篇
一般大家在翻墙时采用的 vpn 节点可能是节点服务商买的现成节点,他们提供可订阅的地址,直接通过 Clash 或纸飞机订阅。 因为考虑到是别人的机器,流量需要经过他们机器代理,担心数据…
扫描二维码继续阅读
2025-02-08