FreeBSD простой NAT
От: Anton Batenev Россия https://github.com/abbat
Дата: 29.11.13 12:02
Оценка:
Hello!

Я или заработался или чего-то забыл, прошу помощи. Есть два сервера. Один имеет доступ в интернет, второй нет и подключен к первому в отдельный порт. Нужно сделать возможность ходить в интернет второму и при этом, чтобы он был доступен с первого сервера по 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, в противном случае пакет отправляется на второй сервер.

Однако, когда я прописываю эти правила, первый сервер перестает быть виден из интернета :\ Последний раз я это делал много лет назад и сейчас возможно что-то упускаю, при этом гугление не дает понять что именно. Посмотрите пожалуйста свежим взглядом, что не так?
avalon/1.0.433
Re: FreeBSD простой NAT
От: smeeld  
Дата: 29.11.13 12:47
Оценка:
Здравствуйте, Anton Batenev, Вы писали:
Не сказали
Ядро пересобирали?
options IPFIREWALL
options IPFIREWALL_FORWARD
options IPFIREWALL_NAT
options IPDIVERT
/etc/rc.conf правили?
firewall_enable="YES"
firewall_nat_enable="YES"
firewall_nat_interface="igb0"
firewall_type="/etc/firewall"-сюда пропишем правила для ipfw
Re[2]: FreeBSD простой NAT
От: Anton Batenev Россия https://github.com/abbat
Дата: 29.11.13 13:49
Оценка:
Здравствуйте, smeeld, Вы писали:

s> Не сказали

s> Ядро пересобирали?
s> options IPFIREWALL
s> options IPFIREWALL_FORWARD
s> options IPFIREWALL_NAT
s> options IPDIVERT

Да, кроме IPFIREWALL_FORWARD — форвардинг вроде для ната не требуется(?) Ниже текущие опции в дополнение к GENERIC:

options IPFIREWALL
options IPFIREWALL_FORWARD
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=1000
options IPFIREWALL_NAT
options LIBALIAS
options DUMMYNET
options HZ=1000


s> /etc/rc.conf правили?

s> firewall_enable="YES"
s> firewall_nat_enable="YES"
s> firewall_nat_interface="igb0"
s> firewall_type="/etc/firewall"-сюда пропишем правила для ipfw

firewall_nat_enable + firewall_nat_interface по сути делает следующее:

ipfw nat 123 config log
ipfw add 50 nat 123 ip4 from any to any via igb0


В этой конфигурации все точно так же перестает отвечать
avalon/1.0.433
Re[3]: FreeBSD простой NAT
От: Anton Batenev Россия https://github.com/abbat
Дата: 29.11.13 13:53
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

AB> s> Не сказали

AB> s> Ядро пересобирали?
AB> s> options IPDIVERT

Блин, совсем заработался Не IPFIREWALL_FORWARD а IPDIVERT не установлен — он для natd, а я пытаюсь использовать ipfw nat.
avalon/1.0.433
Re: FreeBSD простой NAT
От: C_M Украина  
Дата: 29.11.13 14:18
Оценка:
Здравствуйте, 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

Интерфейс и шлюз в разных сетях?!

# cat /etc/rc.conf
firewall_enable="YES"
firewall_nat_enable="YES"
dummynet_enable="YES"
firewall_script="/usr/local/etc/ipfw_rules.sh"

в ядре:
options IPFIREWALL
options IPFIREWALL_FORWARD
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_NAT
options LIBALIAS
options ROUTETABLES=2
options DUMMYNET
options DEVICE_POLLING
options HZ="1000"

С правилами можно будет разбираться когда будет понятна топология сети.
Re[2]: FreeBSD простой NAT
От: Anton Batenev Россия https://github.com/abbat
Дата: 29.11.13 14:27
Оценка:
Здравствуйте, C_M, Вы писали:

C_M> Интерфейс и шлюз в разных сетях?!


В разных. Схематично выглядит как-то так:

internet <---> igb0 (1.2.3.4/24) — [сервер 1] — igb1 (192.168.2.1/24) <---> igb0 (192.168.1.2/24) — [сервер 2]
avalon/1.0.433
Re[3]: FreeBSD простой NAT
От: C_M Украина  
Дата: 29.11.13 14:45
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

AB>Здравствуйте, C_M, Вы писали:


C_M>> Интерфейс и шлюз в разных сетях?!


AB>В разных. Схематично выглядит как-то так:


AB>internet <---> igb0 (1.2.3.4/24) — [сервер 1] — igb1 (192.168.2.1/24) <---> igb0 (192.168.1.2/24) — [сервер 2]


Не настаиваю, но оно не должно работать.
Шлюз должен быть в той-же сети что и интерфейс.

internet <---> igb0 (1.2.3.4/24) — [сервер 1] — igb1 (192.168.2.1/24) <---> igb0 (192.168.2.2/24) — [сервер 2]
или
internet <---> igb0 (1.2.3.4/24) — [сервер 1] — igb1 (192.168.2.1/16) <---> igb0 (192.168.1.2/16) — [сервер 2]
Re[4]: FreeBSD простой NAT
От: Anton Batenev Россия https://github.com/abbat
Дата: 29.11.13 15:04
Оценка:
Здравствуйте, C_M, Вы писали:

C_M> Не настаиваю, но оно не должно работать.

C_M> Шлюз должен быть в той-же сети что и интерфейс.

Пардон, я ошибся в написании. Правильно читать так:

internet <---> igb0 (1.2.3.4/24) — [сервер 1] — igb1 (192.168.2.1/24) <---> igb0 (192.168.2.2/24) — [сервер 2]

Т.е. машинки друг-друга видят нормально, по ssh между ними я спокойно хожу.
avalon/1.0.433
Re[5]: FreeBSD простой NAT
От: C_M Украина  
Дата: 29.11.13 16:52
Оценка: 8 (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

Хотя я так не делаю, а разделяю ин- и аут- трафики по разным ветвям правил с помощью скипа, но последовательность действий и синтаксис правил верный.
В любом случае предлагаю рассматривать отдельно трафик (и правила фаервола) для каждого из направлений каждого из интерфейсов.
Re[6]: FreeBSD простой NAT
От: Anton Batenev Россия https://github.com/abbat
Дата: 30.11.13 15:56
Оценка:
Здравствуйте, C_M, Вы писали:

C_M> Все что уходит вне натится:

C_M> ipfw add nat 1 out xmit igb0
C_M> Что приходит извне тоже натится:
C_M> ipfw add nat 1 in recv igb0

Спасибо! Значит, все же я делал все верно, потому что этот вариант тоже не работает — основной сервер перестает отвечать по сети. Т.е. скорее всего проблема не правилах, а где-то в другом месте. Еще раз спасибо за уделенное время — буду искать где собака порылась.
avalon/1.0.433
Re[7]: FreeBSD простой NAT
От: smeeld  
Дата: 30.11.13 16:41
Оценка:
Здравствуйте, 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 если его нет.
Re: FreeBSD простой NAT
От: butcher Россия http://bu7cher.blogspot.com
Дата: 26.12.13 00:57
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

Извиняюсь, если уже не актуально, давно не заходил сюда
Если не актуально, то для архива...

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

Нет ничего невозможного..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.