Teruskan FTP dengan IPTables

9

Saya mencoba meneruskan server FTP dengan IPTables. FTP-Server berjalan pada kotak Windows 2008 (Cerberus).

Gambar

Rincian Kotak Kemenangan:

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

Server FTP berfungsi dengan baik di LAN.

Router berfungsi dengan baik untuk klien lain (Melayani NAT, DHCP, Firewall, ...). Saya perlu meneruskan layanan FTP ke dunia luar, tetapi saya tidak bisa menggunakan port 20-21 (sudah diambil).

Saya mencoba ini, tetapi tidak berhasil:

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

Konfigurasi IPTables saat ini:

[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         

Setiap bantuan akan sangat bagus :-).

Bounty-Edit : Saya belum dapat menemukan ini, bantuan apa pun akan sangat dihargai.

EDIT2

Saya dapat melakukan telnet ke server FTP saya sekarang, setelah menjalankan perintah di sana:

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

Saya mulai ke sana ... Saya pikir saya hanya perlu mendapatkan PASV-Ports saya bekerja sekarang ...

EDIT3: Info Tambahan

[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  

Larutan

Ini adalah bagaimana saya melakukannya, mungkin tidak terlalu cantik, tetapi berhasil.

[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

Beberapa catatan tambahan: Server FTP mendengarkan bot 21 an 2121 dan kisaran PASV diatur dari 11000 hingga 13000

Bart De Vos
sumber
Apakah modul ftt conntrack & nat kernel dimuat? Apa output dari lsmod | grep -i ftp?
Steven Monday
Kosong, saya tidak memuat modul kernel tambahan. Apakah saya perlu beberapa?
Bart De Vos
1
@TiZon: Ya. Iptables membutuhkan modul-modul penghubung untuk melacak nomor port dan alamat yang digunakan FTP dalam perintah PASV dan PORT. Plus, ketika Anda melakukan NAT, modul NAT diperlukan untuk menulis ulang nomor port dan alamat agar protokol FTP dapat bekerja dengan benar.
Steven Monday
2
+1 untuk penjelasan yang baik dan lengkap.
Gopoi
3
@TiZon: seperti yang telah disebutkan Steven Monai, agar FTP dapat berfungsi dengan baik di belakang gateway NAT, Anda perlu ip_conntrack_ftpdan ip_nat_ftpmodul kernel dimuat. FTP adalah protokol yang menarik untuk berurusan dengan firewall / gateway NAT. Anda mungkin lebih mudah menggunakan sftp (SSH FTP) yang hanya menggunakan port 22 dan dienkripsi (jauh lebih aman). FileZilla adalah klien FTP gratis yang hebat yang mendukung SFTP.
Sean C.

Jawaban:

7

Agar dukungan pasif berfungsi, Anda perlu meneruskan port pasif ke server ftp internal dengan nomor port yang sama .

Solusi mudah: teruskan semuanya sepanjang waktu

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

Solusi yang lebih sulit:

Anda akan memerlukan beberapa agen pelacakan koneksi tujuan khusus yang membaca protokol FTP dan membuat pemetaan NAT yang tepat tepat waktu. Sepertinya ip_conntrack_ftp mungkin melakukan ini.

e_tothe_ipi
sumber
Saya melakukannya seperti ini. Saya secara permanen meneruskan semua porta. Ini mungkin bukan solusi terbaik, tetapi berhasil. Posting pertama diedit dengan 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

Seharusnya cukup

Yalok Iy
sumber
Bukankah nomor port 2121harus diganti 21? Bagaimana modul ftp mengenali koneksi sebagai kontrol ftp? Apakah ini akan diterapkan ke setiap koneksi menggunakan port 21 baik sebelum atau sesudah NAT?
kasperd
Beberapa penjelasan akan menyenangkan, jadi kami tahu Anda tidak hanya mencari jawaban
Tom O'Connor
Anda memilih port sumber mana ke port tujuan mana yang akan diteruskan. Mungkin cocok untuk Anda. Ini akan diterapkan ke setiap koneksi ke port yang Anda tentukan, dalam kasus kami 2121, dalam tabel "PREROUTING" nat. Bagaimana modul
ftf