nixp.ru v3.0

20 октября 2017,
пятница,
06:30:42 MSK

DevOps с компанией «Флант»
vinport написал 16 декабря 2008 года в 00:32 (2681 просмотр) Ведет себя неопределенно; открыл 1 тему в форуме, оставил 1 комментарий на сайте.

Есть 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?

Dmitry.Stolyarov

Грабли скорее всего в loopback. Сам никогда не сталкивался и на проблему такую не наталкивался…

Я бы рекомендовал поискать в google по такому запросу:

http://www.google.com/search?hl=en&q=iptables+dnat+loopback

P.S. Как найдешь разгадку — сообщи, интересно.

Dmitry.Stolyarov

А вообще странная кулибяка. Проверил у себя, все работает…

Вот сервисы, что-то слушающие:

# 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

Dmitry.Stolyarov

Так. А виртуальная машина… это не совсем обычный случай… там у тебя какая-то вирт сетевка должна быть, так?

Можешь сдампить, что там происходит во время запуска telnet… как-то так:

# tcpdump -i <имя интерфейса> -n

(команду применить к lo и к «вирт сетевке», если есть… или на чем там висит WIN комп)

vinport

Вот так реализована сетка:

$ 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 — поменяю принцип работы, а пока будет вот так.

Dmitry.Stolyarov

Что касается общего способа решения таких проблем — внимательный анализ того, что-же там происходит. Для этого прекрасно походит tcpdump, рекомендую с ним хорошенько разобраться. Ну и есть Wireshark (бывший Ethereal), правда я его для таких задач ни разу не использовал (на сервере обычно нет GUI).

DmitryStolyarov

У меня трабла типа того,

нужно чтобы с внешки подключались на определенный порт компа внутри сети

типа 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ом ответы получаю

что может быть не так?

DmitryStolyarov

о блин полный тёска…

Dmitry.Stolyarov

А откуда проверяешь? Если из локалки 192.168.2.0/24 пытаешься подключиться к  85.34.х.х:3245 — то не удивительно, что не работает. Там такая штука происходит:

  • С компа A (192.168.2.50) идет запрос на 85.34.х.х:3245.
  • Шлюз получает запрос и делает DNAT, посылая при этом запрос компу B (на адрес 192.168.2.3).
  • Комп B получает запрос и отвечает, но не шлюзу — а напрямую компу A (так как запрос от роутера пришел с source_ip 192.168.2.50).
  • Комп A получив ответ от компа B отбрасывает его, так как ожидает ответ от роутера с адреса 85.34.х.х:3245.

Для того, чтобы такую бяку вылечить — надо сделать дополнительный натинг (предполагается, что 192.168.2.1 — адрес шлюза в локалке):

-A POSTROUTING -p tcp -m tcp --dport 3245 -d 192.168.2.3 -j SNAT --to-source 192.168.2.1 


 

Если мои предикторские способности подвели и проблема не в этом — тебе должен помочь tcpdump.

Повызывать его стоит следующим образом (подставив вместо XXX названия интерфейсов шлюза — внешнего и внутреннего; вместо YYY — адрес компа, с которого идет запрос):

tcpdump -i XXX -n \(host 85.24.x.x or host 192.168.2.1 or host YYY\) and tcp and port 3245


 

DmitryStolyarov

те правила что я написал работают :) только нужно было указать машине с поднятым сервисом в сетевых настройках шлюзом 85.34.х.х… без шлюза не работало… хотя впринципе и у машины и у инет-шлюза локальная подсеть одна..

DmitryStolyarov

тьфу… «шлюзом 85.34.х.х…» = локальный ip шлюза

DmitryStolyarov

у меня другая загадка… почему то в tcpdump ВООБЩЕ не отображается запросов на порт 3245… любой другой порт ставлю кажется что творится… про этот молчок..

На  инет-шлюзе два прова одновременно работающих… так вот через одного идет, через второго нет… есть похожий сервис он работает… этот-нет..

Два инета работают благодаря скрипту который создаёт две таблицы маршрутизации… через второго прова почему работает только SSH и TELNET (пробовал RDP, Radmin не пашуть… :( )

Мой сервис вроде работает по telnet но на 100% утверждать не буду… XSPIDER 7 сказал что telnet там..

вот и думаю почему же через второй не работает ;(

DmitryStolyarov

написал 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

и больше ничего… перепроверил трижды только от запуска софта строки появляются..

может поможет понять мою проблему