Назад | Перейти на главную страницу

пересылать входящий трафик локальному слушателю

У меня есть служба, работающая на localhost, которая прослушивает порт localhost: 10000

Я хочу перенаправить весь трафик, поступающий в publicip: 15000, на localhost: 10000, где изменение конфигурации службы недоступно.

Сервис слушает только localhost, но трафик идет извне.

Кстати, сервис работает на Linux.

Редактировать; Я попытался добавить такое правило NAT, но мне это не удалось.

Для настройки NAT я сделал;

iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables --table nat --append POSTROUTING --out-interface lo -j MASQUERADE
iptables -A FORWARD -i eth0 -o lo -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i lo -o eth0 -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
service ufw restart

И чтобы начать маршрутизацию выполните это;

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 15000 -j DNAT --to 127.0.0.1:10000

Как вы думаете, что мне не хватает?

заранее спасибо

Барис

Кажется, что DNAT для кольцевого трафика невозможен.

Трафик Loopback пропускает цепочки PREROUTING и OUTPUT.

RFC 5735 (страница 3) говорит, что сеть 127.0.0.0/8 не может быть маршрутизирован за пределы самого хоста:

127.0.0.0/8 - Этот блок предназначен для использования в качестве адреса обратной связи узла Интернета. Дейтаграмма, отправленная протоколом более высокого уровня на адрес в любом месте этого блока, возвращается в узел. Обычно это реализуется с использованием только 127.0.0.1/32 для обратной связи. Как описано в [RFC1122], раздел 3.2.1.3, адреса в пределах всего блока 127.0.0.0/8 законно не появляются ни в какой сети нигде.


Кроме того, трафик на loopback interface рассматриваются как Martian Packets :

эти пакеты не могут быть отправлены, как заявлено, или быть доставлены


Обходной путь:

Простая альтернатива - использовать inted сервер на стороне сервера, и его redirect характерная черта.

Таким образом, вы можете определить службу un в inetd и установите порт, на котором эта служба будет слушать. Затем установите redirect директива для привязки этого порта к 127.0.0.1:port.

В моем примере ниже я буду использовать xinetd (в Ubuntu 12.04 LTS) для привязки mysql сервер работает на 127.0.0.1:10000 :

Шаг 1 : Установите пакет: apt-get install xinetd

Шаг 2 : Отредактируйте файл конфигурации /etc/xinetd.conf

Добавьте определение службы, подобное приведенному ниже:

service my_redirector
{
 type = UNLISTED
 disable = no
 socket_type = stream
 protocol = tcp
 user = root
 wait = no
 port = 15000
 redirect = 127.0.0.1 10000
 log_type = FILE /tmp/somefile.log
}

Шаг 3 : Начать сначала xinetd демон: service xinetd restart

Шаг 4: давайте проверим слушателя на порту 15000 :

# netstat -anp | grep 15000
tcp     0      0 0.0.0.0:15000      0.0.0.0:*     LISTEN      4654/xinetd

Шаг 5: Добавьте свой iptables правила:

iptables -A INPUT -i eth0 -p tcp -d 192.168.0.60 --dport 15000 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -s 192.168.0.60 --sport 15000 -j ACCEPT

Давайте протестируем это:

Для тестирования у меня есть настройка mysql слушать на 127.0.0.1:10000. Я попытаюсь получить к нему доступ через xinetd обслуживание в порту 15000.

Во-первых, на стороне сервера я убеждаюсь, что mysql сервер только слушает 127.0.0.1:10000 :

# netstat -anp | grep :10000
tcp    0    0 127.0.0.1:10000    0.0.0.0:*      LISTEN      4247/mysqld

Затем, на стороне клиента, давайте проверим, можем ли мы подключиться через порт 15000 :

# telnet 192.168.0.60 15000
Trying 192.168.0.60...
Connected to 192.168.0.60.
Escape character is '^]'.
_
5.5.35-0ubuntu0.12.04.2-logD46S}<P`.6cr4ITIQ<wcmysql_native_password

Кажется, мы можем! :)

Попробуем подключиться к mysql сервер:

# mysql -h 192.168.0.60 --port=15000 -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 67
Server version: 5.5.35-0ubuntu0.12.04.2-log (Ubuntu)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Готово !