我想要解决的问题

我想要解决的问题

我想要解决的问题

我有一个配置文件,我不想更改,因为它在很多人之间共享,并由其他人管理。它有类似这样的条目:

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替换 时,也会出现同样的情况。localhost127.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

实现此目的的一种方法是使用Apachemod_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

我不认为您可以把主机名放入目标位置,但您可以尝试一下。这些更改不是持久的;您需要将它们放入启动时运行的脚本中才能持久保存。

相关内容