对于我的本地工作环境,我想直接从其他地方的工作站访问我公司的所有服务器。为了让这变得真正有趣,唯一可能的访问是通过公司管理的笔记本电脑上的 VPN,并且笔记本电脑不允许连接到本地网络。
显然,没有 IT 部门可以帮助您解决此类问题。
答案1
答案2
有很多 ssh 隧道文档,但它们没有涵盖这个特定场景。
因此,为了从工作站<->笔记本电脑<->公司网络,我们需要在 N 上安装一个额外的系统,它充当路由器来连接独立的网络。
我们需要在笔记本电脑上添加一个具有 2 个网络端口的虚拟机。一个通过 NAT 连接到主机网络,另一个通过桥接连接到 LAN。
所以我们可以得到一个连接 W <-> VM1 <-> VM2 <-> N1 <-> N2 <-> CN
这可以通过 ssh 配置进行配置。一些伪造 IP 的示例。
W = 192.0.0.3 <LAN> VM1 = 192.0.0.2
VM1 = 192.0.0.2 <route> VM2 = 10.0.0.3
VM2 = 10.0.0.3 <NAT> NATRouter = 10.0.0.1
NR = 10.0.0.1 <nat2host> N1 = 20.0.0.4
N2 = 20.0.0.4 <vpnroute> CN 0.0.0.0/0
这是系统之间网络跃点的描述。
因此,要连接到 CN 中的服务器,我们需要解决 2 个单独的步骤。我们需要为中间跃点设置 ssh 配置。 .ssh/配置条目:
# reaching the VM
Host VM
User vmuser
IdentityFile ~/.ssh/vm_id_rsa
ForwardX11 yes
# reaching a host inside the CN
Host CNhost
User companyuser
IdentityFile ~/.ssh/cnhost_id_rsa
ForwardX11 yes
ProxyCommand ssh -A vm nc %h %p 2> /dev/null
另一个重要问题是虚拟机内的正确路由。到桥接 LAN 192.0.0.0/24 的路由需要具有比到 NAT 10.0.0.1 的默认路由更低的度量。
vm$ ip route
default via 10.0.0.1 metric 100
10.0.0.0/24 dev nat1 metric 100
192.0.0.0/24 dev bridge1 metric 99
现在有趣的情况是,当我们还想访问内部网络上的服务器时,该服务器只能从公司网络内部的服务器访问。经典的跳跃主机配置。为此,我们需要另一个 .ssh/config 条目
# reaching a host on a CN internal network
Host CNInternalhost
User cnInternalUser
IdentityFile ~/.ssh/cninternalhost_id_rsa
ForwardX11 yes
ProxyCommand ssh -A CNhost nc %h %p 2> /dev/null
现在我们应该能够简单地通过 ssh 进入 CNInternalhost。
如果没有,则需要检查路由表。 (例如缺少路线或错误的指标)
但我们还想直接从本地工作站访问此内部主机上的服务!
为此,我们现在使用 .ssh/config 中预配置的跃点创建隧道
ssh -L <portOnLocalhost>:CNInternalhost:<portOnCNInternalHost> CNhost
现在我们可以在 localhost:< portOnLocalhost > 上访问 CNInternalhost: < portOnCNInternalHost >
如果我们想在本地设置中重用额外的网络名称 (ServerX),我们可以在本地主机上为 LAN IP 添加一个主机别名,并为其创建一个额外的隧道。
echo 192.0.0.3 ServerX >> /etc/hosts
这还需要一个附加的 .ssh/config 条目:
# configuring another host on the CN internal network
Host serverX
User cnInternalUser
IdentityFile ~/.ssh/serverX_id_rsa
ForwardX11 yes
ProxyCommand ssh -A CNhost nc %h %p 2> /dev/null
通过这个 ssh 配置,我们现在可以创建一个像这样的隧道
ssh -L serverX:<portOnLocalhost>:serverX:<portOnLocalhost> CNhost
只要可以从 CNhost 访问 serverX。
我们可以做:
$ wget serverX:<portOnLocalhost>