답변:
이러한 결정을하기 위해 많은 양의 패킷을 분석해야하는 이러한 종류의 작업에는 IPTable이 만들어지지 않습니다. IPTables는 부분적으로 답입니다!
이에 대한 진정한 대답은 Linux에서 훌륭하고 잘 사용되지 않는 트래픽 제어 기능입니다. 무슨 일이 일어나고 있는지 알지 못하고이 문제를 해결하면 네트워크 연결이 끊어 질 수 있습니다! 경고를 받았습니다!
eth0이 발신 장치라고 가정하면 기본적으로 '빠른'대기열을 통해 대부분의 트래픽을 출력하고 특정 사람들의 목록을 '느린'대기열에 넣는 클래스 기반 트래픽 제어 대기열을 만들어야합니다.
이것의 장점은 재정의하는 클래스가 대역폭을 원하지 않는 한 느린 사용자에게 많은 아웃 바운드 트래픽을 허용하는 상황을 만들 수 있지만이 예제는 그렇지 않습니다 (항상 느린 사용자에게 10kbps를 제공함). 큐잉 시스템은 다음과 같습니다.
Inbound traffic
+
|
|
v
+------------------+
| Class 1:1 |
|------------------|
| Root (all flows)|
| 100mbit |
+-----+-----+------+
| |
| |
| |
| |
| |
+----------+ | | +----------+
| 1:11 +-----+ +-----+ 1:12 |
|----------| |----------|
| Default | | Slow |
|100mb-80kb| | 80kb |
+----------+ +----------+
이렇게하려면 먼저 커널에서 큐잉 규칙을 설정해야합니다. 다음은이 작업을 수행합니다. 이 작업을 하나의 전체 스크립트로 실행해야합니다 .
#!/bin/bash
tc qdisc add dev eth0 parent root handle 1: hfsc default 11
tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 100mbit ul rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:11 hfsc sc rate 99920kbit ul rate 100000kbit
tc class add dev eth0 parent 1:1 classid 1:12 hfsc sc rate 80kbit ul rate 80kbit
tc qdisc add dev eth0 parent 1:11 handle 11:1 pfifo
tc qdisc add dev eth0 parent 1:12 handle 12:1 pfifo
"기본 11"은 분류되지 않은 트래픽으로 수행 할 작업을 커널에 알려주기 때문에 중요합니다.
이 작업이 완료되면 iptables 규칙을 설정하여 특정 기준과 일치하는 패킷을 분류 할 수 있습니다. 많은 사람들을이 느린 규칙에 넣을 계획이라면 ipset 규칙이 더 적절합니다 (rhel6에서 사용 가능해야합니다).
따라서 ipset 데이터베이스를 만들어 일치하는 것을 수행하십시오 ...
ipset create slowips hash:ip,port
그런 다음 일치하는 iptables 규칙을 작성하십시오.
iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12
이렇게하면 대상 IP를 세트의 소스 포트와 일치시키는 경우 트래픽 제어로 설정 한 느린 대기열로 분류합니다.
이제 IP 속도를 늦출 때마다 ipset 명령을 사용하여 ip를 다음과 같이 세트에 추가 할 수 있습니다.
ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...
"tc -s class show dev eth0"명령을 사용하여 작동하는지 테스트 할 수 있으며, 패킷이 느린 대기열로 리디렉션되고 있음을 나타내는 통계가 표시됩니다.
이것의 유일한 단점은 재부팅 후에도 살아남는 것입니다. 재부팅시 덤프에서 ipsets를 생성하는 데 사용할 수있는 init 스크립트가 없다고 생각합니다 (그리고 iptables 규칙 전에 작성해야합니다 ). 재부팅시 트래픽 제어 규칙을 다시 설정하는 init 스크립트가 없다고 확신합니다. 귀찮게하지 않으면 rc.local에서 스크립트를 호출하여 모든 것을 다시 만들 수 있습니다.
tc
구문이 마음에 들지 않으면 tcng 에 tc
명령 을 생성하는 좀 더 사용자 친화적 인 언어를 추가해보십시오 . 쉘 스크립트에서 이것을 좋아했습니다 echo '... multi line tcng configuration ...' | tcng | sh
.
속도 제한 규칙을 적용하고 -s
스위치를 추가하는 것만 큼 간단 합니다. -s
스위치는 들어오는 IP를 일치합니다. 예를 들어 iptables -A INPUT -s 1.1.1.1
해당 규칙에 대해 선호하는 속도 제한 방법으로 마무리합니다.