我认为我正在尝试做的是 SSH 隧道。我有点困惑这是否真的是我想要做的。
我想在端口上设置隧道1234在服务器 A。服务器 A通过端口转发所有连接1234到服务器 B在港口5678。这可以用 SSH 来实现吗?
基本上,我想从本地计算机通过位于公共网络上的主服务器访问本地网络上的辅助服务器,而无需登录主服务器。
我还希望隧道只允许非 root 用户连接到私有服务器。它应该像正常登录 SSH 时一样进行身份验证。需要确保这也适用于 WinSCP,以便客户端可以通过公共 IP 地址正确访问私有框上的帐户。
答案1
@RolandW 的建议是正确的,并且只有当专用网络上的服务器 B 可以从服务器 A 直接访问时才会起作用,IE当且仅当服务器 B不是位于防火墙和 NATting 路由器后面。
如果这两个假设中有一个是错误的,那么你必须使用不同的解决方案。在这种情况下,由于 B 是不是您可以从 A 直接访问,您必须建立从 B 到 A 的反向隧道,然后才能从家里访问 B。
在服务器 B 上,
将此行添加到
/etc/rc.local
su -c /home/your_name/bin/auto your_name
在 中创建一个名为 auto 的可执行文件
/home/your_name/bin
,名为auto
,内容如下:#!/bin/sh /usr/lib/autossh/autossh -M 6321 -f -p 22 -2 -N -D -R 8100:localhost:22 your_name_o_server_A@IP_address_of_server_A -i /path/to/cryptokey/of_server_A
命令自动SSH是一个非常方便的实用程序,每次出现故障(断电、重启等)时,它都会自动重新启动 ssh 隧道;为此,它使用端口(在我的情况下是 6321)来检查连接的状态。您完全可以使用不同于 6321 的 TCP 端口(但要大于 1024!),只需确保它在服务器 A 上处于打开状态即可。
上述命令假定您已经启用通过加密密钥进行的身份验证,您肯定应该这样做。
在服务器 A 上,您必须引入以下行
GatewayPorts yes
在文件中
/etc/ssh/sshd_config
。这需要sudo 权限。最后,您可以按照以下步骤从家里进行连接:
ssh -YC -t -t -p 22 -i /path/to/cryptkey/of_server_A \ your_name_o_server_A@IP_address_of_server_A \ "ssh -Y your_name_on_server_B@localhost -p 8100 -i /path/to/cryptkey/of-server_B"
当然,建立别名会使上述调用更快,从而更加方便。
答案2
我假设您想要获得对服务器 B 的 SSH 访问权限,服务器 B 位于连接到(公共)服务器 A 的专用网络上。服务器 B 运行一个在端口 5678 上监听的 ssh 守护程序。
为此,您可以在公共服务器上创建端口转发,将到达端口 1234 的 TCP 数据包转发到 server-b:5678。根据https://serverfault.com/questions/140622/how-can-i-port-forward-with-iptables可以在运行 iptables(netfilter)的 Linux 机器上使用以下命令完成此操作
iptables -t nat -A PREROUTING -p tcp -i <WAN interface> --dport 1234 -j DNAT --to-destination <server-b-IP>:5678
iptables -A FORWARD -p tcp -d <server-b-IP> --dport 5678 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
第一条规则重写目标地址,第二条规则允许修改后的数据包传送到其目的地。假设服务器 B 的默认网关是服务器 A。