Làm cách nào để tạo hình lưu lượng truy cập trong Linux bằng IP?


15

Chúng tôi có một thiết lập proxy minh bạch. Tôi đã cố gắng tìm kiếm hình dạng lưu lượng truy cập trong Linux và tất cả những gì tôi có thể tìm thấy trực tuyến là giới hạn lưu lượng truy cập theo giao diện (eth0 / eth1 ...).

Tôi cần giới hạn băng thông (không bao giờ vượt quá giới hạn cụ thể) theo địa chỉ IP hoặc dải IP và tôi không thể tìm ra cách để làm điều đó.

Có cách nào để làm điều đó?

Câu trả lời:


17

Về cơ bản, lớp định hình lưu lượng của kernel là một bộ lập lịch gói được gắn vào card mạng của bạn. Vì vậy, một chính sách định hình lưu lượng áp dụng cho một card mạng.

Trong trường hợp của bạn, những gì bạn có thể làm là tạo một danh sách IP và băng thông được đính kèm, và sau đó, với mỗi IP, bạn tạo:

  • Một quy tắc định hình lưu lượng được xác định bởi một classid
  • Một quy tắc bộ lọc mạng sẽ đánh dấu các gói đến một giá trị đánh dấu cụ thể
  • Một Bộ lọc sẽ liên kết các gói tin đó với classid, do đó áp dụng quy tắc kiểm soát lưu lượng cho các gói được chỉ định.

Ví dụ được đưa ra bởi @Zoredache hoạt động, nhưng cá nhân tôi thích sử dụng khả năng Netfilter thay vì TC để lọc các gói và HTB thay vì CBQ cho thuật toán chuyển đổi. Vì vậy, bạn có thể thử một cái gì đó như thế này (yêu cầu Bash 4 cho mảng kết hợp):

#! /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

- chỉnh sửa: quên lớp mặc định và để truyền dấu ở cuối tập lệnh.


umm .. làm thế nào để thêm giới hạn băng thông mặc định cho những người không có trong danh sách?
Kokizzu

Bạn đã sử dụng $ mark như định nghĩa tiên nghiệm. Sẽ không tốt hơn để sử dụng cùng một ưu tiên cho tất cả?
motobói

nếu tôi thay đổi "iptables -t mangle -A INPUT" thành "iptables -t mangle -A OUTPUT" tôi có thể kiểm soát tốc độ từ máy chủ của mình sang một IP cụ thể không ??
Frank Barcenas

Làm thế nào để tôi khôi phục cài đặt sau này?
Stefan Rogin

Cant 'dường như làm cho công việc này, viết các lệnh thủ công mà không cần vòng lặp cho một ip.
Adones Pitogo

5

Một cái gì đó như thế này đã làm việc cho tôi để giới hạn web cam của nhà thầu ở một lượng băng thông hạn chế. Kiểm tra trang người đàn ông cho tc để biết chi tiết.

#!/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

3
CBQ hơi bị bỏ rơi ... bạn sẽ thấy HTB dễ sử dụng hơn và có được kết quả tương tự
Julien Vehent

1
Không cần xuất DEV nếu nó chỉ được sử dụng trong tập lệnh này ....
Gert van den Berg

1

Tôi không chắc tôi hiểu chính xác câu hỏi của bạn.

Proxy trong suốt (như trong Squid cho HTTP) được sử dụng để kiểm soát hầu hết dữ liệu đến. Trong khi định hình lưu lượng được sử dụng để kiểm soát dữ liệu đi.

Bạn cần cung cấp thêm chi tiết. Nếu bạn có nhiều máy trạm đằng sau proxy HTTP và đang cố gắng hạn chế tốc độ tải xuống của chúng, tốt hơn hết bạn nên sử dụng thứ gì đó như nhóm chậm trễ Squid +.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.