当公司防火墙外时,我使用脚本通过 SSH 建立隧道并将我们的内部 wiki 公开到我的 OSX 机器。是否有命令可以在隧道设置后临时告诉 OSX 解析到我的本地端口?
我希望使用的序列是:
- 打开隧道
ssh -f external-proxy.example -L 8001:internal-wiki.example:8000 -N
[在此做点什么]
输入 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
解释:
- 在发出 Control-C 时执行清理的函数
- 陷阱 Control-C 和关闭
- 睡眠,告诉 osx 打开你的网站,走开(&符号)
- 添加条目到
/etc/hosts
- 创建隧道
- 当你按下 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:8000
到internal-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
时添加到我的主机名中的:xu17
172.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 连接结束时交换默认配置。