Что я хочу решить

У меня есть файл конфигурации, который я не хочу менять, потому что он используется многими людьми и управляется кем-то другим. У него есть записи, похожие на это:

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

2 ответа2

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>
0

Команда, которую вы хотите, это 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

Я не верю, что вам разрешено указывать имя хоста в месте назначения, но вы можете попробовать. Эти изменения не являются постоянными; вам нужно поместить их в скрипт, который запускается при запуске для сохранения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .