Iptables memungkinkan FTP masuk

32

Saya ingin mengizinkan lalu lintas FTP yang masuk.

CentOS 5.4:

Ini /etc/sysconfig/iptablesfile saya .

# 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

Juga, secara default, modul ip_conntrack_netbios_n semakin dimuat.

#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  ]

Tetapi masalahnya bukan pada modul itu, karena saya mencoba membongkar dan masih belum berhasil.

Jika saya menonaktifkan iptables, saya dapat mentransfer cadangan saya dari komputer lain ke FTP. Jika iptables memberlakukan, maka transfer gagal.

Menjadi Gokul
sumber

Jawaban:

27

Server ftp Anda membutuhkan saluran untuk mentransfer data. Port 21digunakan untuk membangun koneksi. Jadi untuk memungkinkan transfer data Anda harus mengaktifkan port 20juga. Lihat konfigurasi berikut

Pertama muat modul berikut untuk memastikan koneksi ftp pasif tidak ditolak

modprobe ip_conntrack_ftp

Izinkan koneksi FTP pada port 21masuk dan keluar

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"

Izinkan port FTP 20untuk koneksi aktif masuk dan keluar

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"

Akhirnya izinkan FTP lalu lintas masuk pasif

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"

Untuk informasi lebih lanjut tentang masalah FTP dan firewall, lihat: http://slacksite.com/other/ftp.html#active

Sunting: Ditambahkan NEWke aturan input port 21.

Valentin Bajrami
sumber
2
Saya lupa menyebutkan bahwa itu --sport 1024: and --dport 1024:berarti bahwa kami menyertakan semua port dalam kisaran 1024:32535yang merupakan port yang tidak terjangkau, yang berarti bahwa pengguna tanpa akses privilege dapat menggunakan port ini untuk menguji aplikasi mereka.
Valentin Bajrami
@ Menjadi Gokul, Itu benar. Kami dapat mengontrol server kami pada port apa yang harus didengarkan untuk koneksi klien. Namun dalam mode pasif, kita harus menggunakan --sportuntuk menjadi mode tidak terprivasi untuk mengatasi masalah firewall dan membiarkan klien terhubung ke server.
Valentin Bajrami
2
Anda dapat menambahkan NEW,ESTABLISHEDtetapi itu tidak masalah. Koneksi pertama selalu dalam NEWkeadaan kemudian melompat ke RELATEDyang menunjukkan bahwa koneksi ini terkait dengan koneksi yang sudah diizinkan. Ketika koneksi berubah ke ESTABLISHEDkeadaan itu memberitahu kami bahwa koneksi telah dibuat di kedua sisi (server / klien). Anda mungkin mencoba -m state --state ...sebagai gantinya.
Valentin Bajrami
1
Itu NEWmemang penting. Sepertinya tidak akan berhasil tanpanya.
Leandros
1
@ val0x00ff Saya tidak mengerti perlunya --sport 1024:. Mengapa port klien berguna untuk aturan? Jika ia terhubung dari port 80 ke port pasif server, ia harus diizinkan untuk terhubung juga.
Yvan
15

Saya sudah melihat peraturan yang begitu luas di beberapa Blog dll dan bertanya-tanya mengapa tidak digunakan saja

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

bersama dengan nf_conntrack_ftpmodul. Ini lebih ringkas dan mudah dibaca, yang umumnya merupakan hal yang baik, terutama dengan firewall ...

FWIW, tampaknya ada perubahan di kernel 4.7, sehingga Anda perlu mengatur net.netfilter.nf_conntrack_helper=1via sysctl(misalnya memasukkannya /etc/sysctl.d/conntrack.conf) atau menggunakan

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

(lihat di sini untuk detail lebih lanjut)

Jakob
sumber
1
Info tentang kernel 4.7 menyelamatkan hidup saya, berusaha berjam-jam untuk membuatnya bekerja. Sederhana echo "1" > /proc/sys/net/netfilter/nf_conntrack_helperdan semuanya berfungsi seperti yang diharapkan.
Penjaga
1
Besar! 4.7 adalah masalah yang tidak bisa saya atasi pada Jessie kernel 4.9!
Arunas Bartisius
@Jakob ada masalah dengan koneksi terkait yang dapat digunakan untuk mengakses layanan lain: home.regit.org/wp-content/uploads/2011/11/… dan github.com/rtsisyk/linux-iptables-contrack-exploit
Yvan
6

Klien FTP:

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

SERVER FTP:

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

Untuk beralih antara mode pasif dan aktif di sisi klien

ftp> passive
Passive mode on.
ftp> passive
Passive mode off.
Sathish
sumber
3
Anda benar-benar pantas mendapatkan beberapa upvotes untuk ini. Lupa memuat modul nf_conntrack_ftp adalah sumber sakit kepala ketika memecahkan masalah koneksi FTP pasif dan pelacakan koneksi iptables. Dengan menggunakan modul ini, Anda dapat menghapus tipe "BARU" sehingga port-port ini dilindungi dari koneksi arbitrer tanpa sesi FTP sebelumnya dibuat.
Ryan Griggs
5

Menambahkan BARU memperbaikinya, saya percaya.

Sekarang, file iptables saya terlihat seperti ini ..

# 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

Mengetiknya sebagai jawaban, karena terlalu banyak karakter tidak diizinkan dalam komentar .. Terima kasih banyak atas bantuan Anda.

Menjadi Gokul
sumber
2
Keren itu berhasil dan senang saya mengarahkan Anda ke arah yang benar. Harap tandai jawaban Anda sendiri sebagai terselesaikan sehingga Anda membantu orang lain yang mencari jawaban yang tepat.
Valentin Bajrami
Saya percaya ada kesalahan ketik pada jawaban yang diterima. Saya percaya bahwa --dport 20:65535meninggalkan semua port dari 20 - 65535 terbuka dari port sumber manapun antara 1024: 65535, yang membuat banyak layanan terkena yang mungkin tidak boleh, kecuali diizinkan secara eksplisit. Saya percaya apa yang dimaksudkan adalah--dport 1024:65535
itnAAnti
0

Jika Anda memerlukan koneksi aktif dan pasif, dan sudah menerima ESTABLISHEDkoneksi, seperti:

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

Maka Anda hanya perlu membuka port 21 dan menambahkan aturan khusus untuk port pasif. Tidak diperlukan aturan untuk port 20 karena sudah diterima oleh ESTABLISHEDaturan di atas.

Pertama, terima koneksi baru di port 21:

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

Kemudian tambahkan CT helper untuk port pasif 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

Lihat juga:

Catatan: Anda harus mengatur 1024:seperti di server FTP Anda: cari port pasif default di konfigurasi FTP Anda. Jika tidak, Anda akan membuka terlalu banyak port yang mungkin bukan relatif FTP.

Catatan penting: Saya tidak menambahkan OUTPUTaturan saat standar saya berjalan iptables -P OUTPUT ACCEPT. Berarti saya percaya apa yang keluar dari kotak saya. Itu mungkin bukan pilihan yang baik, terutama dalam pengaturan NAT.

Catatan yang sangat penting: FTPS tidak akan berfungsi dengan pengaturan seperti itu, karena port pasif disembunyikan (dienkripsi), maka tidak ada cara untuk iptablesmenebak port yang baik. Lihat Mengubah IPTables untuk Mengizinkan FTP melalui TLS Menggunakan Port Pasif dan https://serverfault.com/questions/811431/are-my-iptables-for-ftps-with-tls-ok

Yvan
sumber