Linux에서 IP로 트래픽 조절을 수행하려면 어떻게해야합니까?


15

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

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

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

답변:


17

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

귀하가 할 수있는 일은 연결된 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

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


음 .. 목록에없는 것들에 대한 기본 대역폭 제한을 추가하는 방법?
Kokizzu

prio 정의로 $ mark를 사용했습니다. 모두에게 동일한 우선 순위를 사용하는 것이 더 좋지 않습니까?
motobói

"iptables -t mangle -A INPUT"을 "iptables -t mangle -A OUTPUT"으로 변경하면 서버에서 특정 IP 로의 속도를 제어 할 수 있습니까?
Frank Barcenas 1

이 후 설정을 어떻게 복원합니까?
Stefan Rogin

캔 트는 단일 IP에 대해 루프없이 수동으로 명령을 작성 하여이 작업을 수행하는 것처럼 보입니다.
Adones Pitogo

5

이와 같은 것이 계약자의 웹 캠을 제한된 양의 대역폭으로 제한하는 데 효과적이었습니다. 자세한 내용 은 매뉴얼 페이지에서 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

3
CBQ는 약간
버려졌습니다.

1
그것만이 스크립트에서 사용하는 경우 수출 DEV 할 필요가 없습니다 ....
버그 서재 거트 반

1

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.