Я или заработался или чего-то забыл, прошу помощи. Есть два сервера. Один имеет доступ в интернет, второй нет и подключен к первому в отдельный порт. Нужно сделать возможность ходить в интернет второму и при этом, чтобы он был доступен с первого сервера по ssh. Исходные данные:
Первый сервер:
igb0 — интернет
igb1 — 192.168.2.1/24
net.inet.ip.forwarding=1
Второй сервер:
igb0 — 192.168.2.2/24 gateway 192.168.1.1
Создаю правила NAT на первом сервере:
# ipfw nat 1 config if igb0 log same_ports
# ipfw add 100 nat 1 all from 192.168.2.2 to not me in via igb1
# ipfw add 200 nat 1 all from not me to me in via igb0
# ipfw add 300 allow ip from any to any
Моя логика по правилам следующая — когда приходит пакет со 2-го сервера и он адресован не первому, то он должен попадать в NAT и уходить во внешний мир (правило 100) в противном случае правило 300. Когда приходит пакет из внешнего мира, то он попадает в правило 200 и, если нет совпадений в таблице NAT, срабатывает правило 300, в противном случае пакет отправляется на второй сервер.
Однако, когда я прописываю эти правила, первый сервер перестает быть виден из интернета :\ Последний раз я это делал много лет назад и сейчас возможно что-то упускаю, при этом гугление не дает понять что именно. Посмотрите пожалуйста свежим взглядом, что не так?
Здравствуйте, Anton Batenev, Вы писали:
AB>Hello!
AB>Я или заработался или чего-то забыл, прошу помощи. Есть два сервера. Один имеет доступ в интернет, второй нет и подключен к первому в отдельный порт. Нужно сделать возможность ходить в интернет второму и при этом, чтобы он был доступен с первого сервера по ssh. Исходные данные:
AB>Первый сервер:
AB>igb0 — интернет AB>igb1 — 192.168.2.1/24
AB>net.inet.ip.forwarding=1
AB>Второй сервер:
AB>igb0 — 192.168.2.2/24 gateway 192.168.1.1
Интерфейс и шлюз в разных сетях?!
Здравствуйте, Anton Batenev, Вы писали:
AB>Здравствуйте, C_M, Вы писали:
C_M>> Не настаиваю, но оно не должно работать. C_M>> Шлюз должен быть в той-же сети что и интерфейс.
AB>Пардон, я ошибся в написании. Правильно читать так:
AB>internet <---> igb0 (1.2.3.4/24) — [сервер 1] — igb1 (192.168.2.1/24) <---> igb0 (192.168.2.2/24) — [сервер 2]
AB>Т.е. машинки друг-друга видят нормально, по ssh между ними я спокойно хожу.
Тогда: AB> Создаю правила NAT на первом сервере: AB> AB># ipfw nat 1 config if igb0 log same_ports AB># ipfw add 100 nat 1 all from 192.168.2.2 to not me in via igb1 AB># ipfw add 200 nat 1 all from not me to me in via igb0 AB># ipfw add 300 allow ip from any to any
ipfw nat 1 config if igb0 log same_ports
ipfw add allow via igb1
ipfw add allow via lo0
С внутренним интерфейсом и лупбэком разобрались.
Все что уходит вне натится:
ipfw add nat 1 out xmit igb0
Что приходит извне тоже натится:
ipfw add nat 1 in recv igb0
Хотя я так не делаю, а разделяю ин- и аут- трафики по разным ветвям правил с помощью скипа, но последовательность действий и синтаксис правил верный.
В любом случае предлагаю рассматривать отдельно трафик (и правила фаервола) для каждого из направлений каждого из интерфейсов.
Здравствуйте, C_M, Вы писали:
C_M> Все что уходит вне натится: C_M> ipfw add nat 1 out xmit igb0 C_M> Что приходит извне тоже натится: C_M> ipfw add nat 1 in recv igb0
Спасибо! Значит, все же я делал все верно, потому что этот вариант тоже не работает — основной сервер перестает отвечать по сети. Т.е. скорее всего проблема не правилах, а где-то в другом месте. Еще раз спасибо за уделенное время — буду искать где собака порылась.
Здравствуйте, Anton Batenev, Вы писали:
AB>Здравствуйте, C_M, Вы писали:
C_M>> Все что уходит вне натится: C_M>> ipfw add nat 1 out xmit igb0 C_M>> Что приходит извне тоже натится: C_M>> ipfw add nat 1 in recv igb0
AB>Спасибо! Значит, все же я делал все верно, потому что этот вариант тоже не работает — основной сервер перестает отвечать по сети. Т.е. скорее всего проблема не правилах, а где-то в другом месте. Еще раз спасибо за уделенное время — буду искать где собака порылась.
Попробуйте добавить tcp/udp в правила:
ipfw add 100 nat 1 tcp from any to any via igb0
и пересобрать ядро, добавив
options LIBALIAS если его нет.
Извиняюсь, если уже не актуально, давно не заходил сюда
Если не актуально, то для архива...
AB># ipfw nat 1 config if igb0 log same_ports AB># ipfw add 100 nat 1 all from 192.168.2.2 to not me in via igb1 AB># ipfw add 200 nat 1 all from not me to me in via igb0 AB># ipfw add 300 allow ip from any to any
AB>Моя логика по правилам следующая — когда приходит пакет со 2-го сервера и он адресован не первому, то он должен попадать в NAT и уходить во внешний мир (правило 100) в противном случае правило 300. Когда приходит пакет из внешнего мира, то он попадает в правило 200 и, если нет совпадений в таблице NAT, срабатывает правило 300, в противном случае пакет отправляется на второй сервер.
На мой взгляд логика должа быть такой:
когда приходит пакет со 2-го сервера и он адресован не первому, то пакет должен сначала быть принят на входящем интерфейсе (правило 300), затем маршрутизироваться (за это отвечает gateway_enable="YES" в rc.conf — это более корректно в плане долговременных настроек, чем net.inet.ip.forwarding). Далее, когда принято решение о маршрутизации, адрес отправителя в исходящем пакете должен транслироваться в адрес сервера1.
На обратном пути входящий пакет во внешний интерфейс сервера1 должен проверяться на наличие стейта в таблице трансляции. Если стейт есть, то адрес назначения транслируется в адрес сервера2. Далее сервер1 видит, что пакет не для него и посылает его согласно таблице маршрутизации в интерфейс к серверу2. Затем он снова должен быть разрешён для отправки на исходящем интерфейсе (правило 300).
Иcходя из этой логики, я бы попробовал такие правила:
# ipfw nat 1 config if igb0 log same_ports
# ipfw add 100 nat 1 ip from 192.168.2.2 to any out xmit igb0
# ipfw add 200 nat 1 ip from any to me in recv igb0
# ipfw add 300 allow ip from any to any