我需要将可公开访问的主机上的一些端口不断转发到防火墙后面的服务器。
我目前正在使用 autossh 从服务器连接到在 GKE 上运行的 openssh 容器并根据需要转发端口:
/usr/bin/autossh \
-y \
-v \
-i <ssh key> \
-M 0 \
-q \
-o 'ServerAliveInterval 60' \
-o 'ServerAliveCountMax 3' \
-p <alternative ssh port> \
-l <user name> \
<name resolving (locally) to GKE public IP address> \
-R 30000:localhost:6000
'while true; do echo were up; sleep 10; done' # this is done to generate a minimal amount of traffic.
问题是,有时当连接断开时,autossh 会重新连接但无法再次设置转发。但它不会失败,因此不会重试。当我停止 autossh 并尝试在这种情况下连接时,仅使用 ssh (-vvv),我收到一条警告消息,提示端口已在使用中。
问题:
有没有更好的方法可以继续将端口转发到防火墙后面的服务器(安全地)
为什么连接断开后端口不会立即释放,我可以强制以某种方式释放它吗,或者至少断开连接并重试直到它被释放?
答案1
这是因为您连接的主机可能没有意识到之前的连接已经断开,并且仍在使用该端口。虽然新的 autossh 连接会成功,但它不会打开隧道,并且 autossh 不会重新启动,因为它认为连接正常。
使用 autossh 时有两个特别有用的 OpenSSH 选项:
ExitOnForwardFailure=yes在客户端,当 autossh 假定连接已正确设置时,确保转发成功。
客户端存活间隔在服务器端,确保如果客户端的连接关闭,则服务器端的监听套接字也关闭。
将 autossh 命令替换为:
-o “服务器存活计数最大 3” 和 -o “ServerAliveCountMax=3”
-o “服务器存活间隔 60” 和 -o “服务器存活间隔 =60”
这“=”标志至关重要
例子:
autossh -M 0 -q -f -gNC -o “ServerAliveCountMax=3” -o “ServerAliveInterval=60” -o “ExitOnForwardFailure=yes” -R xxxx:localhost:22 auto ssh@remotehost