我有以下设置:
- 可接入互联网的路由器
- 公共静态 IP 地址
- 低功能性
- 具有“端口转发”功能
- 本地 IP 地址:192.168.1.1
- Linux 服务器(Ubuntu)连接到 VPN 服务(我无法控制),作为客户端的网关(3)
- 接口 enp0s3:网关:192.168.1.1;IP 地址:192.168.1.10
- 接口 tun0-VPN 连接
- 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
上面的服务器端脚本替换为您选择的自定义端口。