Active FTP funktioniert nicht mit pkg_add

radiohead

Well-Known Member
Hi,

Merkwürdig. Ich dachte, ich hätte das Problem bereits verstanden und alles würde laufen, aber wenn ich nun Pakete mit pkg_add installieren möchte, klappt es nicht. Der Server möchte mit mir auf Port 20 sprechen, was aber verboten wird. Ich dachte der ftp-proxy soll sowas erledigen?

Hier mal meine Daten:

Code:
# echo $PKG_PATH
ftp://ftp.openbsd.org/pub/OpenBSD/4.2/packages/i386/

Code:
# ps ax|grep ftp
24701 ??  Is      0:00.01 ftp-proxy -r

Code:
# cat /etc/pf.conf                                                             
### Macros

ext_if="vr2"
int_if="vr0"
vpn_if="enc0"

lan="10.0.100.0/24"
imac="10.0.100.1"
voldemort="{ 127.0.0.1, 10.0.100.231 }"

isn_lan="XXX/24"
isn_jle="XXX"

ipsec_peers="XXX"

isp_dns="{ 213.178.66.111, 213.178.66.112 }"

table <sshattack> persist file "/var/log/sshattack"

### Options
set block-policy drop
set skip on lo 

### Default scrub rule
scrub in no-df

### NAT and RDR
nat on $ext_if from !($ext_if) -> ($ext_if)
nat-anchor "ftp-proxy/*"

rdr-anchor "ftp-proxy/*"
rdr on $int_if proto tcp from { $lan, $ext_if } to any port ftp -> 127.0.0.1 port 8021
rdr on $int_if proto tcp from { $lan, $ext_if } to any port www -> 127.0.0.1 port 8080

rdr on $ext_if proto tcp from any to any port 6881:6889 -> $imac port 6881:*
rdr on $ext_if proto tcp from any to any port 6969 -> $imac port 6969
rdr on $ext_if proto tcp from any to any port 52525 -> $imac port 52525

### Default block rules
block in log quick from <sshattack> to any
block in log 
block out log 

### Block basic network scanners

### FTP anchor
anchor "ftp-proxy/*"

### Spoofing protection
antispoof quick for { lo $int_if }

### Allow incoming traffic
pass in log quick on $ext_if proto tcp to ($ext_if) port ssh flags S/SA keep state \
(max-src-conn 10, max-src-conn-rate 5/30, overload <sshattack> flush global)

### Allow IPSec
pass in quick on $ext_if proto esp from $ipsec_peers to $ext_if
pass in quick on $ext_if proto udp from $ipsec_peers to $ext_if port { 500, 4500 }

pass out quick on $ext_if proto esp from ($ext_if) to any
pass out quick on $ext_if proto udp from ($ext_if) to any port { 500, 4500 }

### Allow everything coming in from lan
pass in quick on $int_if

### Allow connections originating from firewall or isn IPSec
pass out on $int_if proto tcp from $voldemort to $imac port ssh
pass out on $int_if proto tcp from $isn_jle to $imac port ssh
pass out on $int_if proto tcp from $isn_jle to $imac port 5900

### Allow IPSec tunnel traffic
pass in quick on $vpn_if 
pass out on $vpn_if proto tcp from $lan to $isn_lan port { ssh, domain, www, https, 1494, 2598 }
pass out on $vpn_if proto udp from $lan to $isn_lan port { domain, 1604 }

### Allow outgoing ping to any
pass out log inet proto icmp from { $ext_if, $lan } to any icmp-type echoreq

### Allow outgoing traceroute to any
pass out log inet proto udp from $lan to any port 33433 >< 33626

### Allow outgoing firewall traffic
pass out on $ext_if proto { tcp, udp } from ($ext_if) to $isp_dns port domain  
pass out on $ext_if proto { tcp, udp } from ($ext_if) to any port ntp  
pass out on $ext_if proto tcp from ($ext_if) to any port www  
pass out on $ext_if proto tcp from ($ext_if) to any port { ftp-data, ftp }  

### Allow rules for clients
pass out on $ext_if proto tcp from $ext_if to any port { ssh, smtp, imap, https, 465, imaps, 2710, 5190, 5222, 5223, 6881:6889, 6969, 52525 } 
pass out on $ext_if proto udp from $ext_if to any port 2000

Wenn ich jetzt ein pkg_add mache, erscheint im tcpdump folgendes:

Code:
# pkg_add -v ftp://ftp.openbsd.org/pub/OpenBSD/4.2/packages/i386/openvpn-2.0.9.tgz

# tcpdump -ttt -n -e -i pflog0 
tcpdump: listening on pflog0, link-type PFLOG
Mar 24 12:27:20.761136 rule 1/(match) block in on vr2: 129.128.5.191.20 > XXX.55438: [|tcp]

Was muss ich noch ändern, damit ich auch dieses aktive FTP nutzen kann? Ich hoffe doch nicht den Port 20 eingehend freischalten? Das soll doch der Proxy alles erledigen?
 
Hmm. Komisch. Mit einem Client hinter dem OpenBSD System klappt es, nur nicht vom OpenBSD System selbst...
 
Beim aktiven FTP sendet der Server aus Port 20 die Daten an der Client. Der Client hat dem Server schon vorher, seine IP-Adresse und sein Port (>1023) mitgeteilt. Der Paketfilter auf deinem OpenBSD-System lässt die Daten des Servers nicht rein. Du solltest die IP-Adresse des Servers mit deinem Paketfilter freigeben, denn diese wird geblockt. Beim Clienten hinter dem OpenBSD-System wird die Adresse des Servers nicht geblockt.
 
Ja genau das ist das Problem. Aber das alles soll doch der ftp-proxy machen. Wozu soll ich denn den Server eingehend frei schalten. Das möchte ich ungern. Es klappt doch auch hinter der Firewall, warum also nicht von der Firewall selbst auch?

Im Regelwerk ist doch auch nichts auf die Clients dahinter direkt freigeschaltet? Das muss doch gehen, wäre ja noch schöner, wenn ich dann die ganzen FTP Server immer eingehend freischalten müsste...
 
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021
 
Auch so hatte ich das schon drin. Das bringt nix. Geht von den Clients, jedoch nicht der Firewall selbst...
 
Musst du ihm villeicht noch expliziet sagen das er für pkg_add ftp das interface vom internen netzwerk verwenden muss?
 
Das Problem an der Sache ist natürlich, dass die Firewall selbst die Anfragen nicht an den Proxy schickt und ich somit diese Regeln erstellen müsste, dass ne Menge Ports eingehend erlaubt werden. Ich ziehe mir jetzt die Packages erst einmal am Client und kopiere sie dann auf die Box. Wenn jemand noch eine Lösung hat, wie man die Firewall selbst den eigenen Proxy nutzen lassen kann, immer her damit ;)
 
Hmm. Bei mir nimmt er die Variablen ftp_proxy (laut manpage) oder auch FTP_PROXY nicht an. Schreibe dort 127.0.0.1:8021 rein, aber der ftp-proxy bekommt davon nix mit. Im debug log taucht nur was auf, wenn ich von einem Client komme, nicht aber wenn ich von der OpenBSD Box selbst komme...
 
Ich bitte auch um Vorschläge. Stehe vor dem selben Problem und kurz vor der Verzweifelung!!!!!!!!! Entweder sehe ich den Wald vor lauter Bäumen nicht oder das mit dem FTP ist mir zu hoch!!! ;'(
 
Es geht einfach nur passive ftp. Damit active-ftp geht muss die Firewall Layer-7 wissen haben. Sie muss die Kommunikation aus dem ftp-Port belauschen um herauszufinden welche Ports für Server/Client geöffnet werden müssen.
 
Naja, komisch, dass es mit den Clients funktioniert. Man müsste halt nur der Firewall sagen können, dass sie selbst den ftp-proxy nutzen muss...
 
Nur als Beispiel, wie in meinem VPN-Netz aktive-FTP funktioniert:
Habe 2 Fritzboxen in 200Km Abstand (Wohnsitz1 und Wohnsitz2). Die Fritzboxen sind auch FTP-Server (aktiv) und mittels VPN miteinander verbunden. Als FTP-Client benutze ich Filezilla im Transfermodus aktiv. Aus dem Log des FTP-Clienten ist der aktiv-Modus ersichtlich (PORT-Befehl des Clienten):
Status: Verbinde mit 192.168.168.1:21...
Status: Verbindung hergestellt, warte auf Willkommensnachricht...
Antwort: 220 FRITZ!Box Fon WLAN 7170 FTP server ready.
Befehl: USER ftpuser
Antwort: 331 Password required for ftpuser.
Befehl: PASS ********
Antwort: 230 User ftpuser logged in.
Status: Verbunden
Status: Starte Download von /USBDISK-Partition-0-1/Postfach_FreeBSD/test_1mb.bin
Befehl: CWD /USBDISK-Partition-0-1/Postfach_FreeBSD/
Antwort: 250 CWD command successful.
Befehl: PWD
Antwort: 257 "/USBDISK-Partition-0-1/Postfach_FreeBSD" is current directory.
Befehl: TYPE I
Antwort: 200 Type set to I.
Befehl: PORT 192,168,158,185,11,163
Antwort: 200 PORT command sucessful.

Befehl: RETR test_1mb.bin
Antwort: 150 Opening BINARY mode data connection for 'test_1mb.bin' (1048576 bytes).
Antwort: 226 Transfer complete.
Status: Dateitransfer erfolgreich
In der pf.conf des Clienten habe ich u. a. folgende Regeln erstellt:
pass in quick on $vpn_if proto tcp from 192.168.168.1 to 192.168.158.185 port >1023
pass out quick on $vpn_if from $vpn_net1 to $vpn_net2
#pass quick on $vpn_if from { $vpn_net1 $vpn_net2 } to { $vpn_net2 $vpn_net1 }
Die auskommentierte Regel ist für den täglichen Gebrauch, die anderen für diesen Versuch.
#pftop -s 2 und pftop -s 2 -v rules zeigen die Verbindungen und den Datentransport:
pfTop: Up State 1-2/2, View: default, Order: none
PR D SRC DEST STATE AGE EXP PKTS BYTES
tcp O 192.168.158.185:57670 192.168.168.1:21 4:4 335 86066 28 1943
tcp I 192.168.168.1:2081 192.168.158.185:2978 4:4 334 86400 9962 6883K
D. h. der FTP-Client hat kein Problem mit dem aktiv-Modus, aber der FTP-Server bzw. seine Firewall muss diesen Modus ermöglichen.
 
Ja! Du machst ja aber auch ein Loch auf! Alle Port >1023 läßt du eingehend zu und das will ich nicht!
Angeblich soll sowas ja der ftp-proxy können automatisch und voll dynamisch können, aber das kann er anscheinend mit aktiv ftp nicht...
 
Klar mache ich ein Loch auf. Aber nur für meinen FTP-Server und ich bin ja in meinem VPN, da kommt sonst niemad rein. Und es ist ja nur als Beispiel für aktive-FTP gemeint.
 
Klar. Das was wir brauchen ist aber leider ein ganz normaler FTP im bösen www. Da ist nix mit VPN und Co. Klar würde ich im VPN auch mehr freischalten. So aber, nein Danke....
 
Das maximalste, was man sich vorstellen kann, ist halt das wir den eingehenden Verkehr zumindest von speziellen ftp Servern aus einschränken. Aber auch das ist nicht so toll....
 
Mal eine Idee / einen Vorschlag:

Verdeutliche dir z.B. mit einer Zeichnung wie FTP und NAT mit portforwarding funktionieren, und was du dazu tun müsstest. - Im endeffekt wirst du festellen, das NAT, Paketfilter e.t.c. + Protokolle die "Wahllos" irgendwelche Ports auswählen, eingehende und ausgehende Verbindungen vertauschen e.t.c. verdammt schmerzvoll ist *gg* - ich bin mir gerade nicht sicher aber ich glaube neben FTP zählt u.a. VoIP (SIP) z.B. noch dazu.
 
Wen juckt es, wenn kein Server auf diesen Ports lauscht?

Es geht auch mit ums Prinzip. Würde ich sowas bei unseren Kundenfirewalls machen, was meinst du was der Datenschützer dazu sagen würde ;)

Solange kein Dienst läuft okay, aber dann kann ja "jeder" irgendwas auf den Ports lauschen lassen...
 
Zurück
Oben