Pertanyaan IPTABLES - Batas tingkat IP masuk tertentu


Saya tidak ingin membatasi tarif layanan tertentu. Tujuan saya adalah membatasi tarif hanya berdasarkan alamat IP yang masuk. Misalnya menggunakan pseudo-rule:

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 IPTables berdasarkan alamat IP yang masuk?


101
2018-04-28 21:09






Jawaban:


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

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

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

Keindahan ini adalah Anda dapat membuat situasi di mana Anda mengizinkan banyak lalu lintas keluar untuk pengguna yang lambat kecuali kelas yang menindih menginginkan bandwidth, tetapi contoh ini tidak melakukan hal ini (akan selalu menyediakan 10kbps 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 harus 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 memberitahu kernel apa yang harus dilakukan dengan traffic yang tidak diklasifikasikan.

Setelah ini selesai, Anda dapat mengatur aturan iptables untuk mengklasifikasikan paket yang sesuai dengan kriteria tertentu. Jika Anda berencana menempatkan banyak dan banyak orang ke dalam aturan yang 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 pencocokan ..

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, klasifikasikan ke dalam antrean lambat yang Anda atur 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 dengan menggunakan perintah "tc -s class show dev eth0" dan Anda akan melihat statistik di sana yang menunjukkan paket sedang dialihkan ke antrean lambat.

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


165
2018-04-28 23:35



Yah, aku tidak bisa cukup berterima kasih. Ini sangat deskriptif dan sangat informatif. Saya kemudian menyadari bahwa pengetahuan tentang TC akan diperlukan dan sejak itu saya mulai mencermati hal ini. Terima kasih lagi! - James
Oh dan untuk kehilangan koneksi. Saya memastikan konfigurasi saya telah turun sebelum pindah dari VPS ke mesin host. Juga, saya memiliki akses VPN ke jaringan pribadi di ETH0. Saya hanya akan bekerja pada ETH1 sehingga dalam teori saya tidak akan punya masalah. Tetapi peringatan terdengar! - James
Saya tidak bisa memberitahu Anda berapa kali saya telah membaca tutorial serupa, ini adalah yang pertama yang masuk akal - RC1140
Sebagai sidenote, biasanya lebih tepat untuk melakukan pembatasan sumber daya seperti ini dalam kelompok kontrol (sekali lagi, juga mungkin dan juga kurang dimanfaatkan dan mengagumkan) karena Anda dapat menentukan batas per-aplikasi pada cpu, memori, IO dan jaringan di 'toko kebijakan terpusat '. Tetapi belum pernah melihat pertanyaan seperti itu yang diajukan untuk menawarkan jawaban. - Matthew Ife
Jika Anda tidak suka tc sintaks yang bisa Anda berikan tcng coba yang menambahkan sedikit bahasa yang lebih ramah pengguna yang dihasilkan tc perintah. Saya telah terbiasa menyukai ini dalam skrip shell: echo '... multi line tcng configuration ...' | tcng | sh. - Mattias Wadman


Ini sesederhana mengambil aturan pembatasan tingkat dan menambahkan -s beralih. Itu -s beralih cocok dengan IP yang masuk. Sebagai contoh iptables -A INPUT -s 1.1.1.1 dan kemudian diakhiri dengan metode pembatasan laju pilihan Anda untuk aturan itu.


5
2018-04-28 21:12



Terima kasih atas jawaban cepat Anda. Sayangnya masalah utama saya adalah paruh kedua itu. Saya telah melihat --limit dan saya belum melihat apa pun yang memungkinkan saya membatasi berdasarkan KB / s - setiap arah yang dapat Anda tunjukkan kepada saya? - James
@James Saya akan menghubungi Anda, tetapi saya harus pergi ke rumah seorang teman. Baru saja kembali dan saya melihat bahwa MIfe telah melakukan pekerjaan yang cukup baik. =) - Wesley