LINUX.ORG.RU
решено ФорумAdmin

Iptables, DNAT с внешнего на внутренний адрес шлюза со сменой порта !

 , , ,


0

1

Есть тихая, спокойная локальная сеть 192.168.0.0/24, в качестве шлюза из дикого Интернета Linux с 2 статическими интерфейсами: lan 192.168.0.1 и wan, например, 98.98.98.98 На нем же стоит, настроен Iptables. Из сети / со шлюза Internet работает (ip forwarding конечно же включен) . Работает «через» SNAT:

iptables -t nat -A POSTROUTING -o wan -m iprange --src-range 192.168.0.2-192.168.0.254 -m policy --dir out --pol none -j SNAT --to-source 98.98.98.98

На шлюзе также стоит Ssh, который «висит» ТОЛЬКО на адресе 192.168.0.1, то есть строго «слушает» только интерфейс lan Возникла необходимость включить удаленный доступ через темный Internet к Ssh.

Делаю в Iptables DNAT:

iptables -t nat -A PREROUTING -i wan -m iprange ! --src-range 192.168.0.2-192.168.0.254 -d 192.168.0.1 -p tcp -m tcp --dport 22000 -m policy --dir in --pol none -j DNAT --to-destination 192.168.0.1:22

Так, как пакет предназначен шлюзу, не локальной сети, и с учетом DNAT на lan адрес шлюза, прописываем filter INPUT правило:

iptables -t filter -A INPUT -i lan -m iprange ! --src-range 192.168.0.2-192.168.0.254 -d 192.168.0.1 -p tcp -m tcp --dport 22 -m policy --dir in --pol none -j ACCEPT
И, так, как пакет предназначен шлюзу, не локальной сети, и с учетом DNAT на lan адрес шлюза, прописываем соответствующее filter OUTPUT правило:
iptables -t filter -A OUTPUT -o lan -s 192.168.0.1 -m iprange ! --dst-range 192.168.0.2-192.168.0.254 -p tcp -m tcp --sport 22 -m policy --dir out --pol none -j ACCEPT
Но в этом случае набор правил не работает. Если в указанных INPUT и OUTPUT правилах поменять интерфейсы с lan на wan, все заработает

Правильно ли понимаю, что при DNAT пакеты между интерфейсами НЕ «перекидываются» ? Только при FORWARD ?

То есть, хотя ssh «висит» только на lan, пакет, пришедший на wan, у которого по DNAT меняется адрес получателя на локальный адрес шлюза, этот пакет на lan НЕ пересылается, а отправляется «из» wan интерфейса на локальный процесс в виде ssh ? Или что-то делаю не так, и такой пакет ДОЛЖЕН переслаться на lan, из которого уже он отправляется на local process - ssh.

P. S.: Tcpdump видит на wan только пакеты на 20000 порт, на lan, от внешнего хоста, от которого идет соединение трафика нет. Хотя соединение проходит. При FORWARD, если DNAT «идет» в локальную сеть, трафик на lan виден.

гугл iptables tutorial. Сильно по простому:
INPUT/OUTPUT - локальные процессы
FORWARD - транзитные
У вас sshd где работает? Локально. Ответ ясен?
ЗЫ Правила жесть. Еще раз отправляю к iptables tutorial.

anc ★★★★★ ()

То есть, хотя ssh «висит» только на lan, пакет, пришедший на wan, у которого по DNAT меняется адрес получателя на локальный адрес шлюза, этот пакет на lan НЕ пересылается, а отправляется «из» wan интерфейса на локальный процесс в виде ssh ?

Да. DNAT не меняет интерфейсы.

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

Да. DNAT не меняет интерфейсы.

А должен? Ну сколько раз вам болезным повторять, iptables не занимается роутингом. Все что делает DNAT - это замена адреса:порта назначения в заголовке пакета. Роутингом занимается совсем другая подсистема ведра.

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

гугл iptables tutorial. Сильно по простому:
INPUT/OUTPUT - локальные процессы
FORWARD - транзитные

В курсе.

У вас sshd где работает? Локально. Ответ ясен?

Нет, не ясен. Вопрос был не относительно самого хоста шлюза и/или хостов локальной сети. Вопрос был глубже - относительно разных интерфейсов 1 хоста - именно хоста шлюза. Этого (явно) в iptables tutorial не нашел. Ssh работает локально - в смысле на хосте шлюзе, но входящий пакет приходит на внешний интерфейс шлюза, а ssh «висит» на внутреннем. ЗЫ Правила жесть. Еще раз отправляю к iptables tutorial. Где жесть, например ?

Oooo800 ()
Ответ на: комментарий от ValdikSS

Да. DNAT не меняет интерфейсы.

Спасибо за ответ. Лаконичный.

Oooo800 ()
Ответ на: комментарий от anc

А должен? Ну сколько раз вам болезным повторять, iptables не
занимается роутингом. Все что делает DNAT - это замена
адреса:порта назначения в заголовке пакета.
Роутингом занимается совсем другая подсистема ведра.

Когда приходит внешний пакет на шлюз на его внешний интерфейс, он адресован шлюзу (речь о NEW пакете) . Потом делаем DNAT на хост в локальной сети, меняется заголовок пакета (dst IP:port) и «другая подсистема» его роутит (маршрутизирует его сначала на внутренний интерфейс, затем «выплевывает» на хост в локалку). Что, в этом случае делает Iptables, также меняет адрес назначения и пакет, больше ничего. Правильно ? Но пакет-то попадает на внутренний интерфейс шлюза (tcpdump подтверждает это) . Вот этот вопрос и заключался в аналогии: приходит пакет из вне на внешний интерфейс, потом DNAT на внутренний адрес шлюза хоста и потом с внутреннего интерфейса на local process.

Может тогда вопрос не совсем в Iptables или в Iptables + подсистема, отвечающая за маршрутизацию. Вот и возник вопрос - мне и было не понятно, работает эта схема для шлюза хоста также, как и для хостов в локальной сети, когда пакет идет с внутреннего интерфейса, только, конечно, не на хост в локальной сети, а на local process и сделал что-то не так в Iptables или она так не работает (оказывается) .

P. S.:

вам болезным повторять

Вот это зачем. Ваша цель, в данном случае, какая, дать ответ на вопрос или показать «крутость» ,тем блее на фоне других (вопрос риторический). Если дать ответ - ValdikSS дал ответ - без присваивания ярлыков, сарказма и т. д. и по теме (как пример). Если нет желания его давать именно так, так пройдите мимо сообщений и ничего не отвечайте.

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

Как вам еще пояснить. Входящий пакет у вас с какого интерфейса? wan Исходящий откуда будет? wan (а может оказаться и с lan1, la-la-la и так далее и тому подобное) Это трафик от локальных процессов.

Этого (явно) в iptables tutorial не нашел

Видимо читали «наискосок». Рекомендую «от корки до корки».

Где жесть, например ?

-i wan -m iprange ! --src-range 192.168.0.2-192.168.0.254
Например, что этим хотели сказать?
Да и за ! без необходимости всегда всех «мокрыми тряпками гоняю».

anc ★★★★★ ()

Я, может, как-то не так задачу понял, но зачем в данном случае вообще с iptables заморачиваться? Что мешает просто повесить sshd на внешний интерфейс?

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

Вот это зачем. Ваша цель, в данном случае, какая, дать ответ на вопрос или показать «крутость» ,тем блее на фоне других (вопрос риторический). Если дать ответ - ValdikSS дал ответ - без присваивания ярлыков, сарказма и т. д. и по теме (как пример). Если нет желания его давать именно так, так пройдите мимо сообщений и ничего не отвечайте.

Я подчеркнул факт того что iptables не занимается роутингом. Очень многие считают что что это не так. И начинают давать советы. Хотя если быть честным, существовал модуль и у iptables, но просуществовал не долго. Ответ ValdikSS заключался только в одном, «меняет DNAT адрес интерфейса?», он ответил «нет». Но его однозначный ответ не до конца верен. DNAT поменяет адрес, а другая подсистема поменяет уже роутинг. Т.е. изменение интерфейса может быть, а может и не быть, это косвенное изменение.

anc ★★★★★ ()

Немного банальщины которая часто встречается, в качестве пояснения. Предположим у нас есть wan1, wan2 и lan интерфейсы. defgw через wan1. На wan2 добавляем правило dnat на ip lan интерфейса. Отправляем пакет на wan2, dnat меняет ip:port назначения и локальный процесс слушающий на lan получает этот пакет. Теперь ответ, conntrack поменяет обратно, но вот роутинг у нас идет через wan1. С большой вероятностью пров wan1 пошлет левый пакет (в заголовке же ip wan2) не из его сети.
Итого что мы видим, входящий интерфейс у нас был wan2 а исходящий оказался wan1. Но все это относиться к локальным процессам. Надеюсь такой пример более понятен в части роутинга и iptables.

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