我想要解决的问题
我有一个配置文件,我不想更改,因为它在很多人之间共享,并由其他人管理。它有类似这样的条目:
serviceAlpha: localhost:8081
serviceBravo: localhost:8082
serviceCharlie: localhost:8083
...
我希望将每个本地端口映射到远程主机和端口,而无需通过 SSH 登录(隧道)。
例如:
localhost:8081 -> serviceAlpha:8080
localhost:8082 -> serviceBravo:8080
localhost:8083 -> serviceCharlie:8080
...
我尝试过
我读到/etc/hosts
无法解决这个问题。
我曾尝试使用pf
(参见这里):
echo "
rdr pass inet proto tcp from any to any port 8081 -> serviceAlpha port 8080
" | sudo pfctl -ef -
当我运行时pfctl -s nat
,我得到:
No ALTQ support in kernel
ALTQ related functions disabled
rdr pass inet proto tcp from any to any port = 8081 -> ww.xx.yy.zz port 8080
当我运行时curl -X GET http://localhost:8081/
,我得到。当我用Failed to connect to localhost port 8081: Operation timed out
替换 时,也会出现同样的情况。localhost
127.0.0.1
当我运行时curl -X GET http://ww.xx.yy.zz:8080/
,我得到了预期的响应。
我也尝试了各种socat
命令,包括:
socat tcp-listen:8081 tcp:ww.xx.yy.zz:8080
curl -X GET http://127.0.0.1:8081/health
> curl: (7) Failed to connect to 127.0.0.1 port 8081: Operation timed out
socat tcp:127.0.0.1:8081 tcp:ww.xx.yy.zz:8080
curl -X GET http://127.0.0.1:8081/health
> curl: (7) Failed to connect to 127.0.0.1 port 8081: Operation timed out
> socat: 2019/02/14 16:27:02 socat[31221] E connect(5, LEN=16 AF=2 127.0.0.1:8081, 16): Operation timed out
答案1
实现此目的的一种方法是使用Apache
和mod_proxy
。您可以查看有关如何设置的完整教程mod_proxy
这里(虽然是针对 Linux 的,但设置步骤应该类似)。请特别检查以下部分配置 Apache 代理。
因此我认为您可以为每个服务设置虚拟主机,并设置 apache 来监听 8081、8082、8083。
每个虚拟主机配置看起来像这样:
Listen 8081
<VirtualHost *:8081>
ProxyPreserveHost On
<Proxy *>
Order allow,deny
Allow from all
</Proxy>
ProxyPass / http://ww.xx.yy.zz:8080/
ProxyPassReverse / http://ww.xx.yy.zz:8080/
</VirtualHost>
答案2
您需要的命令是 iptables。命令如下:
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -i lo -p tcp --dport 8081 -j REDIRECT --to-destination 2.2.2.2:8080
iptables -t nat -A POSTROUTING -j MASQUERADE
我不认为您可以把主机名放入目标位置,但您可以尝试一下。这些更改不是持久的;您需要将它们放入启动时运行的脚本中才能持久保存。