FTP mit IPTables weiterleiten

9

Ich versuche einen FTP-Server mit IPTables weiterzuleiten. Der FTP-Server läuft auf einer Windows 2008 Box (Cerberus).

Bild

Details Win Box:

  • IP: 192.168.220.51
  • FTP-Port: 21
  • PASV-Ports: 11000-13000

Der FTP-Server funktioniert hervorragend im LAN.

Der Router funktioniert einwandfrei für andere Clients (NAT, DHCP, Firewall, ...). Ich muss den FTP-Dienst an die Außenwelt weiterleiten, kann aber die Ports 20-21 (bereits belegt) nicht verwenden.

Ich habe es versucht, aber es hat nicht funktioniert:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21

Aktuelle IPTables-Konfiguration:

[root@router ~]# service iptables status
Table: nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           
2    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  127.0.0.1            0.0.0.0/0           
2    DROP       all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:2222 
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:67 
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:68 
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:1194 
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 
8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3128 
10   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
11   ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53 
12   ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:1194 
13   ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
14   DROP       udp  --  0.0.0.0/0            0.0.0.0/0           
15   DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Jede Hilfe wäre toll :-).

Bounty-Edit : Ich konnte das nicht herausfinden, jede Hilfe wäre sehr dankbar.

EDIT2

Ich kann jetzt Telnet auf meinem FTP-Server ausführen, nachdem ich dort Befehle ausgeführt habe:

modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21

Ich fange an, dorthin zu gelangen ... Ich denke, ich muss nur meine PASV-Ports jetzt zum Laufen bringen ...

EDIT3: Extra Info

[root@router ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 3251 packets, 154K bytes)
 pkts bytes target     prot opt in     out     source               destination         
  540 48534 ACCEPT     all  --  *      *       127.0.0.1            0.0.0.0/0           
4270K 5625M ACCEPT     all  --  *      *       192.168.220.0/24     0.0.0.0/0           
    0     0 DROP       all  --  eth1   *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:2222 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:67 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:68 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:1194 
   65  8487 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
    8   404 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:3128 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:1194 
63870   81M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
  974  224K DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0           
  638 34956 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 

Chain FORWARD (policy ACCEPT 3578K packets, 3355M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 2275K packets, 703M bytes)
 pkts bytes target     prot opt in     out     source               destination  



[root@router ~]# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 33954 packets, 2595K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:2121 to:192.168.220.51:21 

Chain POSTROUTING (policy ACCEPT 5925 packets, 699K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      eth1    0.0.0.0/0            0.0.0.0/0           
27170 1785K MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 5777 packets, 457K bytes)
 pkts bytes target     prot opt in     out     source               destination  

Lösung

So habe ich es gemacht, vielleicht nicht sehr hübsch, aber es funktioniert.

[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 11000:13000 -j DNAT --to 192.168.220.51:11000-13000
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 11000:13000 -j ACCEPT

Einige zusätzliche Hinweise: Der FTP-Server lauscht auf Bot 21 und 2121 und der PASV-Bereich ist auf 11000 bis 13000 eingestellt

Bart De Vos
quelle
Sind die FTP-Conntrack- und Nat-Kernel-Module geladen? Was ist die Ausgabe von lsmod | grep -i ftp?
Steven Montag
Leer, ich habe keine zusätzlichen Kernelmodule geladen. Brauche ich welche
Bart De Vos
1
@ TiZon: Ja. Iptables benötigt die Conntrack-Module, um die Portnummern und Adressen zu verfolgen, die FTP in den Befehlen PASV und PORT verwendet. Wenn Sie NAT ausführen, müssen die NAT-Module außerdem Portnummern und Adressen neu schreiben, damit das FTP-Protokoll ordnungsgemäß funktioniert.
Steven Montag
2
+1 für eine gute und vollständige Erklärung.
Gopoi
3
@TiZon: wie Steven Monai bereits erwähnt, um für FTP hinter einem NAT - Gateway richtig funktioniert, müssen Sie ip_conntrack_ftpund ip_nat_ftpKernel - Module geladen. FTP ist ein interessantes Protokoll, das hinter einem Firewall / NAT-Gateway behandelt werden muss. Möglicherweise ist es einfacher, sftp (SSH FTP) zu verwenden, das nur Port 22 verwendet und verschlüsselt ist (weitaus sicherer). FileZilla ist ein großartiger kostenloser FTP-Client, der SFTP unterstützt.
Sean C.

Antworten:

7

Damit der passive Support funktioniert, müssen Sie die passiven Ports mit denselben Portnummern an den internen FTP-Server weiterleiten .

Einfache Lösung: Alle ständig weiterleiten

InternetIP: 11000-13000 -> 192.168.220.51:11000-13000

Schwierigere Lösung:

Sie benötigen einen speziellen Verbindungsverfolgungsagenten, der das FTP-Protokoll liest und rechtzeitig die richtigen NAT-Zuordnungen vornimmt. Es sieht so aus, als ob ip_conntrack_ftp dies tun könnte.

e_tothe_ipi
quelle
Ich habe es so gemacht. Ich habe alle Ports permanent weitergeleitet. Es ist vielleicht nicht die beste Lösung, aber es funktioniert. Erster Beitrag bearbeitet mit Howto.
Bart De Vos
0
iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
modprobe nf_conntrack_ftp 
modprobe nf_nat_ftp

sollte genug sein

Yalok Iy
quelle
Sollte die Portnummer 2121nicht durch ersetzt werden 21? Woran erkennen die FTP-Module eine Verbindung als FTP-Steuerung? Wird es auf jede Verbindung über Port 21 vor oder nach NAT angewendet?
Kasperd
Eine Erklärung wäre nett, also wissen wir, dass Sie nicht nur die Antwort der Fracht kultivieren
Tom O'Connor
Sie wählen, welcher Quellport an welchen Zielport weitergeleitet werden soll. Es kann für Sie geeignet sein. Sie wird auf jede Verbindung zu dem Port angewendet, den Sie in unserem Fall 2121 in der Tabelle "PREROUTING" angegeben haben. Wie das Netfilter-FTP-Modul funktioniert, lesen Sie hier en.wikipedia.org/wiki/Netfilter#Connection_tracking_helpers
Yalok Iy