我正在尝试使用 SSH 服务器作为网关来连接超过一个内部服务器。此处的内部服务器是指不可直接访问的服务器,它们没有分配公共 IP。
因此场景应该是这样的(例如有 2 台服务器,可能更多),网关的公共 IP 为 123.456.789.45,内部 IP 为 10.12.40.13
+--------+ +---------+ +----------+
| client |--> 2214/tcp --> | | --> 22/tcp --> | Server 1 |
+--------+ | | +----------+
| Gateway |
+--------+ | | +----------+
| client |--> 2215/tcp --> | | --> 22/tcp --> | Server 2 |
+--------+ +---------+ +----------+
我的第一个方法是设置它们从网关到服务器类似于
ssh -N -L 123.456.789.45:2214:127.0.0.1:22 tunnel-user@server1
ssh -N -L 123.456.789.45:2215:127.0.0.1:22 tunnel-user@server2
虽然这可行,但我偶然发现隧道不太可靠,时不时会失败。合乎逻辑的下一步是尝试运行autossh
。在这里我遇到了很多问题。第一个隧道可以毫无问题地建立,使用
autossh -M 20000 -f -N -L 123.456.789.45:2214:127.0.0.1:22 tunnel-user@server1
我可以通过外部连接到端口 2214 的网关来访问服务器 1。但是我无法使用 autossh 启动并运行第二个服务器。经过几个小时的折腾,我决定反过来尝试。所以:
第二种方法是设置它们从服务器到网关. 再次,使用纯 ssh 的变体可以使用类似这样的方法...
ssh -R 123.456.789.45:2214:127.0.0.1:22 tunnel-user@gateway # <- init from server 1
ssh -R 123.456.789.45:2215:127.0.0.1:22 tunnel-user@gateway # <- init from server 2
... 使用 autossh 失败。
autossh -M 20000 -f -R 123.456.789.45:2214:127.0.0.1:22 tunnel-user@gateway
日志文件什么都没说。Syslog 至少提供了
ssh exited prematurely with status 0; autossh exiting
现在有人知道如何autossh
通过这两种方法解决这个问题吗?有没有类似的东西autossh
我可以尝试一下?有没有办法实现上面提到的纯 ssh 版本的刷新之类的功能?
所有涉及的服务器均运行 Ubuntu 10.04 LTS 和 autossh 1.4b 的最新更新
答案1
来自 autossh 文档:
autossh 使用 ssh 构建一个 ssh 转发循环(一个从本地到远程,一个从远程到本地),然后发送它期望返回的测试数据。
-M port[:echo_port] 指定要使用的基本监控端口。如果没有回显端口,则此端口及其上方的端口(端口 + 1)应该是其他端口未使用的端口。autossh 将在基本监控端口上发送测试数据,并在上面的端口上接收数据。例如,如果您指定“-M 20000”,autossh 将设置转发,以便它可以在端口 20000 上发送数据并在 20001 上接收数据。
如果您两次使用 -M 20000,则此操作必定会失败。为此使用不同的端口(它们之间留一个端口空间,因此 -M 20000 和 -M 20002 可以工作)。我建议执行“man autossh”并阅读 autossh 的文档,它也可以在线获取:http://www.manpagez.com/man/1/autossh/。如果您使用大量 autossh 隧道,您可以设置专用的 echo 服务(再次来自 autossh 文档):
或者,可以指定远程回显服务的端口。如果您希望使用标准 inetd 回显服务,则该端口应为 7。指定回显端口后,仅使用指定的监视端口,并且该端口在两个方向上传送监视消息。这允许 autossh 验证连接,而无需阻塞远程端每个隧道的端口。
如果您想为此使用 xinetd,以下是我的 echo 服务声明:
service echo
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/bin/cat
log_on_failure += USERID
only_from = 127.0.0.1
disable = no
}
然后您可以在不同机器的所有隧道上使用 -M 20000:7。如果一台机器上有多个隧道,请使用多个 -L 或 -R 选项,或使用不同的端口,如 -M 20002:7
答案2
您可以在同一个 ssh 命令上指定两个隧道。
ssh -R 123.456.789.45:2214:127.0.0.1:22 -R 123.456.789.45:2215:127.0.0.1:22 tunnel-user@gateway
或者您可以尝试在 .ssh/config 中添加隧道,如下所述,这样命令行就不会太拥挤:
host server1
RemoteForward 123.456.789.45:2214:127.0.0.1:22
RemoteForward 123.456.789.45:2215:127.0.0.1:22
答案3
您可以配置多条隧道在自动SSH的配置文件。不幸的是,它没有很好的文档记录。对于两个隧道,使用您提供的详细信息,并基于 PubkeyAuthentication,我会这样做(SuSE 11 SP 4):
In /etc/sysconfig/autossh
# Number of autossh instances to spawn on start.
AUTOSSH_SPAWNS="3"
# All options except for the first must end with "_<number>"
AUTOSSH_OPTIONS_1="tunnel-user1@server1 \
-i /home/tunnel-user1/.ssh/id_rsa \
-M 0 -f -N -L2214:127.0.0.1:22 -o ExitOnForwardFailure=yes \
-o ServerAliveInterval=60 -o ServerAliveCountMax=3
-o StrictHostKeyChecking=no"
AUTOSSH_OPTIONS_2="tunnel-user2@server2 \
-i /home/tunnel-user2/.ssh/id_rsa \
-M 0 -f -N -L2215:127.0.0.1:22 -o ExitOnForwardFailure=yes \
-o ServerAliveInterval=60 -o ServerAliveCountMax=3
-o StrictHostKeyChecking=no"
当然,与成功建立 ssh 连接相关的其他所有事项都必须到位
/home/tunnel-user[1|2]/.ssh/authorized_keys
服务器文件中的隧道用户的公钥- 隧道用户必须存在于网关和服务器上
- 并配置在
/etc/ssh/sshd_config
- 网关的 sshd_config也
AllowTcpForwarding
必须设置yes
PermitTunnel
答案4
不知道 autossh ....
但是为什么你不尝试 ssh 配置选项 ProxyCommand?(http://undeadly.org/cgi?action=article&sid=20070925181947)
您需要在客户端中像这样配置 .ssh/config:
Host Server1
HostName Server1
ProxyCommand ssh gateway:2214 nc %h %p 2> /dev/null
祝你好运!