Классика выставления наружу порта посредством nftables (нудная мистическая возня под диванами)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модератор: SLEDopit

Ответить
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Классика выставления наружу порта посредством nftables

Сообщение dimbor »

Сразу уточню: диван это devuan, что к теме отношения наверное не имеет.
Начну как обычно издалека. Стоял себе в конторе срверок-шлюз к нескольким провайдерам. Как ни десять лет пыхтел под пятым альтом ковчегом. Пришла пора его менять. Но я же не школоло какое, ронять всю контору на неделю. Поэтому прикупил железа, разложил дома. Поставил туда диван, аналогичный работающему на домашнем серваке. Далее не спеша туда перенес, все что было наскриптовано на старом. Улучил момент, поставил новую железку. Завелось все, кроме того самого проброса портов. Проброс завелся классически наполовину.

На примере ssh. eth0 - внутренняя сетка. eth1, eth2 - внешние, с публичными адресами.Таблицы маршрутизации созданы. Сервисы самого сервера по обоим внешним адресам доступны. Выставлен ssh порт машины из внутренней сети классическим способом:

Код: Выделить всё

table ip nat {
    chain prerouting { type nat hook prerouting priority -100; policy accept;
        iifname { eth1, eth2 } tcp dport 222 counter dnat 192.168.1.88:ssh
    }
    chain postrouting { type nat hook postrouting priority 100; policy accept;
        oifname { eth1, eth2 } counter masquerade
    }
 }
Форвардинг также само разрешен. Все по букварю. А маскарад тут указан, чтобы было понятно что он есть.
Какашка тоже классическая: Прокинутый порт доступен только на том внешнем интерфейсе, на который установлен умолчательный маршрут в main таблице маршрутизации. С другого интерфейса запись [NEW] ... SYN_SENT ... [UNREPLIED] в conntrack появляется, но дальше дело не идет. Потому что SYN_ACK уносятся в цепочку форвард и далее маскарадятся с умолчательного адреса, понятно не встречая понимания взывающего хоста.

Даже про починку такой бяки гугл знает довольно мало и невразумительно. Еще добавляется обещанная в заголовке мистика. Совместно с эзотерикой и прочей похожей фигней. Эта конфигурация работает на домашнем сервере (откуда и срисована) без вопросов.

Тоже два провайдера, те-же конфиги, но работает. Ядра, модули идентичные. Даже с отчаяния не поленился накидать скрипт, разгребающий содержимое /proc/sys/net/* Сравнил выхлоп - практически одинаковый.

Проблема не в том, что не работает. Я через xinetd накрайняк сделаю, как раньше. Проблема, что идеи кончаются. Ну и в общей недоученности.

Вам есть, что сказать? У настоящего мужчины всегда есть, что сказать! (C)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Классика выставления наружу порта посредством nftables

Сообщение Bizdelnick »

Классической проблеме и решение классическое: к DNAT добавить SNAT. По аналогии с Re: Решено: iptables и port forwarding (самому всё никак не было повода разобраться с nftables, поэтому правило не напишу).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Классика выставления наружу порта посредством nftables

Сообщение Bizdelnick »

Только сейчас заметил, что внешних интерфейсов два. Тогда сложнее. На обоих надо пробрасывать?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Классика выставления наружу порта посредством nftables

Сообщение Bizdelnick »

Тут какая-то магия с conntrack определённо нужна, наподобие ct original daddr. В правилах для SNAT, которые таки нужны, причём для каждого внешнего адреса.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Re: Классика выставления наружу порта посредством nftables

Сообщение dimbor »

Угу. Упомянутый ресурс давно как уголовный кодекс у поэта - открываю на любой странице и не могу, читаю до конца. (C)
Не хочется тыкаться наобум. Тем более, есть место, где работает. Отличаются адреса/маски/шлюзы пар провайдеров. И все.

В таблице conntrack интерфейсы не фигурируют, только адреса. Также в обсуждениях похожих ситуаций басурмане пишут, эти SYN_ACK в filter forward вроде вообще попадать не должны. Сразу в nat postrouting, там место специальное оборудовано. Upd: По новым сведениям, должны.

Пока из полезного нарыл только хвостом по забору писанный документ про отладку. И там Инашалла.
Последний раз редактировалось dimbor 18.10.2021 12:50, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Классика выставления наружу порта посредством nftables

Сообщение Bizdelnick »

dimbor писал:
16.10.2021 16:54
Не хочется тыкаться наобум.
Это не наобум. Сколько помню, проброс порта всегда делался двумя правилами — DNAT и SNAT. Здесь усложнение из-за двух внешних адресов, значит, нужны два правила SNAT.
dimbor писал:
16.10.2021 16:54
В таблице conntrack интерфейсы не фигурируют, только адреса.
Правильно, я и говорю — ct original daddr надо использовать (если я правильно понимаю, что он делает, конечно). Ему указывается внешний адрес (то есть тот, с которым устанавливает соединение клиент), а не интерфейс. И делается SNAT на тот же адрес. Как-то типа nft insert rule inet nat postrouting saddr 192.168.1.88 tcp sport 22 ct original daddr 1.2.3.4 snat ip to 1.2.3.4:222 (скорее всего, это нерабочее правило, не умею я в nft; 1.2.3.4 — внешний адрес).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Классика выставления наружу порта посредством nftables

Сообщение olecya »

Попробовала повторить вашу конфигурацию и получила тот же результат - син запросы благополучно достигают серевера 192.168.1.88:ssh.
Добавила маршрут и все заработало(у меня другие адреса и интерфейсы, и попробую сделать правильное отражение на ваши:

Код: Выделить всё

ip route add default via 192.168.1.88 table 120 #ip следующего прыжка к серверу 192.168.1.88, у меня он следующий
ip rule add to 192.168.1.88 table 120
Между прочим простая и классная балансировка получилась с помощью фильтра.
Добавлено (11:48):
Поторопилась. убрала этот маршрут и все так же работает. Я еще в тот же раз изменяла маршрут на самом ssh серевере 192.168.1.88:
У меня был другой маршрут по умолчанию, я добавила маршрут сети ip интерфейса (ваш eth0)
Добавлено (12:01):
То есть могу констатировать настройки nftables рабочие. Подключилась сразу через два интерфейса шлюза к ssh серверу.
Последний раз редактировалось olecya 17.10.2021 12:27, всего редактировалось 1 раз.
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Re: Классика выставления наружу порта посредством nftables

Сообщение dimbor »

Спасибо всем за участие в моей беде!
Тут возникло еще одно предположение: Один из провайдеров злополучного сервера - хитровывернутый, авторизирует на порту по маку. Оригинальная сетевуха уже давненько в помойке, и мак подменяется средствами ос.

Код: Выделить всё

...
iface eth2 inet static
  hwaddress ether 10:62:EB:32:AD:2F
...
Не тут ли искать? Хотя ума не приложу, как это может влиять. Тем более, оригинального мака в логах не проскакивало.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Классика выставления наружу порта посредством nftables

Сообщение Bizdelnick »

Да нет, не может это влиять. Подключение же устанавливается, как я понял, значит с маком всё нормально.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Re: Классика выставления наружу порта посредством nftables

Сообщение dimbor »

Осталось только трассировать рабочую систему во все отверстия для трафика и сравнивать с нерабочей.
Боюсь только до ядра ненароком доковыряться.
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Re: Классика выставления наружу порта посредством nftables

Сообщение dimbor »

Чем дальше углубляюсь, тем больше понимаю: на рабочей системе оно работает каким-то чудом и пердячим паром. Пока еще невдомек многое, но красивую картинку среди многих унылых найти получилось. Пусть пока здесь полежит, ок?
nf-ct-iptables-hooks-ipv4.png
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Re: Классика выставления наружу порта посредством nftables

Сообщение dimbor »

Докопался таки! Исключил потусторонние силы, и моя пошатнувшаяся картина мира еще некоторое время постоит. Слукавил маленько: диваны то разные. Работающий - ascii, сломанный - beowulf. Ну и что, что я им ядра одинаковые подсунул. Юзерспейсная обвязка libnftnl и пр. обновилась и работать правильно перестала.

А убрав с души кирпич, начал думать как лечить. Почитал дофига текста про connection tracker, запутался окончательно и решил попробовать по простому.

syn_ack улетают не туда, значит надоть их развернуть. И все остальное заодно оттедова. Для этого есть старый добрый fwmark и правила маршрутизации, тем более подходящие таблицы уже созданы. Но соединение к внешнему пору впень, а от прокинутого - отпень. И связано оно ct NEW, который таки появляется. А там еще есть ct mark. Который можно поставить и в нужный момент в обычный mark скопировать. Получилась еще одна цепочка

Код: Выделить всё

chain premark { type filter hook prerouting priority -150; policy accept;
    iifname eth1 tcp dport 222 ct state new ct mark set 0x101
    iifname eth2 tcp dport 222 ct state new ct mark set 0x102
    iifname eth0 ct mark != 0 meta mark set ct mark
}
плюс два правила

Код: Выделить всё

ip rule add fwmark 0x101 table eth1-t
ip rule add fwmark 0x102 table eth2-t
Бинго!
Но главное, все получилось сделать удаленно. Потому что шутка "удаленная настройка фаервола - к дальней дороге" оказалась нифига не шуткой. Два раза. Туда спозаранку через весь город перся. Первый, правда, когда ядро там менял. Вот что они, спрашивается, курили, когда grub2 к дебиану изолентой приматывали? Гы!
Спасибо сказали:
Ответить