[Fli4l_dev] Conntrack-Helper FTP

Christoph Schulz fli4l at kristov.de
Mi Feb 19 22:04:50 CET 2014


Hallo!

Lutz Spindler schrieb:

> der FTP Server ist hinter dem Router und ich möchte nicht mit Port 21
> über das Internet zugreifen. was aber ohne Probleme geht.

Gut. Also erreichst du deinen FTP-Server im LAN, wenn du Port 21 des fli4l-
Routers an den Port 21 des FTP-Servers weiterleitest?

> 
> z.bsp. über den Port 4567 habe ich folgendes versucht
> 
> PF_PREROUTING_1='prot:tcp any:4567 DNAT:@dlink-EF3F41:21'

Besser wäre

PF_PREROUTING_1='prot:tcp dynamic:4567 DNAT:@dlink-EF3F41:21'

damit nur deine extern verfügbare Adresse in der Umleitung involviert ist 
und nicht z.B. Zugriffe von innen.

> 
> Bei Conntrack-Helper habe ich das versucht
> 
> PF_PREROUTING_CT_1='prot:tcp if:IP_NET_2_DEV:any any:4567 HELPER:ftp'
> PF_PREROUTING_CT_1='prot:tcp if:IP_NET_2_DEV:any any:21 HELPER:ftp'
> PF_PREROUTING_CT_1='tmpl:ftp if:IP_NET_2_DEV:any HELPER:ftp'
> 
> ich kann mich verbinden, aber kein Datenverzeichnis einlesen

Also im Falle des Zugriffs außen-->innen geht es erst einmal um _passiven_ 
Zugriff, damit die Firewall für den Datenkanal (der dann ja auch von außen 
aufgebaut wird) ein "Loch" aufmacht _und_ die Antworten des FTP-Servers 
entsprechend "umgeschrieben" werden (der FTP-Server antwortet mit "OK, 
horche auf 192.168.0.9", und dein Router gibt nach außen an den FTP-Client 
"OK, horche auf 2.3.4.5", wobei "2.3.4.5" hier die öffentliche Adresse des 
Routers ist). Das hast du anscheinend (laut Log) auch ausprobiert. Bei mir 
Zuhause klappt das wunderbar mit der Regel

PF_PREROUTING_CT_1='tmpl:ftp if:IP_NET_5_DEV:any HELPER:ftp'

die für dich

PF_PREROUTING_CT_1='prot:tcp if:IP_NET_2_DEV:any any:4567 HELPER:ftp'

heißen müsste, also deine erste Version. Allerdings konnte ich das nicht mit 
einer Portumsetzung 4567 --> 21 testen, weil ich seit kurzem nur zwei 
Möglichkeiten habe, ins Internet zu kommen (VDSL2 und LTE), und beides wird 
über Fritz!Boxen abgewickelt. Diese führen aber keine FTP-Übersetzung durch, 
wenn die Anfragen auf Port 4567 hereinkommen (ich kann in der Fritz!Box 
keine benutzerdefinierten Conntrack-Helper konfigurieren), so dass es dann 
bei mir nicht funktioniert:

ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (192,168,177,2,186,23)
[... hängt ...]

Hier ist "192.168.177.2" die Adresse meines fli4l-Routers zur Fritz!Box hin 
-- aus Sicht des fli4l-Routers ist das die externe IP, aber natürlich ist 
diese Adresse aus dem Internet nicht erreichbar. Die Fritz!Box setzt das nur 
dann korrekt um, wenn ich Port 21 nach außen hin freigebe. Da die 
Übersetzung aber bis zum Verbindungs-Ende des fli4l-Routers klappt, gehe ich 
davon aus, dass der Conntrack-Helper greift. Das sehe ich auch in der 
Firewall auf dem fli4l:

ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (89,183,32,5,145,225)
150 Opening ASCII mode data connection for /bin/ls.
total 12
dr-x--x--x 2   0 4096 Feb 19 19:20 bin
dr-x--x--x 2   0 4096 Feb 19 19:25 lib
drwxr-xr-x 3 990 4096 Feb 19 19:20 pub
226 Transfer complete.

Hier sieht man, dass die Adresse korrekt auf die externe IP (89.183.32.5) 
umgeschrieben wurde, wobei der FTP-Server die gar nicht kennt:

Feb 19 22:02:51 peacock ftpd[23045]: command: PASV
Feb 19 22:02:51 peacock ftpd[23045]: <--- 227 Entering Passive Mode 
(192,168,11,2,145,225)^M  

Die Übersetzung passiert auf dem fli4l im Conntrack-FTP-Helper-Modul, das 
durch die PREROUTING_CT-Regel an den Port 21 gebunden wird.


Viele Grüße,
-- 
Christoph Schulz
[fli4l-Team]



Mehr Informationen über die Mailingliste Fli4l_dev