在建立 SSH 隧道时向主机添加临时条目

在建立 SSH 隧道时向主机添加临时条目

当公司防火墙外时,我使用脚本通过 SSH 建立隧道并将我们的内部 wiki 公开到我的 OSX 机器。是否有命令可以在隧道设置后临时告诉 OSX 解析到我的本地端口?

我希望使用的序列是:

  1. 打开隧道 ssh -f external-proxy.example -L 8001:internal-wiki.example:8000 -N
  2. [在此做点什么]

  3. 输入 URL内部 wiki.示例:8000在我的浏览器中导致它透明地查看本地主机:8001

其他详情:

  • 我可以编辑/etc/hosts但这将是一个持久的变化。我只想在外面使用它
  • 我们不使用 SSL 或证书。

答案1

我有一个解决方案,将您的 ssh 命令包装到 bash 脚本中:

#!/bin/bash

function control_c {
    echo -en "\n## Caught SIGINT; Clean up /etc/hosts and Exit \n"
    sed -i '' "/internal-wiki/d" /etc/hosts
    exit $?
}

trap control_c SIGINT
trap control_c SIGTERM

(sleep 5; open http://internal-wiki.example:8001 &)&
echo '127.0.0.1 internal-wiki.example' >> /etc/hosts
ssh -L8001:internal-wiki.example:8000 -f external-proxy.example -N

解释:

  1. 在发出 Control-C 时执行清理的函数
  2. 陷阱 Control-C 和关闭
  3. 睡眠,告诉 osx 打开你的网站,走开(&符号)
  4. 添加条目到/etc/hosts
  5. 创建隧道
  6. 当你按下 ctrl-c 时,这些功能就会启动,并清除/etc/hosts 临时条目

答案2

创建临时主机条目:

rm /tmp/hosts
cp /etc/hosts /tmp/hosts
echo "127.0.0.1 example.com" >> /tmp/hosts
mount --bind /tmp/hosts /etc/hosts

删除临时主机条目(并返回持久主机文件):

umount -f /etc/hosts

或重启或关机。

答案3

如果这还不够,我很抱歉回答,我没有足够的声誉来在此发表评论。

我认为/etc/hosts可能是最好的选择。我不知道您的拆卸过程是什么,但您可以将删除/etc/hosts条目作为其中的一部分。
另外,我认为端口更改不会与/etc/hosts解决方案一起使用。您可以映射localhost:8000internal-wiki.example:8000吗?

然后,您可以添加类似的内容127.0.1.1 internal-wiki.example/etc/hosts并在停止隧道时删除该行,如下所示:(sed -i '' '/127.0.1.1 internal-wiki.example/d'当然,一定要在实时运行之前进行测试)。

http(s)://internal-wiki.example:8000这应该允许您在浏览器中使用。

这不是一个完美的解决方案,但我认为任何更好的解决方案(例如端口映射)都需要在本地运行的 http 代理。

值得一提的是,添加和删除主机条目是 Parallels 使虚拟机可通过主机名寻址的方式。以下是在我的虚拟机运行/etc/hosts时添加到我的主机名中的:xu17172.20.10.112 xu17.shared xu17 #prl_hostonly shared

当然运行nginx 代理可以很好地处理这个问题,但可能比您想要的设置要多一点?
根据 Web 应用程序的不同,使用 netcat 的更简单选项可能会有效。

# make fifo for second nc to transfer response back to first nc
mkfifo /tmp/proxy.pipe
nc -lk 8001 < /tmp/proxy.pipe | nc internal-wiki.example 8000 > /tmp/proxy.pipe

然后当你关闭隧道时,你可以终止该nc进程并删除/tmp/proxy.pipe

答案4

名称服务(DNS、ldap、/etc/hosts)不“解析端口”,而是解析主机名。这种说法并不完全正确,但此时进行适当的解释是无关紧要且耗时的。

由于 OSX 使用 BSD 内核,我猜它也可能“借用”了那里的很多其他代码。文件 ns 解析器默认从 /etc/hosts 读取,但在 Linux 和 BSD 上可以通过设置 HOSTALIASES 环境变量(在启动浏览器的 shell 中)来覆盖此设置,但这仅在名称中没有“.”时才有效。如果您可以使用名称中没有 . 的 URL,这将解决您的问题。

或者,您可以运行脚本来配置端口重定向,将发往 xxx.xxx.xxx.xxx:8000 的数据包重新路由到 127.0.0.1:8001,并将传入数据包反向路由。但这是一个相当笨拙的解决方案。

或者,您可以安装 squid 并使用自定义 url 重定向器来重写请求(如果您开始使用 https 也是可行的 - 但很棘手)。

一个更简洁的选项是通过 ssh 运行适当的隧道连接。我相信 osx 开箱即用不支持此功能,但有适用于 osx 的 openvpn 兼容附加组件

如果是我的话,我只需设置脚本来交换主机文件,将所有流量保持在一个端口上,并确保在启动时和 ssh 连接结束时交换默认配置。

相关内容