我在一个有多个位置的环境中工作,每个位置都有相同的 IP 寻址方案,也就是说,我们有许多机器(每个位置一台)共享相同的 IP 地址(但主机名不同)。当然,这些位置之间没有通信,也没有 DNS。我通过打开 VPN 隧道依次连接到每个位置。我的工作站是 Linux。
我正在尝试开发一个系统,以便让我在这个环境中尽可能安全地工作。我想直接使用主机名而不是 IP 地址,因为我们有一个容易记住的命名约定。到目前为止,我遇到的问题是:1) 错误地登录到另一台机器,因为隧道打开到错误的位置,2) ssh 在 known_hosts 中拥有一个具有相同 IP 但主机名不同的不同主机,并且拒绝连接。
到目前为止,我正在考虑为每个位置创建不同的 /etc/hosts 和 ~/.ssh/known_hosts 文件(例如 /etc/hosts.location1),并使用位置切换脚本通过复制针对我的目标位置定制的版本覆盖默认文件(例如 cp /etc/hosts.location1 /etc/hosts)来自动在这些文件之间切换。理想情况下,此脚本最终将与我用于打开到不同位置的 VPN 的软件集成。
我的问题是:有没有更好的方法可以做到这一点?我是否错过了 ssh 或 Linux 名称解析中的任何功能?
非常感谢。
编辑:这是一个生产环境,我正在寻找一个工作站解决方案来解决这个问题。
答案1
您提到您使用 VPN 连接到每个站点。每个站点是否可以有一个(或两个)DNS 服务器,这些服务器有自己的站点域(site1.mycorp.com、site2.mycorp.com),并使用类似 Bind views (http://www.zytrax.com/books/dns/ch7/view.html) 为 VPN 网络的命名主机提供 IP 地址?
这样,您可以为每个站点中的每个主机提供一个唯一的 FQDN(barney.site1.mycorp.com
和rubble.site2.mycorp.com
),并且只有当您通过 VPN 连接到正确的站点并且 Bind 视图响应时,这些主机才会正确解析。在每个站点中,barney.site1.mycorp.com
和rubble.site2.mycorp.com
可能具有相同的 IP 地址。但是,如果您连接到错误的 VPN,它们将无法在外部解析。
这不是一个“工作站”解决方案。但是,如果您有能力向每个站点添加节点(VM 或物理主机)(不一定需要成为生产的一部分),那么这可能是一个解决方案。如果您已经拥有可以轻松修改的生产 DNS,那么您可能已经能够利用现有的视图和命名。
答案2
你能在远程站点上做任何事情吗,比如将文件放入 $HOME 或编辑 bashrc?例如,我在一个站点的 /etc/bashrc 上有:
[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[SITE1 \u@\h \W]\\$ "
cat .site_name
这有助于避免歧义。例如,您可以将提示设置为包含,如果您可以安装该文件。
还可以使用 .ssh/config 来定义主机名。你可以:
Host app1.site1
HostName 10.11.12.13
User service
等等,然后使用ssh app1.site1
并依赖严格的主机密钥检查来保证您的安全。我假设 sshd 被允许创建自己的主机密钥。如果机器有相同的主机密钥,那么您将遇到麻烦。
最后,您可以编写一个 ssh 包装器脚本。查阅路由表 ( netstat -nr
) 以查找 VPN 端点并根据端点 IP 禁止错误行为。大致来说:safe_ssh site hostname
除了轮换您的 known_hosts 文件之外,如果您的远程网络的目标不是您指定的站点值,则会出现错误消息。如果您希望脚本也能启动和关闭 VPN,那么您可能可以使用 ssh 连接多路复用来解决一些问题。
答案3
为每台机器提供唯一的 IP(以及它的通用 IP,大概是 RFC 1918 IP)是一种解决方案吗?我们使用这种方法,我们有许多具有 RFC 1918 IP 别名的机器,但它们都有一个唯一的“公共”IP。