Iptables, um eingehendes FTP zuzulassen

32

Ich möchte eingehenden FTP-Verkehr zulassen.

CentOS 5.4:

Das ist meine /etc/sysconfig/iptablesAkte.

# Generated by iptables-save v1.3.5 on Thu Oct  3 21:23:07 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [133:14837]
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT
# Completed on Thu Oct  3 21:23:07 2013

Außerdem wird standardmäßig das Modul ip_conntrack_netbios_n geladen.

#service iptables restart

Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

Das Problem liegt aber nicht bei diesem Modul, da ich versucht habe, es zu entladen und immer noch kein Glück habe.

Wenn ich iptables deaktiviere, kann ich mein Backup von einem anderen Computer auf FTP übertragen. Wenn sich iptables durchsetzt, ist die Übertragung fehlgeschlagen.

Gokul sein
quelle

Antworten:

27

Ihr FTP-Server benötigt einen Kanal zur Datenübertragung. Port 21wird verwendet, um die Verbindung herzustellen. Um die Datenübertragung zu ermöglichen, müssen Sie auch den Port aktivieren 20. Siehe folgende Konfiguration

Laden Sie zuerst das folgende Modul, um sicherzustellen, dass passive FTP-Verbindungen nicht abgelehnt werden

modprobe ip_conntrack_ftp

Zulassen von FTP-Verbindungen am 21eingehenden und ausgehenden Port

iptables -A INPUT  -p tcp -m tcp --dport 21 -m conntrack --ctstate ESTABLISHED,NEW -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
iptables -A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"

Erlaube FTP-Port 20für aktive eingehende und ausgehende Verbindungen

iptables -A INPUT  -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
iptables -A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"

Ermöglichen Sie schließlich passiven eingehenden FTP-Verkehr

iptables -A INPUT  -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow passive inbound connections"
iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow passive inbound connections"

Weitere Informationen zu FTP- und Firewall-Problemen finden Sie unter: http://slacksite.com/other/ftp.html#active

Bearbeiten: Wurde NEWder Eingaberegel für Port 21 hinzugefügt .

Valentin Bajrami
quelle
2
Ich habe vergessen zu erwähnen, dass dies --sport 1024: and --dport 1024:bedeutet, dass wir alle Ports in den Bereich einschließen 1024:32535, die nicht privilegierte Ports sind, was bedeutet, dass Benutzer ohne privilegierten Zugriff diese Ports zum Testen ihrer Anwendungen verwenden können.
Valentin Bajrami
@Being Gokul, das ist richtig. Wir können unseren Server steuern, an welchen Ports er auf Client-Verbindungen warten soll. In einem passiven Modus müssen wir --sportjedoch einen nicht privilegierten Modus für private Firewall-Probleme verwenden und Clients eine Verbindung zum Server herstellen lassen.
Valentin Bajrami
2
Nun, Sie können hinzufügen, NEW,ESTABLISHEDaber das sollte keine Rolle spielen. Eine Verbindung ist zuerst immer in einem NEWZustand, dann springt sie zu RELATEDdem , was darauf hinweist, dass diese Verbindung mit einer bereits erlaubten Verbindung zusammenhängt. Wenn sich die Verbindung in den ESTABLISHEDStatus ändert, werden wir darüber informiert, dass auf beiden Seiten (Server / Client) eine Verbindung hergestellt wurde. Sie könnten es -m state --state ...stattdessen versuchen .
Valentin Bajrami
1
Das NEWspielt ja eine Rolle. Ohne scheint es nicht zu funktionieren.
Leandros
1
@ val0x00ff Ich verstehe die Notwendigkeit für nicht --sport 1024:. Warum ist der Port des Clients für die Regel nützlich? Wenn er eine Verbindung von einem Port 80 zu den passiven Ports des Servers herstellt, muss er ebenfalls eine Verbindung herstellen dürfen.
Yvan
15

Ich habe solche umfangreichen Regeln schon in mehreren Blogs etc. gesehen und mich gefragt, warum man sie nicht einfach einsetzt

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

zusammen mit dem nf_conntrack_ftpModul. Dies ist prägnanter und lesbarer, was im Allgemeinen eine gute Sache ist, insbesondere bei Firewalls ...

FWIW, scheint es , dass es eine Änderung im Kernel 4.7 war, so dass man entweder Notwendigkeit, Satz net.netfilter.nf_conntrack_helper=1über sysctl(zB steckte es in /etc/sysctl.d/conntrack.conf) oder Verwendung

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp

(siehe hier für mehr Details)

Jakob
quelle
1
Die Informationen über Kernel 4.7 haben mir das Leben gerettet und ich habe stundenlang versucht, dies zum Laufen zu bringen. Ein einfaches echo "1" > /proc/sys/net/netfilter/nf_conntrack_helperund alles funktioniert wie erwartet.
Keeper
1
Groß! 4.7 war ein Problem, das ich auf Jessie Kernel 4.9 nicht lösen konnte!
Arunas Bartisius
@ Jakob Es gibt ein Problem mit RELATED-Verbindungen, mit denen auf andere Dienste zugegriffen werden kann: home.regit.org/wp-content/uploads/2011/11/… und github.com/rtsisyk/linux-iptables-contrack-exploit
Yvan
6

FTP-Client:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

FTP-SERVER:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Umschalten zwischen passivem und aktivem Modus auf der Clientseite

ftp> passive
Passive mode on.
ftp> passive
Passive mode off.
Sathish
quelle
3
Sie haben definitiv ein paar Gegenstimmen verdient. Das Vergessen, das Modul nf_conntrack_ftp zu laden, bereitet Kopfschmerzen bei der Fehlerbehebung bei passiven FTP-Verbindungen und der Verfolgung von iptables-Verbindungen. Mit diesem Modul können Sie den Typ "NEW" entfernen, damit diese Ports vor willkürlichen Verbindungen geschützt sind, ohne dass zuvor eine FTP-Sitzung eingerichtet wurde.
Ryan Griggs
5

Hinzufügen von NEW behoben, glaube ich.

Nun, meine Iptables-Datei sieht so aus ..

# Generated by iptables-save v1.3.5 on Thu Oct  3 22:25:54 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [824:72492]

-A INPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu Oct  3 22:25:54 2013

Tippen Sie es als Antwort ein, da zu viele Zeichen im Kommentar nicht erlaubt sind. Vielen Dank für Ihre Hilfe.

Gokul sein
quelle
2
Cool es hat geklappt und ich bin froh, dass ich dir die richtige Richtung gezeigt habe. Bitte markieren Sie Ihre eigene Antwort als gelöst, damit Sie anderen Menschen helfen können, die nach der richtigen Antwort suchen.
Valentin Bajrami
Ich glaube, die akzeptierte Antwort enthält einen Tippfehler. Ich glaube, --dport 20:65535dass alle Ports von 20 - 65535 von jedem Quellport zwischen 1024: 65535 offen gelassen werden, wodurch viele Dienste verfügbar gemacht werden, die wahrscheinlich nicht verfügbar sein sollten, es sei denn, dies ist ausdrücklich gestattet. Ich glaube, was beabsichtigt war, ist--dport 1024:65535
itnAAnti
0

Wenn Sie sowohl aktive als auch passive Verbindungen benötigen und bereits ESTABLISHEDVerbindungen akzeptieren , z.

iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Dann müssen Sie nur noch Port 21 öffnen und eine Sonderregel für passive Ports hinzufügen. Für Port 20 ist keine Regel erforderlich, da diese bereits von der ESTABLISHEDobigen Regel akzeptiert wird .

Akzeptiere zuerst neue Verbindungen auf port 21:

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

Fügen Sie dann den CT-Helfer für passive Ports hinzu 1024::

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp
iptables -A INPUT -p tcp -m conntrack --ctstate RELATED -m helper --helper ftp --dport 1024: -j ACCEPT

Siehe auch:

Hinweis: Sie müssen 1024:in Ihrem FTP-Server Folgendes einstellen : Suchen Sie in Ihrer FTP-Konfiguration nach den standardmäßigen passiven Ports. Andernfalls würden Sie zu viele Ports öffnen, die möglicherweise nicht mit FTP verwandt sind.

Wichtiger Hinweis: Ich habe keine OUTPUTRegeln hinzugefügt , da meine Standardeinstellungen damit übereinstimmen iptables -P OUTPUT ACCEPT. Das heißt, ich vertraue darauf, was aus meiner Box geht. Dies ist möglicherweise keine gute Option, insbesondere in einem NAT-Setup.

Sehr wichtiger Hinweis: FTPS funktioniert bei einem solchen Setup nicht, da der passive Port verborgen (verschlüsselt) ist und daher keine Möglichkeit besteht iptables, den guten Port zu erraten. Siehe Ändern von IPTables, um FTP über TLS über passive Ports zuzulassen, und https://serverfault.com/questions/811431/are-my-iptables-for-ftps-with-tls-ok

Yvan
quelle