1 (edytowany przez jaros85 2023-02-12 20:18:05)

Temat: Konwersja iptables do nftables

Witam wszystkich.
Przesiadłem się właśnie z OpenWrt 21.02 do 22.03 od cezarego
Finalnie utknąłem na konwersji moich reguł z iptables do nftables.

Na Debianie skorzystałem z pakietu iptables-translate niestety mam problemy z wdrożeniem tego do OpenWrt

Przykładowe komendy poniżej (stara składnia/nowa składnia/wynik polecenia w konsoli):

iptables -I INPUT -i eth1.3 -d 192.168.1.1 -p tcp --dport 22 -j REJECT
nft insert rule ip filter INPUT iifname "eth1.3" ip daddr 192.168.25.1 tcp dport 22 counter reject

root@openwrt:~# nft insert rule ip filter INPUT iifname "eth1.3" ip daddr 192.168.
1.1 tcp dport 22 counter reject
Error: Could not process rule: No such file or directory
insert rule ip filter INPUT iifname eth1.3 ip daddr 192.168.1.1 tcp dport 22 counter reject

strzałki pod ^^^^^^ filter


iptables -I FORWARD -i br-lan -o eth1.3 -p tcp -s 192.168.1.0/24 --dport 53 -d 172.16.1.2 -j ACCEPT
nft insert rule ip filter FORWARD iifname "br-lan" oifname "eth1.3" ip saddr 192.168.25.0/27 ip daddr 172.16.1.2 tcp dport 53 counter accept

root@openwrt:~# nft insert rule ip filter FORWARD iifname "br-lan" oifname "eth1.3" ip saddr 192.168.1.0/25 ip daddr 172.16.1.2 tcp dport 53 counter accept
Error: Could not process rule: No such file or directory
insert rule ip filter FORWARD iifname br-lan oifname eth1.3 ip saddr 192.168.1.0/25 ip daddr 172.16.1.2 tcp dport 53 counter accept

strzałki pod ^^^^^^ filter


iptables -I FORWARD -i eth1.3 -o br-lan -p tcp --sport 53 -s 172.16.25.2 -d 192.168.25.0/27 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
nft insert rule ip filter FORWARD iifname "eth1.3" oifname "br-lan" ip saddr 172.16.25.2 ip daddr 192.168.25.0/27 tcp sport 53 ctstate related,established counter accept


root@openwrt:~# nft insert rule ip filter FORWARD iifname "eth1.3" oifname "br-lan" ip saddr 172.16.1.2 ip daddr 192.168.1.0/25 tcp sport 53 ctstate related,established counter accept
Error: No symbol type information
insert rule ip filter FORWARD iifname eth1.3 oifname br-lan ip saddr 172.16.25.2 ip daddr 192.168.25.0/27 tcp sport 53 ctstate related,established counter accept

strzałki pod ^^^^^^ ctstate

Prośba o pomoc co robię nie tak ?

[etit]
Według tej instrukcji https://openwrt.org/docs/guide-user/fir … r_with_fw4 żeby dodać skrypty w pliku firewall.user należy dodać do pliku firewall poniższy wpis czy dobrze to rozumiem ?

config include
    option    enabled        1
    option    type        'script'
    option    path        '/etc/firewall.user'
        option    fw4_compatible    1
| C2600 @ OpenWrt 21.02 / LuCi -> sieć gościnna, WINS serwer, VLAN, DLNA, multiwan
| WDR4300 @ OpenWrt 21.02 / LuCI -> extroot, sieć gościnna, WINS serwer
| MR3020 @ MiFi 17.01 -> E3372 HiLink
| WR842ND v2 @ Gargoyle PL 1.13.0 -> testy

2

Odp: Konwersja iptables do nftables

to pierwsze: nft insert rule inet fw4 input iifname "eth1.3" ip daddr 192.168.1.1 tcp dport 22 counter reject

Itd. Chodzi o oto że w nft nie ma na stałe zdefiniowanych tablic typu INPUT, FORWARD itd (o takich nazwach i z dużych liter). Więc o ile składniowo jest dobrze o tyle musisz sobie to dostosować do tablic które masz teraz. Zrób sobie fw4 print i zobacz czym obecnie dysponujesz.

Jednak usilnie sugeruję żebyś zrobił własne reguły w firewalu przez uci. Unikniesz w ten sposób w przyszłości kłopotów jak coś sie zmieni

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3

Odp: Konwersja iptables do nftables

Aktualnie mam takie tablice (zawartość usunąłem)

Ruch ma być otwierany pomiędzy strefą LAN i DMZ.

Rozumem że w takim wypadku reguła powinna trafić do łańcucha "forward_lan"
nft insert rule ip filter forward_lan iifname "br-lan" oifname "eth1.3" ip saddr 192.168.25.0/27 ip daddr 172.16.1.2 tcp dport 53 counter accept

Natomiast ta do łańcucha "forward_dmz"
nft insert rule ip filter forward_dmz iifname "br-lan" oifname "eth1.3" ip saddr 192.168.25.0/27 ip daddr 172.16.1.2 tcp dport 53 counter accept

Czy może jednak wszystkie wrzucić tylko do łańcucha "forward" ?

table inet fw4
flush table inet fw4
delete flowtable inet fw4 ft

table inet fw4 {
        #
        # Flowtable
        #

        flowtable ft {
                hook ingress priority 0;
                devices = { "eth0", "eth1", "eth2", "wlan0", "wlan1", "wlan1-1" };
        }


        #
        # CT helper definitions
        #

        ct helper amanda {
                type "amanda" protocol udp;
        }

        ct helper RAS {
                type "RAS" protocol udp;
        }

        ct helper Q.931 {
                type "Q.931" protocol tcp;
        }

        ct helper irc {
                type "irc" protocol tcp;
        }

        ct helper pptp {
                type "pptp" protocol tcp;
        }

        ct helper sip {
                type "sip" protocol udp;
        }

        ct helper snmp {
                type "snmp" protocol udp;
        }

        ct helper tftp {
                type "tftp" protocol udp;
        }


        #
        # Defines
        #

        define lan_devices = { "br-lan" }
        define lan_subnets = { 192.168.1.0/24 }

        define wan_devices = { "eth0.2", "eth2" }
        define wan_subnets = { 85.xxx.xxx.0/24, 192.168.8.0/24 }

        define dmz_devices = { "eth1.3" }
        define dmz_subnets = { 172.16.1.0/29 }

        define guest_devices = { "br-guest" }
        define guest_subnets = { 10.0.1.0/29 }


        #
        # User includes
        #

        include "/etc/nftables.d/*.nft"


        #
        # Filter rules
        #

        chain input {
        }

        chain forward {
        }

        chain output {
        }

        chain prerouting {
        }

        chain handle_reject {
        }

        chain syn_flood {
        }

        chain input_lan {
        }

        chain output_lan {
        }

        chain forward_lan {
        }

        chain helper_lan {
        }

        chain accept_from_lan {
        }

        chain accept_to_lan {
        }

        chain input_wan {
        }

        chain output_wan {
        }

        chain forward_wan {
        }

        chain accept_to_wan {
        }

        chain reject_from_wan {
        }

        chain reject_to_wan {
        }

        chain input_dmz {
        }

        chain output_dmz {
        }

        chain forward_dmz {
        }

        chain helper_dmz {
        }

        chain accept_to_dmz {
        }

        chain reject_from_dmz {
        }

        chain reject_to_dmz {
        }

        chain input_guest {
        }

        chain output_guest {
        }

        chain forward_guest {
        }

        chain helper_guest {
        }

        chain accept_to_guest {
        }

        chain reject_from_guest {
        }

        chain reject_to_guest {
                oifname "br-guest" counter jump handle_reject comment "!fw4: reject guest IPv4/IPv6 traffic"
        }


        #
        # NAT rules
        #

        chain dstnat {
        }

        chain srcnat {
        }

        chain dstnat_wan {
        }

        chain srcnat_wan {
        }

        chain dstnat_dmz {
        }

        chain srcnat_dmz {
        }


        #
        # Raw rules (notrack)
        #

        chain raw_prerouting {
        }

        chain raw_output {
        }


        #
        # Mangle rules
        #

        chain mangle_prerouting {
        }

        chain mangle_postrouting {
        }

        chain mangle_input {
        }

        chain mangle_output {
        }

        chain mangle_forward {
        }
}

I jeszcze ostatnie pytanie czy z Lucyny da się wymusić atrybut "-m conntrack --ctstate ESTABLISHED,RELATED"

| C2600 @ OpenWrt 21.02 / LuCi -> sieć gościnna, WINS serwer, VLAN, DLNA, multiwan
| WDR4300 @ OpenWrt 21.02 / LuCI -> extroot, sieć gościnna, WINS serwer
| MR3020 @ MiFi 17.01 -> E3372 HiLink
| WR842ND v2 @ Gargoyle PL 1.13.0 -> testy

4

Odp: Konwersja iptables do nftables

Ja nie wiem gdzie to ma trafić bo nie wiem jakie masz sieci z jakimi interfejsami i adresacjami. Ty to wiesz.

Nie wiem w luci to można jakoś wyklikać, ja nie używam luci do takich celów.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5

Odp: Konwersja iptables do nftables

Ok to sytuacja wygląda tak.
Z przełącznika mam wydzielone dwa porty ethernet o nazwie "eth1.3" strefa na firewall nazywa się "DMZ"
W sieli br-lan mam adresację 192.168.1.0/24 natomiast w sieci dmz 172.16.1.0/24

W tej chwili chcę otworzyć ruch sieciowy pomiędzy lan a dmz na wybranych portach.
Do tego właśnie potrzebne mi są te reguły.

Na firewallu występują łańcuchy "forward" "forward_lan" "forward_dmz"

Niestety przy próbie dodanie najprostszej reguły do któregokolwiek łańcucha mam błąd.

root@openwrt:~# nft insert rule ip filter input iifname "eth1.3" ip daddr 192.168.
1.1 tcp dport 22 counter reject
Error: No such file or directory; did you mean table ‘fw4’ in family inet?
insert rule ip filter input iifname eth1.3 ip daddr 192.168.1.1 tcp dport 22 counter reject
               ^^^^^^
root@openwrt:~# nft insert rule ip filter input_dmz iifname "eth1.3" ip daddr 192.
168.1.1 tcp dport 22 counter reject
Error: No such file or directory; did you mean table ‘fw4’ in family inet?
insert rule ip filter input_dmz iifname eth1.3 ip daddr 192.168.1.1 tcp dport 22 counter reject
               ^^^^^^
| C2600 @ OpenWrt 21.02 / LuCi -> sieć gościnna, WINS serwer, VLAN, DLNA, multiwan
| WDR4300 @ OpenWrt 21.02 / LuCI -> extroot, sieć gościnna, WINS serwer
| MR3020 @ MiFi 17.01 -> E3372 HiLink
| WR842ND v2 @ Gargoyle PL 1.13.0 -> testy

6

Odp: Konwersja iptables do nftables

nft insert rule inet fw4... Robiłeś przecież listowanie reguł i widzisz że u ciebie masz table inet fw4 {

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

7

Odp: Konwersja iptables do nftables

Ok dzięki ale mimo wszystko nie jestem w stanie sobie z tym poradzić.
Z luci udało mi się to wyklikać to co chciałem ale nie jestem do końca z tego zadowolony (nie da się ustawić atrybutu "established")

Dodając te reguły z luci (dla przykładu zezwolenie ruchu z br-lna do dmz na porcie 53)

        chain forward_lan {
                oifname "eth1.3" ip daddr 172.16.25.2 tcp dport 53 counter jump accept_to_dmz comment "!fw4: RPi4_DNS_in"
                jump accept_to_wan comment "!fw4: Accept lan to wan forwarding"
                jump accept_to_lan
        }
        
        chain forward_dmz {
                iifname "eth1.3" ip saddr 172.16.25.2 udp sport 53 counter jump accept_to_lan comment "!fw4: RPi4_DNS_out"
                ct status dnat accept comment "!fw4: Accept port forwards"
                jump reject_to_dmz
        }

W jaki sposób zmodyfikować poniższe reguły żeby dodały to samo co powyżej ale z atrybutem "established"

nft insert rule ip filter inet fw4 iifname "br-lan" oifname "eth1.3" ip saddr 192.168.1.0/24 ip daddr 172.16.1.2 tcp dport 53 counter accept
nft insert rule ip filter inet fw4 iifname "eth1.3" oifname "br-lan" ip saddr 172.16.1.2 ip daddr 192.168.1.0/24 tcp sport 53 ctstate related,established counter accept
| C2600 @ OpenWrt 21.02 / LuCi -> sieć gościnna, WINS serwer, VLAN, DLNA, multiwan
| WDR4300 @ OpenWrt 21.02 / LuCI -> extroot, sieć gościnna, WINS serwer
| MR3020 @ MiFi 17.01 -> E3372 HiLink
| WR842ND v2 @ Gargoyle PL 1.13.0 -> testy

8

Odp: Konwersja iptables do nftables

Sam ostatnio trochę męczyłem się z firewallem i podobnie chciałem jakoś ogarnąć konwersję z iptables takiej konstrukcji:

iptables -A FORWARD -i $ILAN -o $IVPN -j ACCEPT
iptables -A FORWARD -i $IVPN -o $ILAN -m state --state RELATED,ESTABLISHED -j ACCEPT

Czyli generalnie zezwolenie na przekierowywanie (forwarding) $ILAN <--> $IVPN z ograniczeniami w kierunku $IVPN --> $ILAN. To reguły które można znaleźć w wielu tutorialach. Nawet u Cezarego.

Doszedłem do takiej konfiguracji firewalla:

config forwarding
        option src 'lan'
        option dest 'vpn'

config forwarding
        option name 'forward-vpn-to-lan'
        option src 'vpn'
        option dest 'lan'
        option enabled '0'

config include
        option  type            'nftables'
        option  path            '/etc/forward-vpn-to-lan.nft'
        option  chain           'forward_vpn'
        option  position        'chain-post'

Wiem, ten drugi config jest zablokowany. Umieściłem go tylko po to by jakoś zapamiętać, że ten forwarding realizowany jest przez własny skrypt NFT zaraz poniżej. Komentarzy nie używam bo uci i tak je wykasuje.

A zawartość /etc/forward-vpn-to-lan.nft wygląda tak:

oifname $lan_devices ct state related,established counter accept comment "Limited forwarding from VPN to LAN"

Może warto jeszcze wspomnieć, że komenda:

nft list table inet fw4

pomaga zobaczyć wszystkie załadowane reguły w przeciwieństwie do komendy fw4 print która nie pokazuje reguł z własnych skryptów NFT (pokazuje tylko include coś-tam.nft).

9

Odp: Konwersja iptables do nftables

jaros85 napisał/a:

...

W jaki sposób zmodyfikować poniższe reguły żeby dodały to samo co powyżej ale z atrybutem "established"

nft insert rule ip filter inet fw4 iifname "br-lan" oifname "eth1.3" ip saddr 192.168.1.0/24 ip daddr 172.16.1.2 tcp dport 53 counter accept
nft insert rule ip filter inet fw4 iifname "eth1.3" oifname "br-lan" ip saddr 172.16.1.2 ip daddr 192.168.1.0/24 tcp sport 53 ctstate related,established counter accept

tak jak pisał Cezary w Openwrt nie ma tablicy ip, chyba że ją sobie założysz. Jest "inet" i taką przyjmuje komenda poniżej

# nft insert rule inet fw4 forward_lan iifname "br-lan" oifname "eth1.3" ip saddr 192.168.1.0/24 ip daddr 172.16.1.2 tcp dport 53 ct state {established,related} counter accept

a tu kawałek łańcucha forward_lan

...
chain forward_lan {
        iifname "br-lan" oifname "eth1.3" ip saddr 192.168.1.0/24 ip daddr 172.16.1.2 tcp dport 53 ct state { established, related } counter packets 0 bytes 0 accept

nie wiem czy o to chodzi ale przyjmuje jak trzeba

Xiaomi AX3000T @ Netgear R6220
* DVBT2 - T230C *