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

У школоты nftables dnat не работает после ребута, а после restart nftables жизнь вновь прекрасна

 , ,


0

1

Добрый вечер,

Имеется Debian 10, там есть богомерзостный windows guest (192.168.122.11), к которому хочется иметь RDC (3389) снаружи (1234)

nftables правило на этот случай:

table ip nat {
	chain prerouting {
		type nat hook prerouting priority -100; policy accept;
		tcp dport 1234 dnat to 192.168.122.11:3389
	}
}

После бута всё остальные nftables правила функционируют, за исключением dnat.

Если потом сделать systemctl restart nftables, то и dnat начинает работать как надо. Т.е. правило-то в порядке (наверное). Но что же теперь, костылик приделывать для дополнительного рестарта после всего?

Почему dnat сразу не работает, где накосячено?

Ответ на: комментарий от ne-vlezay

сразу после загрузки

nftables.service - nftables
   Loaded: loaded (/lib/systemd/system/nftables.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sat 2021-03-20 11:00:39 UTC; 43s ago
     Docs: man:nft(8)
           http://wiki.nftables.org
  Process: 349 ExecStart=/usr/sbin/nft -f /etc/nftables.conf (code=exited, status=0/SUCCESS)
 Main PID: 349 (code=exited, status=0/SUCCESS)

Mar 20 11:00:39 my.domain.tld systemd[1]: Started nftables.

запускаю guest, dnat к нему не работает, при этом filter работает (специально подвесил нечто слушающее на один из портов для проверки)

сразу после systemctl restart nftables dnat функционирует

nftables.service - nftables
   Loaded: loaded (/lib/systemd/system/nftables.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sat 2021-03-20 11:07:23 UTC; 2min 47s ago
     Docs: man:nft(8)
           http://wiki.nftables.org
  Process: 2815 ExecStart=/usr/sbin/nft -f /etc/nftables.conf (code=exited, status=0/SUCCESS)
 Main PID: 2815 (code=exited, status=0/SUCCESS)

Mar 20 11:07:23 my.domain.tld systemd[1]: Starting nftables...
Mar 20 11:07:23 my.domain.tld systemd[1]: Started nftables.

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

ip6 отключен, посему nftables.conf невелик:

#!/usr/sbin/nft -f

flush ruleset

include "/etc/nftables/ip-filter.nft"
include "/etc/nftables/ip-mangle.nft"
include "/etc/nftables/ip-nat.nft"

/etc/nftables/iip-filter.nft

table ip filter {
	chain input {
...
		tcp dport 1234 accept
...
}

/etc/nftables/ip-mangle.nft пусто

/etc/nftables/ip-nat.nft

table ip nat {
	chain prerouting {
		type nat hook prerouting priority -100; policy accept;
		tcp dport 1234 dnat to 192.168.122.11:3389
	}

	chain input {
		type nat hook input priority 100; policy accept;
	}

	chain output {
		type nat hook output priority -100; policy accept;
	}

	chain postrouting {
		type nat hook postrouting priority 100; policy accept;
		oifname "eno1" ip saddr 192.168.122.0/24 masquerade
	}
}

Если зарестартить nftables не меняя конфига, то dnat работает. Непонятное: почему при том же самом конфиге dnat не работает сразу.

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

Непонятное: почему при том же самом конфиге dnat не работает сразу.

Порядок сервисов например, в момент применения правил на старте интерфейс недоступен или что-то еще важное (как ipfrowarding). А когда ты запускаешь - уже доступен.

Засунь в rc.local (или что там щас вместо него чисто запускается, без говна в виде systemd) который последним стартует - проверь.

zgen ★★★★★
()
Последнее исправление: zgen (всего исправлений: 2)
Ответ на: комментарий от zgen

Порядок сервисов например, в момент применения правил на старте интерфейс недоступен

Сам про это думал. Но что же получается, при любом изменении (старт-стопе виртуалки, например) рестартить nftables «на всякий случай»? Некошерно как-то.

Зарестартить nftables не сложно, интересно было понять глубинные причины почему все правила применяются, за исключением dnat.

Brillenschlange
() автор топика

Порты в виртуалку надо пробрасывать через libvirt hook, на момент старта nftables у тебя врядли запущена виртуалка с обвязкой.

Заголовок отвращает помогать, если честно.

zemidius
()
Последнее исправление: zemidius (всего исправлений: 2)

zgen подсказал про sysctl и в частности про net.ipv4.ip_forward

Я бы после загрузки и проверки неработоспособности dnat сделал бы sysctl net >set1

Потом перезапустил nftables и сделал sysctl net >set2

После чего сравнил результаты.

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

Заголовок отвращает помогать, если честно.

Спасибо, учту и это и про input, но надо ведь хоть как-то заманить население, просто на nftables никто не среагирует, а на клоуна все хотят посмотреть.

Порты в виртуалку надо пробрасывать через libvirt hook

А почему «надо»? Есть какие-то специальные соображения? Моя теоретическая база по очень многим вопросам сильно страдает.

@vel

net.ipv4.ip_forward

оно есть 1. sysctl попробую, благодарю

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

на момент старта nftables у тебя врядли запущена виртуалка с обвязкой

Да, именно так, libvirt уже потом стартует. Однако, если после бута зарестартить nftables еще до запуска guest, то оно работает. Не очень понимаю всёравно, почему dnat не работает, указан же просто ip безотносительно в сервису (котрый ещё не стартовал)

tcp dport 1234 dnat to 192.168.122.11:3389 

Но вопрос перешёл в разряд академического интереса, на практике проще зарестартить nftables.

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

Однако, если после бута зарестартить nftables еще до запуска guest, то оно работает.

Под «обвязкой» я подразумевал сеть libvirt. На практике надо чуть поднапрячься один раз и сделать правильно (и далее размножать это «правильно»), чем лепить костыли в виде рестарта nftables в конце загрузки.

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

Но вопрос перешёл в разряд академического интереса, на практике проще зарестартить nftables.


Если академический интерес, то топай читать документацию, как делать правильно исходя из окружения твоего дистрибутива и понятия ментейнеров твоего дистра о том, как делать правильно.

А если просто на кнопки потыкать как попало, то конечно работать нормально не будет.

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

Благодарю, именно этим в данный момент уже занимаюсь.

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

А, ну да. Во-первых, смотри логи, там наверняка есть ругань про цепочку. Во-вторых, опусти libvirt и сделай рестарт nftables, сэмулируешь ошибку.

zemidius
()
Последнее исправление: zemidius (всего исправлений: 1)
8 сентября 2021 г.
Ответ на: комментарий от Brillenschlange

Если не сложно, подскажи как решил?

Как по ссылке – грохнул нат и поставил бридж и дальше по списку?

С такой же бедой встрял, что-то котелок уже совсем не варит. :(

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

libvirt при старте засовывает свои правила. Как это убрать никто не знает, знать не хочет и, судя по всему, пилителей либвирта это устраивает и допиливать они ничего не желают.

Самое простое:
отключить libvirt при загрузке и приделать скрипт-костылик:
systemctl start libvirt # тут он впихнёт свои очень нужные правила
systemctl restart nftables # а тут ты его взад уделай
virsh start vm1 # ну и запускай своё нужное

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

«Самое простое» это не использовать nat от libvirt. А то что вы написали это костылестроение.

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

Получилось все-таки без рестартов сделать, как по либвиртовой вики:

/etc/libvirt/hooks/qemu

#!/bin/bash

GUEST_IP=192.168.100.175
GUEST_PORT=3389
HOST_PORT=3389

if [[ "$2" = "stopped"  ]]; then
	/etc/alternatives/iptables -D FORWARD -o virbr0 -p tcp -d $GUEST_IP --dport $GUEST_PORT -j ACCEPT
	/etc/alternatives/iptables -t nat -D PREROUTING -p tcp --dport $HOST_PORT -j DNAT --to $GUEST_IP:$GUEST_PORT
fi
if [[ "$2" = "started" ]]; then
	/etc/alternatives/iptables -I FORWARD -o virbr0 -p tcp -d $GUEST_IP --dport $GUEST_PORT -j ACCEPT
	/etc/alternatives/iptables -t nat -I PREROUTING -p tcp --dport $HOST_PORT -j DNAT --to $GUEST_IP:$GUEST_PORT
fi 

Про nftables не совсем понял: он как будто бы есть у меня, при этом сервис стартует и сразу тухнет. На момент написания моего поста у меня все заваливалось из-за пропущенного двойного дэша перед dport.

В общем работает, но есть что еще поизучать. :)

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

Так эта, таво… iptables (в скрипте написано) или nftables. Наверное одно из двух.

@anc

Не помню, почему nat оставил, значит был какой-то повод. Хуки у меня не заработали, наверное плохо старался. Ну и я же честно сразу признался, что это костылик. Но простой.

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