Nastavení nftables v debianu pro 3 lokální sítě s 1 bránou do internetu

Ahoj, potřeboval bych poradit nebo aspoň trochu navést. Mám doma pc s Debianem 10 a v něm 4 síťovky. Jedna je na desce a ty další tři jsou dokupované. A já bych potřeboval, aby ten počítač sloužil jako takový silnější router, s tím, že by na tom běžely ještě jinačí aplikace, které už si nastavím sám, ale s totím si nevím rady. Na internetu je hodně návodů, ale nikde není pořádně popsané proč se to píše vlastně takhle a co filtrovat a co ne a nevím co všechno ještě. Potřeboval bych, aby ty lokální sítě, které jsou 192.168.2.0/24, 192.168.12.0/24 a 192.168.2.22/24 měly přístup do internetu skrz tu síťovku integrovanou na základní desce. Nebudu tady sdělovat veřejnou IP adresu, ale pro příklad by to mohlo být třeba 10.20.30.40. Taky by nebylo špatné, kdyby ty tři lokální sítě měly přístup i navzájem do sebe.

Nezná tady někdo prosím nějaký návod na internetu, popřípadě by byl ochotný mi nějak poradit? Byl bych mu moc vděčný. Předem děkuju moc.


Konfigurak pro nftables s 5 interfacy, enp1s0 je brana ven, na nem se dela maskarada. Enp2-4s0 je vnitri sit, wlp5s0 je wifi v mPCIe. Pak jeste povolit v sysctl ipv4_forwarding a melo by to fungovat. Forward mezi interfacy vnitri site mam jako accept, aby stroje v siti 172.16.0.0/12 mohly mezi sebou komunikovat. Ven mam povolene 22, 80, 443 stavovym firewallem:
Kód: [Vybrat]
#!/sbin/nft -f
# vim: ft=pf

### FLUSH RULESET
flush ruleset

### SERVERs
define IPV4_LOCAL = { 172.16.0.0/12 }

table ip filter {
    chain input {
        type filter hook input priority 0; policy drop;
        counter comment "count input accepted packets"

        ### DROP

        ### State firewall
        iifname enp1s0 ct state invalid counter log prefix "DROP INVALID: " drop comment "early drop of invalid packets"
        iifname enp1s0 ct state established,related counter accept comment "accept all connections related to connections made by us"

        iifname enp2s0 accept comment "accept all"
        iifname enp3s0 accept comment "accept all"
        iifname enp4s0 accept comment "accept all"
        iifname wlp5s0 accept comment "accept all"

        ### Loopback interface
        iifname lo accept comment "accept loopback"
        iifname != lo ip daddr 127.0.0.1/8 counter drop comment "drop connections to loopback not coming from loopback"

        ### Icmp
        ip protocol icmp counter limit rate 3600/hour burst 1200 packets log prefix "ACCEPT ICMP: " accept comment "accept all ICMP types"

        ### Allow LOCAL
        ip saddr $IPV4_LOCAL counter log prefix "ACCEPT LOCAL: " accept comment "connections comming from LOCAL servers"

        ### Allow INET access
        tcp dport 22 ct state new counter limit rate 6/minute burst 3 packets log prefix "ACCEPT SSH to port 22: " accept comment "connections via SSH"
        tcp dport 80 ct state new counter log prefix "ACCEPT HTTP to port 80: " accept comment "connections via HTTP"
        tcp dport 443 ct state new counter log prefix "ACCEPT HTTPS to port 443: " accept comment "connections via HTTPS"
    }

    chain forward {
        type filter hook forward priority 0; policy accept;
                counter comment "count forward dropped packets"
    }

    chain output {
        type filter hook output priority 0; policy accept;
        counter comment "count output accepted packets"
    }
}

table ip nat {
    chain prerouting {
            type nat hook prerouting priority 0;
    }
    chain postrouting {
            type nat hook postrouting priority 100;
        oifname "enp0s1" masquerade
    }
}

a pak:
Kód: [Vybrat]
nft -f /path/konfigurak.nft

Děkuju moc, zkusím se toho nějak chytit :)

Kód: [Vybrat]
table ip nat {
    chain prerouting {
            type nat hook prerouting priority 0;
    }
    chain postrouting {
            type nat hook postrouting priority 100;
        oifname "enp0s1" masquerade
    }
}

Akorát, nemělo by tady být v tom posledním řádku tohle?
Kód: [Vybrat]
oifname "enp1s0" masquerade

Ty tam máš enp0s1

Jj sry melo, mel by tam byt interface pres ktery delas NAT, takze interface, na kterem je brana ven.


Ahoj, ozývám se po delší době, ale teď jsem se k tomu až dostal. Zkusil jsem vzít to tvoje nastavení a přepsat to na moje interfacy, s tím, že jsem ještě změnil tu IPV4_LOCAL proměnnou, ale nejsem si jistý, jestli dobře. Potom v /etc/sysctl.conf jsem nastavil net.ipv4.ip_forward=1. Na těch interfacích mám nastavené pevné ip adresy, akorát ten wan mám teď připojený normálně do sítě, co mám v pokoji za routerem na DHCP. V tom pc můžu normálně pingovat ty síťovky, ale když jsem vzal druhý router a nastavil mu wan třeba na 192.168.2.200 a připojil ho na tu síťovku, která má adresu 192.168.2.254, tak mi na tom routeru nejde internet a nejde mi to z pc ani pingnout. Věděl by jsi proč? Tu síťovku v pc mám nastavenou takhle:

IP: 192.168.2.254
Maska: 255.255.255.0
Brána: 192.168.2.254
DNS: 192.168.2.254

Nejsem si jistý, jestli by neměla být váchozí brána právě ten interface, který je jako wan a momentálně je připojený do té moji sítě v pokoji. To samé DNS.

Takze to s jednim routrem funguje a s druhym, ne? Co mas odlisne? Masquaradou bys mel predavat pakety z jednoho segmentu site do druheho, napr. z 192.168.y.y do 10.y.y.y apod. Vypis nam teda, co mas v tom nft konfiguraku a co mas v /etc/network/interfaces (pokud mas Debian like based distro).
« Poslední změna: 02. 05. 2020, 21:20:13 od zden2k »

V nft konfiguráku mám tohle:

Kód: [Vybrat]
#!/usr/sbin/nft -f
# vim: ft=pf

### FLUSH RULESET
flush ruleset

### SERVERs
define IPV4_LOCAL = { 192.168.0.0/14 }



table inet filter {
        chain input {
                type filter hook input priority 0; policy drop;
                counter comment "count input accepted packets"

                ### DROP


                ### State firewall
                iifname eno1 ct state invalid counter log prefix "DROP INVALID: " drop comment "early drop of invalid packets"
                iifname eno1 ct state established, related counter accept comment "accept all connections related to conections made by us"

                iifname enp4s0 accept comment "accept all"
                iifname enp5s0 accept comment "accept all"
                iifname enp7s0 accept comment "accept all"

                ### loopback interface
                iifname lo accept comment "accept loopback"
                iifname != lo ip daddr 127.0.0.1/8 counter drop comment "drop connections to loopback not comming from loopback"

                ### Icmp
                ip protocol icmp counter limit rate 3600/hour burst 1200 packets log prefix "ACCEPT ICMP: " accept comment "accept all ICMP types"

                ### Allow LOCAL
                ip saddr $IPV4_LOCAL counter log prefix "ACCEPT LOCAL: " accept comment "connection from LOCAL servers"

                ### Allow INET access
                tcp dport 22 ct state new counter limit rate 6/minute burst 3 packets log prefix "ACCEPT SSH to port 22: " accept comment "connection via SSH"
                tcp dport 80 ct state new counter log prefix "ACCEPT HTTP to port 80: " accept comment "connection via HTTP"
                tcp dport 443 ct state new counter log prefix "ACCEPT HTTPS to port 443: " accept comment "connection via HTTPS"
        }


        chain forward {
                type filter hook forward priority 0; policy accept;
                counter comment "count forward dropped packets"
        }
        chain output {
                type filter hook output priority 0; policy accept;
                counter comment "count output accepted packets"
        }
}

table ip nat {
        chain prerouting {
                type nat hook prerouting priority 0;
        }
        chain postrouting {
                type nat hook postrouting priority 100;
                oifname "eno1" masquerade
        }

}


V interfaces mám tohle:
Kód: [Vybrat]
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

No ale nakonec, jak jsem dal ten pc do pokoje za router, tak jsem si neuvědomil, že mi na tom routeru chybí routa, protože za ním je další router a až ten má přístup do internetu. Takže jsem udělal routu a vyřešila se část problému. Můžu teď pingovat skrz ty sítě jak chci, ať je to jedna síťovka v pc, druhá nebo ta třetí, čtvrtou zapojenou teď nemám. Můžu taky pingovat třeba dns googlu 8.8.8.8 nebo jinačí adresy. Problém ale nastává, když chci pingnout třeba google.cz. Někde se mi zastaví dns a už to nefunguje.

Síťovku eno1 jsem teda připojit do pokoje na router a nechal na ní DHCP.

Druhou síťovku enp4s0 jsem nastavil na:
ip adresu 192.168.18.254
s maskou 255.255.255.0
brána a dns je prázdné.. dns se tím pádem nastavilo asi na 0.0.0.0

Třetí síťovku enp5s0 sem nastail na:
ip adresu 192.168.20.254
s maskou 255.255.255.0
brána a dns zase prázdné

Na tu druhou jsem si přes switch, protože nemám křížený kabel připojil noťas a dal mu:
ip adresu 192.168.18.5
s maskou 255.255.255.0
a bránou a dns 192.168.18.254

Na třetí síťovku jsem dal router, jenom abych zkusil ten ping atd..

No a ten zlom nastane, když na noťasu změním dns z 192.168.18.254 třeba na 8.8.8.8. Potom mi normálně funguje internet, ale předtím, než to změním, mi funguje jenom pingování ip adres, protože ten dns má nějaký problém no..

No a ten zlom nastane, když na noťasu změním dns z 192.168.18.254 třeba na 8.8.8.8. Potom mi normálně funguje internet, ale předtím, než to změním, mi funguje jenom pingování ip adres, protože ten dns má nějaký problém no..
Protoze klient nevi, kam ma smerovat DNS, nejspis ze nastavujes vse manualne. Pokud bys na klentovi, ktery se k tomu pripojuje nastavil v NetworkManageru, nebo do /etc/resolv.conf DNS googlu ("nameserver 8.8.8.8") fungovat to bude.

Byt tebou, nastavil bych to cele pomoci DHCP. To pak samo preda klientum informaci o brane a spravny dns server. Osobne to mam nastavene s Dnsmasq (prislo mi to na konfiguraci asi nejjednodussi).

/etc/nftables.nft
Kód: [Vybrat]
#!/sbin/nft -f
# vim: ft=pf

### FLUSH RULESET
flush ruleset

### SERVERs
define IPV4_LOCAL = { 172.16.0.0/12 }

table ip filter {
    chain input {
        type filter hook input priority 0; policy drop;
        counter comment "count input accepted packets"

        ### DROP

        ### State firewall
        iifname enp0s9 ct state invalid counter log prefix "DROP INVALID: " drop comment "early drop of invalid packets"
        iifname enp0s9 ct state established,related counter accept comment "accept all connections related to connections made by us"

        iifname enp0s10 accept comment "accept all"
        iifname enp0s11 accept comment "accept all"
        iifname wlp0s12 accept comment "accept all"


        ### Loopback interface
        iifname lo accept comment "accept loopback"
        iifname != lo ip daddr 127.0.0.1/8 counter drop comment "drop connections to loopback not coming from loopback"

        ### Icmp
        ip protocol icmp counter limit rate 3600/hour burst 1200 packets log prefix "ACCEPT ICMP: " accept comment "accept all ICMP types"

        ### Allow LOCAL
        ip saddr $IPV4_LOCAL counter log prefix "ACCEPT LOCAL: " accept comment "connections comming from LOCAL servers"

        ### Allow INET access
        tcp dport 22 ct state new counter limit rate 6/minute burst 3 packets log prefix "ACCEPT SSH to port 22: " accept comment "connections via SSH"
        tcp dport 80 ct state new counter log prefix "ACCEPT HTTP to port 80: " accept comment "connections via HTTP"
        tcp dport 443 ct state new counter log prefix "ACCEPT HTTPS to port 443: " accept comment "connections via HTTPS"
    }

    chain forward {
        type filter hook forward priority 0; policy accept;
                counter comment "count forward dropped packets"
    }

    chain output {
        type filter hook output priority 0; policy accept;
        counter comment "count output accepted packets"
    }
}

table ip nat {
    chain prerouting {
            type nat hook prerouting priority 0;
    }
    chain postrouting {
            type nat hook postrouting priority 100;
        oifname "enp0s9" masquerade
    }
}

V interfaces mam nastavene staticke adresy na interfacech, ktere delaji brany. Pres "up" se nastavi take ten FW:
Kód: [Vybrat]
/etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# ETH0
auto enp0s9
iface enp0s9 inet dhcp
up nft -f /etc/nftables.nft
#up sleep 3 && dhclient enp0s9 >/dev/null

# ETH1
auto enp0s10
iface enp0s10 inet static
        address 172.30.1.1
        netmask 255.255.255.0

# ETH2
auto enp0s11
iface enp0s11 inet static
        address 172.30.2.1
        netmask 255.255.255.0

# WIFI
auto wlp0s12
iface wlp0s12 inet static
address 172.30.9.1
netmask 255.255.255.0

Pak to vypada takhle, "ip a s". Ta adresa 192.168.1.152 je ip od poskytovatele netu z anteny na strese, ziskana pres dhcp:

Kód: [Vybrat]
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0d:b9:20:43:04 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.152/24 brd 192.168.1.255 scope global dynamic enp0s9
       valid_lft 580sec preferred_lft 580sec
    inet6 fe80::20d:b9ff:fe20:4304/64 scope link
       valid_lft forever preferred_lft forever
3: enp0s10: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:0d:b9:20:43:05 brd ff:ff:ff:ff:ff:ff
    inet 172.30.1.1/24 brd 172.30.1.255 scope global enp0s10
       valid_lft forever preferred_lft forever
    inet6 fe80::20d:b9ff:fe20:4305/64 scope link
       valid_lft forever preferred_lft forever
4: enp0s11: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:0d:b9:20:43:06 brd ff:ff:ff:ff:ff:ff
    inet 172.30.2.1/24 brd 172.30.2.255 scope global enp0s11
       valid_lft forever preferred_lft forever
5: wlp0s12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d4:ca:6d:14:49:78 brd ff:ff:ff:ff:ff:ff
    inet 172.30.9.1/24 brd 172.30.9.255 scope global wlp0s12
       valid_lft forever preferred_lft forever
    inet6 fe80::d6ca:6dff:fe14:4978/64 scope link
       valid_lft forever preferred_lft forever


No a hlavni "magic" mi tam dela Dnsmasq. Napr. klient pripojeny pres wifi na interface wlp0s12 se zepta na adresu, z dhcp obdrzi nejakou z poolu 172.30.9.200,172.30.9.249 na 10 minut. Na klientovi se automaticky nastavi i /etc/resolv.conf (kde je "nameserver 172.30.9.1"). Takze pokud klient nezna nejake dns jmeno, zepta se 172.30.9.1. Zde je dnsmasq, ktery se dopta "199.85.126.30" a vrati uz znamou adresu klientovi. V /etc/dnsmasq.conf a /etc/dnsmasq.hosts, mam definovane i staticke dns zaznamy, takze nemusism pingovat jen pres adresy, ale muzu i pres dns jmena.

/etc/dnsmasq.conf
Kód: [Vybrat]
#------------------#
#   Static Hosts   #
#------------------#

dhcp-host=44:98:0E:35:F7:38 ,pc0 ,172.30.2.10 ,24h   # staticke zaznamy, pokud potrebuji, a nechci pridelovat jen dynamicky z DHCP
dhcp-host=00:23:dc:6b:60:43 ,pc1 ,172.30.2.11 ,24h
dhcp-host=11:db:f4:0f:22:23     ,pc2            ,172.30.2.12    ,24h


#--------------------#
#   Basic settings   #
#--------------------#

except-interface=enp0s9
domain=mojedomena.cz
expand-hosts
domain-needed
bogus-priv
no-resolv
no-poll
no-hosts

#-----------------#
#   DNS Servers   #
#-----------------#

all-servers
server=199.85.126.30   # servery, ze kterych bery DNS, klidne taky muzes mit 8.8.8.8
server=199.85.127.30
server=208.67.222.123
server=208.67.220.123

#-----------------#
#   DNS Options   #
#-----------------#

dhcp-authoritative
dhcp-option=option:domain-search,mojedomena.cz
addn-hosts=/etc/dnsmasq.hosts

#-------------------#
#   Dynamic Hosts   #
#-------------------#

# ETH1:
dhcp-range=172.30.1.200,172.30.1.249,255.255.255.0,10m      # tady prideluju DHCP adresy, podle interace, na vsech mam DHCP
# ETH2:
dhcp-range=172.30.2.200,172.30.2.249,255.255.255.0,10m
# WIFI:
dhcp-range=172.30.9.200,172.30.9.249,255.255.255.0,10m

/etc/dnsmasq.hosts
Kód: [Vybrat]
172.31.2.10             pc0 pc0.mojedomena.cz
172.31.2.11             pc1 pc1.mojedomena.cz
172.31.2.12             pc2 pc2.mojedomena.cz
« Poslední změna: 03. 05. 2020, 10:29:12 od zden2k »

Tak nainstaloval jsem ten balíček dnsmasq a trochu to pročetl.. Nakonec jsem ho nechal takhle:
Kód: [Vybrat]
domain-needed
bogus-priv
no-resolv
no-poll
except-interface=eno1
no-dhcp-interface=eno1
no-hosts

A všechno se to rozběhlo, tak jak má, i bez DHCP. Děkuju moc..

Ještě musím nějak projít přesměrování portů, to se taky děla asi v nftables že?

A potom nějaký program na sledování využití podle ip adres.. Něco jak je třeba BitMeter II nebo něco na ten způsob.. Už si nemůžu vzpomenout na ten jeden program, který jsem kdysi viděl. Byly to zelené grafy, které se daly zobrazit přes html, když jsem vyhledal tu adresu 192.168.2.254 a na každé stránce jich bylo několik.

A když se na to ještě tak dívám, tak tam ten řádek

Kód: [Vybrat]
no-dhcp-interface=eno1
nemusí být, protože dhcp tam nikde nepoužívám.

Nastavil jsem ty porty takhle, tak doufám, že je to dobře..

Kód: [Vybrat]
                #Server
                tcp dport 10070 dnat to 192.168.2.220:10070
                udp dport 10070 dnat to 192.168.2.220:10070
                tcp dport 10071 dnat to 192.168.2.220:10071
                udp dport 10071 dnat to 192.168.2.220:10071
                tcp dport 10072 dnat to 192.168.2.220:10072
                udp dport 10072 dnat to 192.168.2.220:10072

                #Matusik
                tcp dport 10000 dnat to 192.168.2.164:10000
                udp dport 50    dnat to 192.168.2.164:10050
                udp dport 51    dnat to 192.168.2.164:10051
                udp dport 500   dnat to 192.168.2.164:10052
                udp dport 4500  dnat to 192.168.2.164:10053
                tcp dport 5446  dnat to 192.168.2.164:10054
                udp dport 5446  dnat to 192.168.2.164:10054
                tcp dport 80    dnat to 192.168.2.164:10055

                #Petr GameRanger
                tcp dport 16000 dnat to 192.168.2.168:16000
                udp dport 16000 dnat to 192.168.2.168:16000


Vždycky ten vlevo je veřejný port a ten vpravo privátní.