Jails bei Hetzner

Hier mal ein Auszug aus meiner pf.conf (bzgl. NAT)
hostsystem = "XXX.XXX.XXX.XXX"
public_if = "re0"
jail_if = "lo0"
jail1 = "192.168.0.1" #db
jail2 = "192.168.0.2" #www
jail3 = "192.168.0.3" #mail
...
#NAT fuer die Jails aktivieren, Jails haben vollen Zugriff nach aussen
nat on $public_if inet from $jail1 to any -> $hostsystem
nat on $public_if inet from $jail2 to any -> $hostsystem
nat on $public_if inet from $jail3 to any -> $hostsystem

rdr pass on $public_if from any to $public_if -> $jail1:0
rdr pass on $public_if from any to $public_if -> $jail2:0
rdr pass on $public_if from any to $public_if -> $jail3:0
...
pass out all keep state

NAT kann ich im Moment nicht testen, wegen der Serversperrung.

Du hast doch mit unbound einen lokalen Resolver für DNS, den kannst Du vom Jail her kontaktieren.
Wo/wie kann ich das in der Jail einstellen?
 
Den unbound kannst Du auf 127.0.0.10 horchen lassen (Alias auf dem Jail-Host; weiteres siehe local_unbound-rc.d-Skripte) und dann trägst Du im Jail /etc/resolv.conf entsprechend 127.0.0.10 ein. Dann hast Du schon mal DNS über den Jail-Host laufen und nicht über das Jail direkt ins Netzwerk.
 
Zunächst mal danke nakal, werde das so umsetzen, schadet ja sicher nicht.
Dennoch glaube ich augrund der Logs nicht, dass die Pakete vom DNS kamen. Irgendwie kann ich mir immer noch keinen Reim daraus machen. In den Logs wird port 123 genannt, der anscheinend nicht erreichbar ist, was klar ist, weil ich im Jail keinen NTP laufen habe. Aber woher kam die Anfrage?
Kann es sein, dass die Pakete trotz nat deshalb an das re0 gelangen, weil re0 auch in den Jails als Interface verfügbar ist?
Gibt es eine Möglichkeit re0 in der rc.conf der Jails zu deaktivieren?
 
Wenn du meinst, dass NTP das Problem ist, dann stoppe dieses Daemon und installiere dir "openntpd" dieses kannst du nur auf "localhost" laufen lassen und nicht auf allen Interfaces.
 
Update, nach erneuter Sperrung wegen unerlaubter Pakete von 127.0.0.1:

15:54:09.777534 xx:xx:xx:xx:xx:xx > xx:xx:xx:xx:xx:xx, ethertype IPv4
(0x0800), length 70: 127.0.0.1 > 91.218.38.220: ICMP XXX.XXX.XXX.XXX udp
port 123 unreachable, length 36

nach der letzten Sperrung habe ich mir einige eurer Ratschläge zu Herzen genommen und folgendes gemacht:

- IP Adressbereich für Jails geändert von 192.168.0.0/24 auf 127.0.0.1/24 (alle aliase sind auf Interface lo0)
- ntp mit openntpd ersetzt
- openntpd ausschließlich auf die öffentliche IP Adresse XXX.XXX.XXX.XXX lauschen lassen (überprüft per sockstat)

mit diesen Änderungen ging die Sache für ca. 1 Woche lang gut, heute wurde das Ding erneut gesperrt. Irgendwie scheint meine MySQL Jail DNS Anfragen nach "drausen" zu schicken, was eigentlich gar nicht sein kann. Hier mal ein sockstat von der Jail, die anscheinend die Probleme macht:
root@db:/ # sockstat
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root cron 1270 4 dgram -> /var/run/logpriv
smmsp sendmail 1266 3 dgram -> /var/run/log
root sendmail 1263 3 tcp4 127.0.0.1:25 *:*
root sendmail 1263 4 dgram -> /var/run/logpriv
mysql mysqld 1256 14 tcp4 127.0.0.1:3306 *:*
mysql mysqld 1256 15 stream /tmp/mysql.sock
root syslogd 1096 4 dgram /var/run/log
root syslogd 1096 5 dgram /var/run/logpriv
root syslogd 1096 6 udp4 127.0.0.1:514 *:*

Kann sich das Verhalten jemand erklären? Ich weiß leider keinen Ausweg mehr, außer über pf zu versuchen sämtlichen Traffic auf port 123 zu blocken. Dazu würde ich folgende Regel in meine pf.conf übernehmen:
block quick from 127.0.0.0/24 to any port 123

Hat jemand vielleicht sonst noch einen Vorschlag, was ich noch probieren könnte (evtl. auch mit pf)?
 
Hast Du vielleicht eine rdr-Regel, die 127.0.0.0/8 mappt? Guck mal die State-Tabelle mal an.

pfctl -ss -vvv

Vielleicht siehst Du da welche Paketfilterregel das erzeugt.

Vollem gehört dann auch ntpd auf lo0 gebunden und nicht auf alle NICs.
 
@nakal
nein, mit rdr werden lediglich die Ports 22,25,80,443,465,993 weitergeleitet, sonst nichts.
Momentan habe ich den openntpd lediglich auf die öffentliche IP Adresse gebunden, die sich wiederum auf dem re0 Interface befindet. In keiner der Jails (die alle auf dem lo0 Interface sind) habe ich ntpd laufen.

@TCM: ok, da brauche ich jetzt etwas Hilfe in der Umsetzung in meiner pf.conf. Damit ich von den Jails aus Updates einspielen kann, hatte ich bis dato folgende Regel => pass out all keep state
udp Anfragen auf port 123 wurden also zugelassen, das würde ich jetzt folgendermaßen anpassen/ersetzen => pass out from any to any port { 21 80 443 } keep state

Hier mal meine pf.conf, für Ratschläge, Ergänzungen, Korrekturen bin ich sehr dankbar!

pub_if = "re0"
jail_net = "127.0.0.0/24"
hostsystem="XXX.XXX.XXX.XXX"
jail1 = "127.0.0.1" #mysql
jail2 = "127.0.0.2" #www
jail3 = "127.0.0.3" #mail

scrub in all
antispoof for lo0,re0

#Neue Regeln in Zusammenarbeit mit bsdforen.de
block all
pass out from any to 21,80,443 keep state
pass in on $pub_if inet proto icmp all icmp-type echoreq keep state

#Ende neue Regeln

##########SSH zum Hostsystem erlauben
rdr pass on $pub_if proto tcp from any to ($pub_if) port 2222 -> $hostsystem port 22
rdr pass on $pub_if proto tcp from any to ($pub_if) port 22222 -> $jail2 port 22

#Port 80 wird an Jail weitergeleitet
rdr pass on $pub_if proto tcp from any to ($pub_if) port 80 -> $jail2 port 80

#Port für Email System werden an die Mail Jail weitergeleitet
#rdr pass on $pub_if proto tcp from any to ($pub_if) port 110 -> $jail3 port 110
rdr pass on $pub_if proto tcp from any to ($pub_if) port 993 -> $jail3 port 993
rdr pass on $pub_if proto tcp from any to ($pub_if) port 25 -> $jail3 port 25
rdr pass on $pub_if proto tcp from any to ($pub_if) port 465 -> $jail3 port 465

#NAT fuer die Jails aktivieren
nat on $pub_if inet from $jail1 to any -> $hostsystem
nat on $pub_if inet from $jail2 to any -> $hostsystem
nat on $pub_if inet from $jail3 to any -> $hostsystem

rdr pass on $pub_if from any to $pub_if -> $jail1:0
rdr pass on $pub_if from any to $pub_if -> $jail2:0
rdr pass on $pub_if from any to $pub_if -> $jail3:0

pass out all keep state #Diese Regel würde ich jetzt löschen
 
Den unbound kannst Du auf 127.0.0.10 horchen lassen (Alias auf dem Jail-Host; weiteres siehe local_unbound-rc.d-Skripte) und dann trägst Du im Jail /etc/resolv.conf entsprechend 127.0.0.10 ein. Dann hast Du schon mal DNS über den Jail-Host laufen und nicht über das Jail direkt ins Netzwerk.

Jails in 127.0.0.0/8 zu legen ist keine gute Idee. Nimm dafür besser etwas aus RFC1918, wenn du keine public IPv4 Adressen mehr hast und nur IPv6 nicht reicht.
 
Ok, ich kann auch wieder zurück zu dem 192.168.0.0/8 Netz, das ist kein Problem. Die Frage bleibt, ob ich davon ausgehen kann, dass mit obiger pf.conf sämtlicher ntp traffic der Jails von re0 fern gehalten wird und ich die Jails trotzdem mit Updates versorgen kann.
 
Das pass out from any würde ich zumindest schonmal auf from ($pub_if) einschränken.
 
Nur wenn die mit einer anderen Adresse als ($pub_if) rauswollen, was du ja genau verhindern willst. Erlaubende Regeln immer so spezifisch wie möglich schreiben.
 
Jails in 127.0.0.0/8 zu legen ist keine gute Idee.

Hmm? Warum? Die Idee war ursprünglich zwar nicht von mir, aber sie ist super und erprobt. Cool ist, dass man beim Einbruch ins Jail nicht so einfach ans LAN kommt, weil die 127.0.0.0/8-Adressen einfach nicht geroutet werden.
 
So, spätesdens jetzt kapier ich überhaupt nichts mehr. Nach der letzten Sperrung habe ich mal testweise sämtliche Jails heruntergefahren. Zur Kontroller ein #jls gemacht, keine laufenden Jails => ok.
Im Hostsystem ein sockstat ausgeführt:
root@srv02:/home/martin # sockstat
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
martin sshd 4288 3 tcp4 XXX.XXX.XXX.XXX:22 XXX.XXX.XXX.XXX:51839
martin sshd 4288 4 stream -> ??
root sshd 4285 3 tcp4 XXX.XXX.XXX.XXX:22 XXX.XXX.XXX.XXX:51839
root sshd 4285 5 stream -> ??
root sshd 1038 3 tcp4 XXX.XXX.XXX.XXX:22 *:*
_ntp ntpd 977 3 dgram -> /var/run/logpriv
_ntp ntpd 977 4 stream -> ??
_ntp ntpd 977 5 stream -> ??
_ntp ntpd 977 8 stream -> ??
_ntp ntpd 975 3 dgram -> /var/run/logpriv
_ntp ntpd 975 5 stream -> ??
_ntp ntpd 975 6 udp4 XXX.XXX.XXX.XXX:123 *:*
_ntp ntpd 975 7 stream -> ??
root ntpd 974 3 dgram -> /var/run/logpriv
root ntpd 974 4 stream -> ??
root syslogd 842 4 dgram /var/run/log
root syslogd 842 5 dgram /var/run/logpriv
root syslogd 842 6 udp6 *:514 *:*
root syslogd 842 7 udp4 *:514 *:*
root devd 715 4 stream /var/run/devd.pipe
root devd 715 6 dgram -> /var/run/logpriv
root@srv02:/home/martin #

wie man sieht, laufen lediglich sshd, ntpd und syslog, wobei nur die ersten beiden in der pf.conf nach außen freigeschaltet sind. Hie noch einmal meine aktuellen Regeln:

root@srv02:/home/martin # cat /etc/pf.conf
pub_if = "re0"
jail_net = "192.168.0.0/24"
jail_if = "lo1"
hostsystem="XXX.XXX.XXX.XXX"
jail1 = "192.168.0.1" #mysql
jail2 = "192.168.0.2" #www
jail3 = "192.168.0.3" #mail

scrub in all
#antispoof for lo0,re0

##########SSH zum Hostsystem erlauben
rdr pass on $pub_if proto tcp from any to ($pub_if) port 2222 -> $hostsystem port 22
rdr pass on $pub_if proto tcp from any to ($pub_if) port 22222 -> $jail2 port 22

#Port 80 wird an Jail weitergeleitet
rdr pass on $pub_if proto tcp from any to ($pub_if) port 80 -> $jail2 port 80

#Port fuer Email System werden an die Mail Jail weitergeleitet
#rdr pass on $pub_if proto tcp from any to ($pub_if) port 110 -> $jail3 port 110
rdr pass on $pub_if proto tcp from any to ($pub_if) port 993 -> $jail3 port 993
rdr pass on $pub_if proto tcp from any to ($pub_if) port 25 -> $jail3 port 25
rdr pass on $pub_if proto tcp from any to ($pub_if) port 465 -> $jail3 port 465

#NAT fuer die Jails aktivieren
nat on $pub_if inet from $jail1 to any -> $hostsystem
nat on $pub_if inet from $jail2 to any -> $hostsystem
nat on $pub_if inet from $jail3 to any -> $hostsystem

rdr pass on $pub_if from any to $pub_if -> $jail1:0
rdr pass on $pub_if from any to $pub_if -> $jail2:0
rdr pass on $pub_if from any to $pub_if -> $jail3:0

block all

pass out on $pub_if proto tcp from $pub_if to any port { 21, 53, 80, 123, 443, 2222 } keep state
pass out on $pub_if proto udp from $jail_if to any port 53 keep state

pass on $pub_if inet proto icmp all icmp-type echoreq keep state
pass on $jail_if inet proto icmp all icmp-type echoreq keep state

Heute wurde mein Server wieder mit der oben genannten Meldung gesperrt. 192.168.0.1 port 123 unreachable
Wie kann das sein? Ich habe wie gesagt sämtliche Jails ausgeschaltet, es läuft definitiv nur der Host mit den in oben geposteten Diensten. NTP ist so konfiguriert, dass es lediglich an der öffentlichen IP Adresse lauscht. Wohre kommen also diese Pakete, die anscheinend von 192.168.0.1 aus eine Anfrage machen?
 
Kann es sein, dass pf auf FreeBSD bei rdr die Antworten, dass ein Dienst nicht erreichbar ist, nicht zurückübersetzt?

Also Anfrage auf ($pub_if):123 wird übersetzt an 192.168.0.1:123. Dort läuft kein Dienst, 192.168.0.1 schickt ICMP port 123 unreachable, und das geht dann unverändert nach draußen?

Ich verstehe auch grad mal gar nicht die drei rdr-Zeilen. Leitest du _alles_ an die Jails? Von den drei Regeln würde letztendlich nur eine funktionieren, weil ja stumpf "to $pub_if" weitergeleitet wird. Wie war das mit "Erlaubende Regeln immer so spezifisch wie möglich schreiben."?

Davon abgesehen, was soll 192.168.0.1:0 für eine Syntax sein? Kann es sein, dass diese drei rdr Regeln da völlig fehl am Platz sind und von irgendwelchen Experimenten stammen?
 
Die drei rdr-Regeln kommen wir auch seltsam vor..
Für meine Webserver-Jail habe ich folgendes Setting:
Code:
#INTERFACES
ext_if="bge0"
int_if = "lo0"
jails = " { 10.0.0.1 10.0.0.2 10.0.0.3 } "

# Name and IP of jails
ReverseProxy1="10.0.0.1"

# NAT
nat on $ext_if from $jails to any -> ($ext_if)

# Redirect any packets requesting port 80 or 443 to jailed webserver
rdr pass on $ext_if inet proto tcp to port http -> $ReverseProxy1 port http
rdr pass on $ext_if inet proto tcp to port https -> $ReverseProxy1 port https

Gruß
Markus
 
Danke für eure Hinweise. Ich habe das Ganze jetzt in einer Virtualbox nachgebaut und dann mit Wireshark den Traffic abgehört. Zunächst mal zu den 3 mysteriösen rdr Filterregeln. Ihr habt natürlich Recht, diese gehören da nicht hin, wurden entfernt. Leider reichte das allein nicht aus (waren wohl nicht der Grund für die beanstandeten Pakete). Wenn ich am Testsystem von der Jail aus ein "portmaster fetch" gemacht habe, bekam ich mit Wireshark ständig Pakete von 192.168.0.1 unreachable icmp, also habe ich jetzt folgende Regel ganz an das Ende meiner pf.conf gestellt

block out on $pub_if proto { icmp, 123 } from $jail_net to any

damit wurde ich im Testsystem die Pakete los. Hoffentlich klappt das jetzt auch mit dem Hetzner Server.

Grüße
 
Hehe... natürlich nicht... habe falsch getippt... in der pf.conf steht lediglich ... proto icmp from ... :huth:
 
Zurück
Oben