Verständnisfrage // Problem nftables + POSTROUTING

  • Guten Abend zusammen,


    ich habe Debian 9 im Einsatz mit nftables und einem lxc container der über NAT und freigegebene Ports von Außen erreichbar ist.


    Vorweg: Alles funktioniert einwandfrei.


    Aber: Meine POSTROUTING chain wird anscheinend nie (!) aufgerufen.


    Mein ruleset:



    Im Netz habe ich die folgende Grafik gefunden (Quelle: https://www.karlrupp.net/en/computer/nat_tutorial)


    nat-chains.gifggg


    "Just before our forwarded packet leaves the machine it passes the POSTROUTING chain and then leaves through the network interface. For locally generated packets there is a small difference: Instead of passing through the PREROUTING chain it passes the OUTPUT chain and then moves on to the POSTROUTING chain."


    Wenn ich es doch nun richtig verstehe heißt es doch, egal ob ich das Packet weiterleite oder "selber nutze", es geht in jedem Fall in die POSTROUTING chain.


    Kann mir jemand von Euch sagen was ich falsch mache? Denn egal wie lange ich meine Maschine laufen lasse, über die Postrouting chain werden keine Pakete gezählt.

    Ebenfalls erscheint nichts im syslog (log-Befehl in der postrouting-chain).

    Getestet habe ich es mit einem Ping auf 8.8.8.8 sowohl vom Host aus, als auch aus meinem lxc container.


    Besten Dank.

  • Zu nftables kann ich leider nichts sagen. Aber ich habe hier für LXC kurzerhand Proxmox installiert und auch ein internes Netz gebaut, welches via iptables NAT macht.


    vmbr1 ist in dem Fall die Bridge, welche die eigentliche öffentliche IPv4 zugewiesen hat.


    Bei mir steht also als "outgoing Interface" nur das Interface drin, was die öffentliche IP hat. Bei Dir steht anscheinend zusätzlich die lxc Bridge mit drin.

  • Hallo,


    danke für Deine Antwort.


    Bei mir hat die Bridge eine eigene IP.

    Ebenfalls mein interface vom Host (ens33).


    Hier ein Auszug von ip addr show (Achtung, es handelt sich um eine lokale Test-vm, daher habe ich keine "public ip" auf ens33)



    Nun habe ich aber folgende Beobachtung gemacht:


    Mit oifname "lxbr3" masquerade

    Code
    table ip nat {
            chain postrouting {
                    type nat hook postrouting priority 100; policy drop;
                    oifname "lxbr3" masquerade
                    counter packets 0 bytes 0
                    log
            }
    }

    kriege ich keinen ping mehr vom Host-System raus.

    Das bedeutet, dass die POSTROUTING-Chain aufgerufen wird. Ein Blick in die syslog bestätigt dies nun: Es werden Log-Einträge erstellt...


    Eventuell ist es also nur ein Bug in nftables... hmm...

  • Hallo nochmal,


    wollte noch einmal eine kurze Rückmeldung geben.


    Ich bin Deinem Tipp gefolgt und habe ens3 die Rule reingenommen.

    Dann kriege ich aber kein SSH mehr in meinen Container.


    Code
    [...] kriege ich keinen ping mehr vom Host-System raus.

    Das konnte ich durch ändern der Priorität der prerouting-Chain ändern (auf -101).


    Mit

    Code
    oifname { "ens33", "lxbr3"} masquerade

    und der Priorität auf -101 klappt alles wunderbar.



    Nun habe ich aber noch etwas was ich nicht verstehe:


    Mein LXC-Container c1 hat auf Port 1234 einen SSH-Server laufen.

    Auf meinem Host-System möchte ich Port 123 auf 1234 umleiten.

    Im Container habe ich nftables installiert und wollte den Port für meine private IP öffnen (in dem Beispiel: 123.123.123.123).


    Alles klappt, aber:


    Code
    # funktioniert
    # tcp dport $ssh_port accept
    
    # funktioniert nicht
    # ip saddr $ip_mgmt tcp dport $ssh_port log prefix "[FWX C1] SSH: " accept


    Ein Login per SSH zeigt mir dann:

    Code
    Last login: Fri Jan 19 16:08:00 2018 from 10.42.0.1

    10.42.0.1 ist die IP der Bridge und das erklärt, warum die Beschränkung mit saddr nicht funktioniert.



    Mein Frage ist daher: Wie kann ich dieses Problem lösen? Ich müsste an den Container als saddr die IP die ankommt übergeben und nicht die der Bridge.


    Zur Sicherheit noch meine vollständigen Rules.


    Host


    Container


    Der Beitrag ist nun etwas länger geworden, ich hoffe aber das es hilft den Fehler zu finden :)


    Besten Dank Dir / Euch.