У меня есть служба, работающая на 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>
Готово !