Bagaimana saya bisa melakukan traffic shaping di Linux oleh IP?

15

Kami memiliki pengaturan proxy transparan. Saya mencoba mencari traffic shaping di Linux, dan yang bisa saya temukan online adalah membatasi traffic dengan antarmuka (eth0 / eth1 ...).

Saya perlu membatasi bandwidth (tidak pernah melebihi batas tertentu) dengan alamat IP atau rentang IP dan saya tidak dapat menemukan cara untuk melakukan itu.

Apakah ada cara untuk melakukan itu?

Osama ALASSIRY
sumber

Jawaban:

17

Lapisan pembentuk lalu lintas dari kernel pada dasarnya adalah penjadwal paket yang dilampirkan ke kartu jaringan Anda. Jadi satu kebijakan pembentukan traffic berlaku untuk satu kartu jaringan.

Apa yang dapat Anda lakukan, dalam kasus Anda, adalah membuat daftar IP dan bandwidth yang terpasang, dan kemudian, untuk setiap IP, Anda membuat:

  • Satu aturan pembentukan lalu lintas diidentifikasi oleh classid
  • Satu aturan netfilter yang akan menandai paket ke nilai tanda tertentu
  • Satu Filter yang akan mengikat tanda paket ke classid, sehingga menerapkan aturan kontrol lalu lintas ke paket yang ditentukan.

Contoh yang diberikan oleh @Zoredache berfungsi, tapi saya pribadi lebih suka menggunakan kemampuan Netfilter daripada TC untuk menyaring paket, dan HTB daripada CBQ untuk algoritma shapping. Jadi Anda dapat mencoba sesuatu seperti ini (membutuhkan Bash 4 untuk array asosiatif):

#! /bin/bash
NETCARD=eth0
MAXBANDWIDTH=100000

# reinit
tc qdisc del dev $NETCARD root handle 1
tc qdisc add dev $NETCARD root handle 1: htb default 9999

# create the default class
tc class add dev $NETCARD parent 1:0 classid 1:9999 htb rate $(( $MAXBANDWIDTH ))kbit ceil $(( $MAXBANDWIDTH ))kbit burst 5k prio 9999

# control bandwidth per IP
declare -A ipctrl
# define list of IP and bandwidth (in kilo bits per seconds) below
ipctrl[192.168.1.1]="256"
ipctrl[192.168.1.2]="128"
ipctrl[192.168.1.3]="512"
ipctrl[192.168.1.4]="32"

mark=0
for ip in "${!ipctrl[@]}"
do
    mark=$(( mark + 1 ))
    bandwidth=${ipctrl[$ip]}

    # traffic shaping rule
    tc class add dev $NETCARD parent 1:0 classid 1:$mark htb rate $(( $bandwidth ))kbit ceil $(( $bandwidth ))kbit burst 5k prio $mark

    # netfilter packet marking rule
    iptables -t mangle -A INPUT -i $NETCARD -s $ip -j CONNMARK --set-mark $mark

    # filter that bind the two
    tc filter add dev $NETCARD parent 1:0 protocol ip prio $mark handle $mark fw flowid 1:$mark

    echo "IP $ip is attached to mark $mark and limited to $bandwidth kbps"
done

#propagate netfilter marks on connections
iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark

- edit: lupa kelas default dan untuk menyebarkan tanda di akhir skrip.

Julien Vehent
sumber
umm .. bagaimana cara menambahkan batas bandwidth default untuk mereka yang tidak ada dalam daftar?
Kokizzu
Anda menggunakan $ mark sebagai definisi prio. Bukankah lebih baik menggunakan prioritas yang sama untuk semua?
motobói
jika saya mengubah "iptables -t mangle -A INPUT" menjadi "iptables -t mangle -A OUTPUT" dapatkah saya mengontrol laju dari server saya ke IP tertentu ??
Frank Barcenas
bagaimana cara mengembalikan pengaturan setelah ini?
Stefan Rogin
Sepertinya tidak bisa membuat ini berfungsi, menulis perintah secara manual tanpa loop untuk satu ip.
Adones Pitogo
5

Sesuatu seperti ini berhasil bagi saya untuk membatasi cam web kontraktor dengan jumlah bandwidth terbatas. Lihat halaman manual untuk tc untuk detailnya.

#!/bin/bash
set -x

DEV=eth0
export DEV

tc qdisc del dev $DEV root
tc qdisc del dev $DEV root
tc qdisc add dev $DEV root handle 1: cbq avpkt 1000 bandwidth 100mbit

# setup a class to limit to 1500 kilobits/s
tc class add dev $DEV parent 1: classid 1:1 cbq rate 1500kbit \
   allot 1500 prio 5 bounded isolated

# add traffic from 10.2.1.37 to that class
tc filter add dev $DEV parent 1: protocol ip prio 16 u32 \
   match ip src 10.2.1.37 flowid 1:1
Sakit kepala
sumber
3
CBQ sedikit terbengkalai ... Anda akan menemukan HTB lebih mudah untuk digunakan dan mendapatkan hasil yang sama
Julien Vehent
1
Tidak perlu mengekspor DEV jika hanya digunakan dalam skrip ini ....
Gert van den Berg
1

Saya tidak yakin saya mengerti pertanyaan Anda dengan benar.

Proxy transparan (seperti dalam Squid untuk HTTP) digunakan untuk mengontrol sebagian besar data yang masuk. Sementara traffic shaping digunakan untuk mengontrol data keluar.

Anda perlu memberikan rincian lebih lanjut. Jika Anda memiliki banyak workstation di belakang proksi HTTP dan mencoba membatasi kecepatan unduhannya, Anda sebaiknya menggunakan sesuatu seperti kolam penundaan Squid +.

halp
sumber