User Tools

Site Tools


nftables

nftables

Otestuj si pravidla, než se ustřelíš...

sh -c 'nft -f /etc/nftables.conf; sleep 30; nft flush ruleset'

Další poznámky

  • Pro NAT je potřeba vytvořit chain prerouting (i když prázdný).

The Pravidla

#!/usr/sbin/nft -f

flush ruleset

define port_dns = 53

define port_email_imap = 143
define port_email_managesieve = 4190
define port_email_pop3s = 995
define port_email_smtp_exchange = 25
define port_email_smtp_submission_starttls = 587

define port_http = 80
define port_https = 443

define port_irc_default = 6667
define port_irc_freenode_tls = 7000
define port_irc_tls = 6697

define port_ntp = 123

define port_prosody_clients = 5222
define port_prosody_servers = 5269

define port_quake3 = 27960

define port_quassel_core = 4242

define port_rsync = 873

define port_ssh = 48922

define port_torrent_opentracker = 6969

table inet filter {

  chain global {
    # stateful firewall on
    ct state established,related accept
    ct state invalid drop
    ip protocol icmp accept
    ip6 nexthdr icmpv6 accept
  }

  chain input {
    type filter hook input priority 0;
    policy drop;

    jump global

    # loopback
    iif lo accept

    tcp dport $port_dns accept
    udp dport $port_dns accept

    tcp dport { $port_email_imap , \
	        $port_email_managesieve , \
	        $port_email_smtp_exchange, \
	        $port_email_smtp_submission_starttls } accept

    tcp dport { $port_http, $port_https } accept

    tcp dport { $port_irc_tls } accept

    tcp dport { $port_prosody_clients, $port_prosody_servers } accept

    udp dport $port_quake3 accept

    tcp dport $port_ssh limit rate 15/minute burst 5 packets accept

    tcp dport $port_torrent_opentracker accept

    counter drop
  }

  chain output {
    type filter hook output priority 0;
    policy drop;

    jump global
    
    # loopback
    oif lo accept

    tcp dport $port_dns accept
    udp dport $port_dns accept

    tcp dport { $port_email_pop3s, $port_email_smtp_exchange } accept

    tcp dport { $port_http, $port_https } accept

    tcp dport { $port_irc_tls,  \
	        $port_irc_default, \
	        $port_irc_freenode_tls } accept

    udp dport $port_ntp accept

    tcp dport $port_prosody_servers accept

    tcp dport $port_rsync accept

    skuid { ww, neo } accept
  }
}

The NAT

table ip nat {
  chain prerouting {
    type nat hook prerouting priority 0;
    policy accept;
    
    iif "tun0" tcp dport 12345 dnat to 192.168.1.10:3389
  }
}

Docker smrdí

Komunikace host <-> container

  1. Smazat /sbin/iptables, jinak bude docker hrabat do firewallu. [info z 28. března 2020]
  2. Udělat si override pro síť dockeru, aby se daly ručně specifikovat pravidla na vyžádané IP adresy:

nano /etc/docker/daemon.json

{
  "iptables": false, <-- "nehrabej do firewallu" / "tak určitěěě"
  "ipv6": true,
  "bip": "172.19.0.1/24", <-- "IP adresa hosta, na iface docker0"
  "fixed-cidr": "172.19.0.0/24", <-- "IPv4 rozsah pro containery"
  "fixed-cidr-v6": "2a02:8304:29:d00d:d00d::/80" <-- "IPv6 rozsah pro containery - ukrojeno z alokovaného /64"
}
  1. Přidat do nftables:
table inet filter {
  chain output {
    # Docker
    oifname "docker*" accept
  }
}
nftables.txt · Last modified: 2022/03/16 09:38 (external edit)