Есть 2 компьютера в локальной сети:
LIN (192.168.0.158) — рабочий компьютер с ОС Ubuntu 8.04
WIN (192.168.0.127) — виртуальная машина на компе LIN под virtualbox, на ней WinXP с программой, которая прослушивает порт 2803
Задача:
Законнектиться с компьютера LIN на порт 2803 компьютера WIN командой:
telnet 127.0.0.1 2803
Т.е. обязательно обращение именно на 127.0.0.1:2803 и никуда больше!
Предварительно проверяем:
telnet 192.168.0.127 2803
Работает.
Пробрасываем порты локалхоста:
sudo iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp -m tcp --dport 2803 -j DNAT --to-destination 192.168.0.127
$ telnet 127.0.0.1 2803
Trying 127.0.0.1…
И получаем висящее соединение, неудача. Такое ощущение, что telnet ожидает и никак не может получить ответ на запрос.
Добавлялись разные варианты типа:
sudo iptables -t nat -A POSTROUTING -p tcp --dport 2803 -d 192.168.0.127 -j SNAT --to-source 127.0.0.1
sudo iptables -t nat -A POSTROUTING -p tcp --dport 2803 -d 192.168.0.127 -j MASQUERADE --to-ports 2803
но это тоже не помогает.
Для теста пробрасываем порты для внешнего IP компьютера LIN:
sudo iptables -t nat -A OUTPUT -d 192.168.0.158 -p tcp -m tcp --dport 2803 -j DNAT --to-destination 192.168.0.127
$ telnet 192.168.0.158 2803
Trying 192.168.0.158…
Connected to 192.168.0.158.
…
т.е. это работает, но нам нужно обращение именно через 127.0.0.1
Где грабли? Почему с локалхоста не получается пробросить порт, не обращаясь к его внешнему IP?
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Грабли скорее всего в loopback. Сам никогда не сталкивался и на проблему такую не наталкивался…
Я бы рекомендовал поискать в google по такому запросу:
http://www.google.com/search?hl=en&q=iptables+dnat+loopback
P.S. Как найдешь разгадку — сообщи, интересно.
А вообще странная кулибяка. Проверил у себя, все работает…
Вот сервисы, что-то слушающие:
# netstat -natup | grep LISTEN
tcp 0 0 127.0.0.1:16001 0.0.0.0:* LISTEN 5170/esound-esd
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 4848/mysqld
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4938/apache2
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 5111/cupsd
Вот бросаем портик:
# iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp -m tcp --dport 81 -j DNAT --to-destination 192.168.12.6:80
И вот получаем:
# telnet 127.0.0.1 81
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is '^]’.
GET / HTTP/1.1
HTTP/1.1 400 Bad Request
…
…
Так. А виртуальная машина… это не совсем обычный случай… там у тебя какая-то вирт сетевка должна быть, так?
Можешь сдампить, что там происходит во время запуска telnet… как-то так:
# tcpdump -i <имя интерфейса> -n
(команду применить к lo и к «вирт сетевке», если есть… или на чем там висит WIN комп)
Вот так реализована сетка:
$ ifconfig
br0 Link encap:Ethernet HWaddr 00:14:2a:92:7a:97
inet addr:192.168.0.158 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::214:2aff:fe92:7a97/64 Диапазон:Ссылка
ВВЕРХ BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:127 errors:0 dropped:0 overruns:0 frame:0
TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
коллизии:0 txqueuelen:0
RX bytes:12280 (11.9 KB) TX bytes:5235 (5.1 KB)
eth0 Link encap:Ethernet HWaddr 00:14:2a:92:7a:97
inet6 addr: fe80::214:2aff:fe92:7a97/64 Диапазон:Ссылка
ВВЕРХ BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:8142 errors:0 dropped:0 overruns:0 frame:0
TX packets:4800 errors:0 dropped:0 overruns:0 carrier:0
коллизии:0 txqueuelen:1000
RX bytes:6563147 (6.2 MB) TX bytes:636126 (621.2 KB)
Прервано:16 Base address:0xa000
lo Link encap:Локальная петля (Loopback)
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Диапазон:Узел
ВВЕРХ LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:1626 errors:0 dropped:0 overruns:0 frame:0
TX packets:1626 errors:0 dropped:0 overruns:0 carrier:0
коллизии:0 txqueuelen:0
RX bytes:81300 (79.3 KB) TX bytes:81300 (79.3 KB)
tap1 Link encap:Ethernet HWaddr 00:ff:2b:13:cc:00
inet6 addr: fe80::2ff:2bff:fe13:cc00/64 Диапазон:Ссылка
ВВЕРХ BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:321 errors:0 dropped:0 overruns:0 frame:0
TX packets:365 errors:0 dropped:5 overruns:0 carrier:0
коллизии:0 txqueuelen:500
RX bytes:96730 (94.4 KB) TX bytes:180483 (176.2 KB)
Спасибо большое за попытку помочь, поигрался еще полдня и понял, что не всегда надо делать «как надо», порой лучше сделать «как проще».
И нашел плагин к браузеру, локально подменяющий в исходниках конкретной загружаемой веб-странички строку «127.0.0.1» на «192.168.0.127».
Неуниверсально, зато просто в реализации.
Если найдется простое решение для iptables — поменяю принцип работы, а пока будет вот так.
Что касается общего способа решения таких проблем — внимательный анализ того, что-же там происходит. Для этого прекрасно походит tcpdump, рекомендую с ним хорошенько разобраться. Ну и есть Wireshark (бывший Ethereal), правда я его для таких задач ни разу не использовал (на сервере обычно нет GUI).
У меня трабла типа того,
нужно чтобы с внешки подключались на определенный порт компа внутри сети
типа 85.34.х.х коннектиться на порт 3245 инет-шлюза и тот его пробрасывает на 3245 компа с ip 192.168.2.3..
прописал в iptables инет-шлюза
-A PREROUTING -p tcp -m tcp --dport 3245 -j DNAT --to-destination 192.168.2.3
-A FORWARD -d 192.168.2.3 -p tcp --dport 3245 -j ACCEPT
не работает, :( с локальной машины telnetом ответы получаю
что может быть не так?
о блин полный тёска…
А откуда проверяешь? Если из локалки 192.168.2.0/24 пытаешься подключиться к 85.34.х.х:3245 — то не удивительно, что не работает. Там такая штука происходит:
Для того, чтобы такую бяку вылечить — надо сделать дополнительный натинг (предполагается, что 192.168.2.1 — адрес шлюза в локалке):
Если мои предикторские способности подвели и проблема не в этом — тебе должен помочь tcpdump.
Повызывать его стоит следующим образом (подставив вместо XXX названия интерфейсов шлюза — внешнего и внутреннего; вместо YYY — адрес компа, с которого идет запрос):
те правила что я написал работают :) только нужно было указать машине с поднятым сервисом в сетевых настройках шлюзом 85.34.х.х… без шлюза не работало… хотя впринципе и у машины и у инет-шлюза локальная подсеть одна..
тьфу… «шлюзом 85.34.х.х…» = локальный ip шлюза
у меня другая загадка… почему то в tcpdump ВООБЩЕ не отображается запросов на порт 3245… любой другой порт ставлю кажется что творится… про этот молчок..
На инет-шлюзе два прова одновременно работающих… так вот через одного идет, через второго нет… есть похожий сервис он работает… этот-нет..
Два инета работают благодаря скрипту который создаёт две таблицы маршрутизации… через второго прова почему работает только SSH и TELNET (пробовал RDP, Radmin не пашуть… :( )
Мой сервис вроде работает по telnet но на 100% утверждать не буду… XSPIDER 7 сказал что telnet там..
вот и думаю почему же через второй не работает ;(
написал tcpdump по твоей подсказке
в момент подключения к порту появляется запись
13:18:07.805426 IP 213.87.194.75.12294 > 85.34.х.х.interserver: S 1204372590:1204372590(0) win 4407 <mss 1360,sackOK,wscale 0,nop,timestamp 3226312 0>
13:18:07.805456 IP 85.34.х.х.interserver > 213.87.194.75.12294: R 0:0(0) ack 1204372591 win 0
и больше ничего… перепроверил трижды только от запуска софта строки появляются..
может поможет понять мою проблему