绕过 VPN 转发端口

绕过 VPN 转发端口

我有以下设置:

  1. 可接入互联网的路由器
    • 公共静态 IP 地址
    • 低功能性
    • 具有“端口转发”功能
    • 本地 IP 地址:192.168.1.1
  2. Linux 服务器(Ubuntu)连接到 VPN 服务(我无法控制),作为客户端的网关(3)
    • 接口 enp0s3:网关:192.168.1.1;IP 地址:192.168.1.10
    • 接口 tun0-VPN 连接
  3. Windows 7 客户端
    • 网络接口:网关:192.168.1.10;IP地址:192.168.1.8

服务器上的 iptables 规则(2):

*nat
:PREROUTING ACCEP T [443:55918]  
:INPUT ACCEPT [21:3328]
:OUTPUT ACCEPT [22:1600]
:POSTROUTING ACCEPT [73:4883]
-A POSTROUTING -s 192.168.1.8/32 -o tun0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [2135:1080592]
:FORWARD ACCEPT [846:190487]
:OUTPUT ACCEPT [1592:396526]
-A FORWARD -s 192.168.1.8/32 -i tun0 -o enp0s3 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.1.8/32 -i enp0s3 -o tun0 -j ACCEPT
COMMIT

如何通过外部路由器的地址将 SSH 连接的端口转发到客户端?(我无法通过 VPN 执行此操作)。

答案1

通过保留 SSH 连接可以轻松完成此操作。

服务器上的准备:

我假设您已经cron安装并正在运行。创建一个/etc/cron.hourly包含以下内容的新文件:(不要忘记chmod +x文件!)

#!/bin/bash
cstate=$(netstat -na | grep "tcp" | grep "<IP-of-home-machine>:22" | tr -s " " | cut -d " " -f 6 | head -n 1)
cdate=$(date "+%Y-%m-%d %H:%M:%S")
if [[ $cstate == "ESTABLISHED" ]] || [[ $cstate == "TIME_WAIT" ]]
then
    echo "[$cdate] SSH connection up. ($cstate)" >> /var/log/check-ssh-relay.log
else
    echo "[$cdate] SSH connection broken. ($cstate) Reconnecting..." >> /var/log/check-ssh-relay.log
    ssh -N -f -R 12122:localhost:22 <username>@<IP-of-home-machine>
fi

这将每小时检查一次连接是否正常,如果连接不上,则尝试重新连接。当您家中的 PC 并非始终处于打开状态时,此功能非常有用。它将日志信息写入/var/log/check-ssh-relay.log。身份验证是通过 SSH 密钥完成的,因此请确保您提前正确设置了该密钥。

在家里的计算机上:

假设您已正确设置 openssh-server,那么您现在需要做的就是:

$ ssh <server-username>@localhost -p 12122

创建 SSH 连接。SCP、SFTP 等当然也可以使用。

如果出于安全原因您想要更改家用机器上的默认 SSH 端口,只需将:22上面的服务器端脚本替换为您选择的自定义端口。

相关内容