태그 보관물: traffic-shaping

traffic-shaping

Linux에서 IP로 트래픽 조절을 수행하려면 어떻게해야합니까? (eth0 / eth1 …)로 트래픽을 제한하는 것입니다. IP

투명한 프록시 설정이 있습니다. Linux에서 트래픽 쉐이핑을 찾으려고 시도했으며 온라인에서 찾을 수있는 모든 것은 인터페이스 (eth0 / eth1 …)로 트래픽을 제한하는 것입니다.

IP 주소 또는 IP 범위로 대역폭을 제한하지 않아야하며 (특정 제한을 초과하지 않아야 함) 그렇게 할 수있는 방법을 찾을 수 없습니다.

그렇게 할 방법이 있습니까?



답변

커널의 트래픽 형성 계층은 기본적으로 네트워크 카드에 연결된 패킷 스케줄러입니다. 따라서 하나의 트래픽 조절 정책이 하나의 네트워크 카드에 적용됩니다.

귀하가 할 수있는 일은 연결된 IP 및 대역폭 목록을 생성 한 다음 각 IP에 대해 다음을 생성하는 것입니다.

  • classid로 식별 된 하나의 트래픽 조절 규칙
  • 패킷을 특정 마크 값으로 표시하는 하나의 넷 필터 규칙
  • 해당 패킷 표시를 classid에 바인딩하는 하나의 필터는 트래픽 제어 규칙을 지정된 패킷에 적용합니다.

@Zoredache가 제공 한 예는 효과가 있지만 개인적으로 TC 대신 Netfilter 기능을 사용하여 패킷을 필터링하고 CBQ 대신 HTB를 사용하여 shapping 알고리즘을 선호합니다. 따라서 다음과 같이 시도 할 수 있습니다 (연관 배열에는 Bash 4가 필요합니다).

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

-편집 : 기본 클래스를 잊고 스크립트 끝에 표시를 전파합니다.


답변

이와 같은 것이 계약자의 웹 캠을 제한된 양의 대역폭으로 제한하는 데 효과적이었습니다. 자세한 내용 은 매뉴얼 페이지에서 tc 를 확인하십시오.

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


답변

귀하의 질문을 올바르게 이해하고 있는지 잘 모르겠습니다.

투명한 프록시 (Squid for HTTP)는 대부분 들어오는 데이터를 제어하는 ​​데 사용됩니다. 트래픽 쉐이핑은 발신 데이터를 제어하는 ​​데 사용됩니다.

자세한 내용을 제공해야합니다. HTTP 프록시 뒤에 많은 워크 스테이션이 있고 다운로드 속도를 제한하려는 경우 Squid + delay pool과 같은 것이 좋습니다.


답변