IPTABLES - Batas tingkat IP masuk tertentu

103

Saya tidak ingin membatasi tingkat layanan tertentu. Tujuan saya adalah membatasi laju hanya berdasarkan alamat IP yang masuk. Misalnya menggunakan aturan semu:

john.domain.local (192.168.1.100) can only download from our httpd/ftp servers at "10KB/s" (instead of 1MB/s)

Bagaimana saya bisa menilai batas menggunakan IPTable berdasarkan alamat IP yang masuk?

James
sumber

Jawaban:

165

IPTables tidak dibuat untuk jenis pekerjaan ini, di mana banyak dan banyak paket perlu dianalisis untuk membuat keputusan ini. IPTables sebagian jawabannya!

Jawaban sebenarnya untuk ini adalah fasilitas kontrol lalu lintas yang mengagumkan dan kurang digunakan di Linux. Perhatikan bahwa bermain-main dengan ini tanpa mengetahui apa yang sedang terjadi dapat menyebabkan Anda kehilangan konektivitas jaringan ke mesin! Anda telah diperingatkan!

Dengan asumsi eth0 adalah perangkat keluar Anda perlu membuat antrian kontrol lalu lintas berbasis kelas yang secara default akan menghasilkan sebagian besar lalu lintas melalui antrian 'cepat' dan memasukkan daftar orang tertentu ke dalam antrian 'lambat'.

Keindahan dari ini adalah Anda dapat membuat situasi di mana Anda mengizinkan banyak lalu lintas keluar untuk pengguna yang lambat kecuali kelas utama menginginkan bandwidth, tetapi contoh ini tidak melakukan ini (akan selalu memberikan 10 kbps untuk pengguna yang lambat). Sistem antrian akan terlihat seperti ini:

                         Inbound traffic
                              +
                              |
                              |
                              v
                     +------------------+
                     |   Class 1:1      |
                     |------------------|
                     |  Root (all flows)|
                     |       100mbit    |
                     +-----+-----+------+
                           |     |
                           |     |
                           |     |
                           |     |
                           |     |
          +----------+     |     |     +----------+
          |    1:11  +-----+     +-----+    1:12  |
          |----------|                 |----------|
          | Default  |                 | Slow     |
          |100mb-80kb|                 |   80kb   |
          +----------+                 +----------+

Untuk melakukan ini, pertama-tama Anda perlu mengatur disiplin antrian di kernel. Berikut ini akan melakukan ini untuk Anda .. Anda harus menjalankan ini sebagai satu skrip utuh

#!/bin/bash
tc qdisc add dev eth0 parent root handle 1: hfsc default 11
tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 100mbit ul rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:11 hfsc sc rate 99920kbit ul rate 100000kbit
tc class add dev eth0 parent 1:1 classid 1:12 hfsc sc rate 80kbit ul rate 80kbit

tc qdisc add dev eth0 parent 1:11 handle 11:1 pfifo
tc qdisc add dev eth0 parent 1:12 handle 12:1 pfifo

"Default 11" penting karena memberi tahu kernel apa yang harus dilakukan dengan lalu lintas yang tidak diklasifikasikan.

Setelah ini selesai, Anda dapat mengatur aturan iptables untuk mengklasifikasikan paket yang cocok dengan kriteria tertentu. Jika Anda berencana untuk menempatkan banyak dan banyak orang ke dalam aturan lambat ini, aturan ipset lebih tepat (yang seharusnya tersedia di rhel6 saya percaya).

Jadi, buat database ipset untuk melakukan pencocokan terhadap ...

ipset create slowips hash:ip,port

Kemudian buat aturan iptables untuk melakukan pertandingan ..

iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12

Ini menginstruksikan kernel bahwa jika Anda mencocokkan IP tujuan dengan port sumber dari set, mengklasifikasikannya ke dalam antrian lambat Anda setup dengan kontrol lalu lintas.

Sekarang, akhirnya setiap kali Anda ingin memperlambat IP, Anda dapat menggunakan perintah ipset untuk menambahkan ip ke set seperti ini:

ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...

Anda dapat mengujinya bekerja menggunakan perintah "tc -s class show dev eth0" dan Anda akan melihat statistik di sana yang menunjukkan paket yang diarahkan ke antrian lambat.

Perhatikan satu-satunya downside nyata untuk ini membuatnya bertahan reboot. Saya tidak berpikir ada skrip init yang tersedia untuk membuat ipset dari dump saat reboot (dan mereka juga harus dibuat sebelum aturan iptables) dan saya yakin tidak ada skrip init untuk mengatur ulang aturan kontrol lalu lintas saat reboot. Jika Anda tidak terganggu, Anda dapat membuat ulang semuanya dari memanggil skrip di rc.local.

Matthew Ife
sumber
3
Yah, aku tidak bisa cukup berterima kasih. Ini sangat deskriptif dan sangat informatif. Saya kemudian menyadari bahwa pengetahuan tentang TC akan diperlukan dan saya sudah mulai mencari tahu tentang ini. Terima kasih lagi!
James
Oh dan untuk kehilangan koneksi. Saya memastikan saya memiliki konfigurasi turun sebelum pindah dari VPS saya ke mesin host. Juga, saya memiliki akses VPN ke jaringan pribadi pada ETH0. Saya hanya akan mengerjakan ETH1 jadi secara teori saya tidak akan punya masalah. Tapi peringatan terdengar!
James
2
Saya tidak bisa memberi tahu Anda berapa kali saya telah membaca tutorial serupa, ini adalah yang pertama yang masuk akal
RC1140
5
Sebagai sidenote, biasanya lebih tepat untuk melakukan pembatasan sumber daya seperti ini dalam kelompok kontrol (sekali lagi, juga mungkin dan juga kurang dimanfaatkan dan dahsyat) karena Anda dapat menentukan batas per aplikasi pada cpu, memori, IO, dan jaringan di toko kebijakan terpusat. ' Tetapi belum melihat pertanyaan seperti itu diajukan untuk menawarkan jawaban.
Matthew Ife
2
Jika Anda tidak menyukai tcsintaksis, Anda bisa mencoba tcng yang menambahkan sedikit bahasa yang lebih ramah pengguna yang menghasilkan tcperintah. Saya telah dulu seperti ini dalam skrip shell: echo '... multi line tcng configuration ...' | tcng | sh.
Mattias Wadman
5

Ini sesederhana mengambil aturan pembatasan tingkat dan menambahkan -ssakelar. The -sswitch bertemu IP yang masuk. Misalnya iptables -A INPUT -s 1.1.1.1, lalu selesaikan dengan metode pembatasan suku bunga pilihan Anda untuk aturan itu.

Wesley
sumber
Terima kasih atas jawaban yang cepat. Sayangnya masalah utama saya adalah paruh kedua itu. Saya telah melihat --limit dan saya belum melihat apa pun yang memungkinkan saya untuk membatasi berdasarkan KB / s - ada arah yang bisa Anda tunjukkan?
James
1
@ James, aku akan kembali padamu, tetapi aku harus keluar ke rumah seorang teman. Baru saja kembali dan saya melihat bahwa MIfe telah melakukan cukup banyak pekerjaan. =)
Wesley