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.
[...] kriege ich keinen ping mehr vom Host-System raus.
Das konnte ich durch ändern der Priorität der prerouting-Chain ändern (auf -101).
Mit
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:
# 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:
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
#!/usr/sbin/nft -f
flush ruleset
# interfaces
define ext_if1 = ens3
# management
define ip_mgmt = 123.123.123.123 # für das Beispiel hier ersetzt
# lx
define lx_if = lxdbr0
define lx_if_ip = 10.42.0.1
define lx_vm_c1 = 10.42.0.10
##########################################
table ip firewall4 {
##
# basic checks
##
chain base_checks {
# allow established/related connections
ct state {established, related} accept
# early drop of invalid connections
ct state invalid drop
}
##
# lx-stuff
##
chain lx_filter_input {
# dns
iifname $lx_if ip saddr $lx_vm_c1 ip daddr $lx_if_ip udp dport 53 accept
# dhcp
iifname $lx_if ip saddr 0.0.0.0 ip daddr 255.255.255.255 udp sport 68 udp dport 67 accept
}
chain lx_filter_forward {
# forward only packets from vm_x
ip saddr $lx_vm_c1 iifname $lx_if accept
ip daddr $lx_vm_c1 ct status dnat accept
}
chain lx_nat_prerouting {
# tcp dport 81 dnat $lx_vm_c1:80
# ssh c1 --> Port 123 auf 1234
ip saddr {$ip_mgmt} tcp dport 123 dnat $lx_vm_c1:1234
}
##
# Filter
##
chain filter_input {
type filter hook input priority 0; policy drop;
jump base_checks
# allow from loopback interface
iifname lo accept
jump lx_filter_input
}
chain filter_output {
type filter hook output priority 0; policy accept;
jump base_checks
}
chain filter_forward {
type filter hook forward priority 0; policy drop;
jump base_checks
jump lx_filter_forward
}
##
# nat
##
chain prerouting {
type nat hook prerouting priority -101; policy accept;
jump lx_nat_prerouting
}
chain postrouting {
type nat hook postrouting priority 0; policy drop;
oifname {$ext_if1,$lx_if} masquerade
}
}
Alles anzeigen
Container
#!/usr/sbin/nft -f
flush ruleset
# interfaces
define ext_if1 = eth0
# management
define ssh_port = 1234
define ip_mgmt = 123.123.123.123 # für das Beispiel hier ersetzt
##########################################
table ip firewall4 {
##
# basic checks
##
chain base_checks {
# allow established/related connections
ct state {established, related} accept
# early drop of invalid connections
ct state invalid drop
}
##
# management
##
chain management_input {
# ssh
# funktioniert nicht, da saddr die IP der Bridge ist
#ip saddr $ip_mgmt tcp dport $ssh_port log prefix "[C1] SSH: " accept
# funktioniert
tcp dport $ssh_port accept
}
##
# Filter
##
chain filter_input {
type filter hook input priority 0; policy drop;
jump base_checks
# allow from loopback interface
iifname lo accept
jump management_input
}
chain filter_output {
type filter hook output priority 0; policy accept;
jump base_checks
}
chain filter_forward {
type filter hook forward priority 0; policy drop;
jump base_checks
}
}
Alles anzeigen
Der Beitrag ist nun etwas länger geworden, ich hoffe aber das es hilft den Fehler zu finden 
Besten Dank Dir / Euch.