투명한 프록시 설정이 있습니다. 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과 같은 것이 좋습니다.