LINUX.ORG.RU
ФорумAdmin

Отладка NAT.


0

0

Собственно, странно работает NAT.

Вкратце - есть сетки 192.168.1.0, 192.168.0.0, 192.168.2.0, 192.168.8.0 и так далее.

Надо пробросить порт с внешнего айпи(известного) на 192.168.0.14

Пишу в iptables:

/sbin/iptables -t nat -A PREROUTING -p tcp -d MY.REAL.IP.ADDR --dport 8081 -j DNAT --to 192.168.0.14:80

Что получается?

Получается странная вещь. Из внешней сети(интернета) порт действительно видно. Его также видно из сетей 1,2,8. Его видно с других наших реальных IP.

Но его не видно из сети 192.168.0.0, то есть самой той сети, где находится искомый комп. (192.168.0.14).

Соответственно, как отладить эту штуку?

На PREROUTING поставил ULOG - так нормально форвардящийся пакет ничем не отличается от улетающего в никуда.

Lockywolf ★★★
() автор топика
Ответ на: комментарий от zgen

там предлагают написать

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.14 -j SNAT --to real.ip.add.ress

но я не очень понимаю, зачем мне натить все адреса из нулевой сети

в конце концов, зачем обратные пакеты слать через роутер? если оба компа в одной сетке. пусть рядом и общаются

Lockywolf ★★★
() автор топика

Я бы посоветовал хотя бы немножко изучить основы TCP/IP, прежде чем задавать такие глупые вопросы.

Википедия:

Однако, при всей своей простоте и наглядности, этот пример имеет два недостатка. Во-первых, из нашей локальной сети 192.168.1.0/24 адрес 208.77.188.166 может быть недоступен, так как 192.168.1.2, увидев, что запрос исходит из его сети, может отправить ответ непосредственно отправителю (например, 192.168.1.3), минуя сам шлюз. Отправитель же будет ждать ответа от 208.77.188.166, и просто проигнорирует ответ от 192.168.1.2. Впрочем, эта проблема легко исправляется добавлением SNAT’а для пробрасываемых пакетов:

nnz ★★★★
()

А при чём тут, собственно, вообще NAT?

Два компа внутри сети общаются без роутера, так что оно тут ни при чём. Смотри netstat -an, проверяй правила iptables в INPUT на самом сервере. Ну и на всякий случай маски подсети, а то вдруг они у тебя «как бы» оказались в разных сетях, а не в одной 192.168.0.0.

GFORGX ★★★
()
Ответ на: комментарий от zgen

Правила такие теперь:

iptables -t nat -A PREROUTING -p tcp --destination real.ip.add.ress --dport 8081 -j DNAT --to 192.168.0.14:80

iptables -t nat -I POSTROUTING 5 -p tcp -s 192.168.0.0/24 --destination 192.168.0.14 --dport 80 -j SNAT --to-source real.ip.add.ress

Вот только все равно нет доступа из сетки 192.168.0.0/24

Lockywolf ★★★
() автор топика
Ответ на: комментарий от Lockywolf

>iptables -t nat -I POSTROUTING 5 -p tcp -s 192.168.0.0/24 --destination 192.168.0.14 --dport 80 -j SNAT --to-source real.ip.add.ress

facepalm.png

iptables -t nat -I POSTROUTING -p tcp --dport 80 -s 192.168.0.0/24 --destination 192.168.0.14 -j SNAT --to-source 192.168.0.1
# где 192.168.0.1 — адрес сервера-шлюза (на котором вводятся эти команды) в подсети хоста 192.168.0.14.

А вообще, очень настоятельно рекомендую вам НЕ ТРОГАТЬ настройки iptables и как можно скорее нанять человека, который шарит в теме, пока вы еще не все там раскурочили.

nnz ★★★★
()

Не оно??

Таблица 6-16. Действие DNAT
Ключ	--to-destination
Пример	iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10
Описание	Ключ --to-destination указывает, какой IP адрес должен быть подставлен в качестве адреса места назначения. В выше приведенном примере во всех пакетах, пришедших на адрес 15.45.23.67, адрес назначения будет изменен на один из диапазона от 192.168.1.1 до 192.168.1.10. Как уже указывалось выше, все пакеты из одного потока будут направляться на один и тот же адрес, а для каждого нового потока будет выбираться один из адресов в указанном диапазоне случайным образом. Можно также определить единственный IP адрес. Можно дополнительно указать порт или диапазон портов, на который (которые) будет перенаправлен траффик. Для этого после ip адреса через двоеточие укажите порт, например --to-destination 192.168.1.1:80, а указание диапазона портов выглядит так: --to-destination 192.168.1.1:80-100. Как вы можете видеть, синтаксис действий DNAT и SNAT во многом схож. Не забывайте, что указание портов допускается только при работе с протоколом TCP или UDP, при наличии опции --protocol в критерии.
Действие DNAT достаточно сложно в использовании и требует дополнительного пояснения. Рассмотрим простой пример. У нас есть WEB сервер и мы хотим разрешить доступ к нему из Интернет. Мы имеем только один реальный IP адрес, а WEB-сервер расположен в локальной сети. Реальный IP адрес $INET_IP назначен брандмауэру, HTTP сервер имеет локальный адрес $HTTP_IP и, наконец брандмауэр имеет локальный алрес $LAN_IP. Для начала добавим простое правило в цепочку PREROUTING таблицы nat:
iptables -t nat -A PREROUTING --dst $INET_IP -p tcp --dport 80 -j DNAT \
--to-destination $HTTP_IP
   
В соответствии с этим правилом, все пакеты, поступающие на 80-й порт адреса $INET_IP перенаправляются на наш внутренний WEB-сервер. Если теперь обратиться к WEB-серверу из Интернет, то все будет работать прекрасно. Но что же произойдет, если попробовать соединиться с ним из локальной сети? Соединение просто не установится. Давайте посмотрим как маршрутизируются пакеты, идущие из Интернет на наш WEB-сервер. Для простоты изложения примем адрес клиента в Интернет равным $EXT_BOX.
1.	Пакет покидает клиентский узел с адресом $EXT_BOX и направляется на $INET_IP
2.	Пакет приходит на наш брандмауэр.
3.	Брандмауэр, в соответствии с вышеприведенным правилом, подменяет адрес назначения и передает его дальше, в другие цепочки.
4.	Пакет передается на $HTTP_IP.
5.	Пакет поступает на HTTP сервер и сервер передает ответ через брандмауэр, если в таблице маршрутизации он обозначен как шлюз для $EXT_BOX. Как правило, он назначается шлюзом по-умолчанию для HTTP сервера.
6.	Брандмауэр производит обратную подстановку адреса в пакете, теперь все выглядит так, как будто бы пакет был сформирован на брандмауэре.
7.	Пакет передается клиенту $EXT_BOX.
А теперь посмотрим, что произойдет, если запрос посылается с узла, расположенного в той же локальной сети. Для простоты изложения примем адрес клиента в локальной сети равным $LAN_BOX.
1.	Пакет покидает $LAN_BOX.
2.	Поступает на брандмауэр.
3.	Производится подстановка адреса назначения, однако адрес отправителя не подменяется, т.е. исходный адрес остается в пакете без изменения.
4.	Пакет покидает брандмауэр и отправляется на HTTP сервер.
5.	HTTP сервер, готовясь к отправке ответа, обнаруживает, что клиент находится в локальной сети (поскольку пакет запроса содержал оригинальный IP адрес, который теперь превратился в адрес назначения) и поэтому отправляет пакет непосредственно на $LAN_BOX.
6.	Пакет поступает на $LAN_BOX. Клиент "путается", поскольку ответ пришел не с того узла, на который отправлялся запрос. Поэтому клиент "сбрасывает" пакет ответа и продолжает ждать "настоящий" ответ.
Проблема решается довольно просто с помощью SNAT. Ниже приводится правило, которое выполняет эту функцию. Это правило вынуждает HTTP сервер передавать ответы на наш брандмауэр, которые затем будут переданы клиенту.
iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \
--to-source $LAN_IP
   
Запомните, цепочка POSTROUTING обрабатывается самой последней и к этому моменту пакет уже прошел процедуру преобразования DNAT, поэтому критерий строится на базе адреса назначения $HTTP_IP.
Если вы думаете, что на этом можно остановиться, то вы ошибаетесь! Представим себе ситуацию, когда в качестве клиента выступает сам брандмауэр. Тогда, к сожалению, пакеты будут передаваться на локальный порт с номером 80 самого брандмауэра, а не на $HTTP_IP. Чтобы разрешить и эту проблему, добавим правило:
iptables -t nat -A OUTPUT --dst $INET_IP -p tcp --dport 80 -j DNAT \
--to-destination $HTTP_IP
   
Теперь никаких проблем, с доступом к нашему WEB-серверу, уже не должно возникать.
Изумительнейший документ по iptables! Ежли шо, то вот тут он.

KovAl
()
Ответ на: комментарий от Lockywolf

Что в первых 4-х правилах таблицы POSTROUTING? И что в PREROUTING?

Соответственно, как отладить эту штуку?

Включаете tcpdump на нужном интерфейсе и смотрите уходят ли на 192.168.0.14 пакеты, при коннекте со 192.168.0.0/24. Если нет, смотрить цепочки FORWARD, ставите ULOG в -t filter FORWARD.

mky ★★★★★
()
Ответ на: комментарий от GFORGX

>А при чём тут, собственно, вообще NAT?

+1. Вот за это я IPFW и люблю. Там более осмысленные правила, чем у IPTABLES.

BSD
()

как уже вам подсказали(затроллили?) - наймите знающего человека или вкурить руководство по iptables(на opennet.ru есть и на русском)

по теме:

/sbin/iptables -t nat -A PREROUTING -p tcp -d MY.REAL.IP.ADDR --dport 8081 -s ! 192.168.0.0/24 -j DNAT --to 192.168.0.14:80

ключевой элемент - -s ! 192.168.0.0/24 - не натить пакеты входящие из той же сети(ибо это НЕНУЖНО!). специфика работы таблицы nat, цепочки PREROUTING в том, что в нее попадают ВСЕ пакеты, поэтому пакеты из той же подсети надо выкосить... во избежание...

Pinkbyte ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.