IPTABLES-특정 들어오는 IP의 제한 속도


103

특정 서비스의 요금을 제한하고 싶지 않습니다. 내 목표는 들어오는 IP 주소만을 기준으로 요금을 제한하는 것입니다. 예를 들어 의사 규칙을 사용하는 경우 :

john.domain.local (192.168.1.100) can only download from our httpd/ftp servers at "10KB/s" (instead of 1MB/s)

들어오는 IP 주소를 기반으로 IPTables를 사용하여 제한을 어떻게 평가할 수 있습니까?

답변:


165

이러한 결정을하기 위해 많은 양의 패킷을 분석해야하는 이러한 종류의 작업에는 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에서 스크립트를 호출하여 모든 것을 다시 만들 수 있습니다.


3
글쎄, 나는 충분히 감사하지 않습니다. 이것은 매우 설명적이고 매우 유익합니다. 나중에 TC에 대한 지식이 필요하다는 것을 깨달았으며 그 이후로이를 조사하기 시작했습니다. 다시 감사합니다!
James

아 그리고 연결이 끊어졌습니다. VPS에서 호스트 시스템으로 이동하기 전에 구성이 다운되어 있는지 확인하고 있습니다. 또한 ETH0의 개인 네트워크에 대한 VPN 액세스 권한이 있습니다. 나는 ETH1에서만 작업하므로 이론 상으로는 문제가 없습니다. 그러나 경고가 들렸다!
James

2
비슷한 튜토리얼을 몇 번이나 읽었는지 말할 수 없습니다. 이것이 처음으로 이해되는 것입니다
RC1140

5
참고로 중앙 집중식 '정책 저장소'에서 CPU, 메모리, IO 및 네트워크에 대한 애플리케이션 별 제한을 정의 할 수 있으므로 일반적으로 제어 그룹에서 이와 같이 리소스 제한을 수행하는 것이 더 적합합니다 '. 그러나 그러한 질문에 대한 답을 제시하기 위해 아직 제기 된 것은 아직 없습니다.
Matthew Ife

2
tc구문이 마음에 들지 않으면 tcngtc명령 을 생성하는 좀 더 사용자 친화적 인 언어를 추가해보십시오 . 쉘 스크립트에서 이것을 좋아했습니다 echo '... multi line tcng configuration ...' | tcng | sh.
Mattias Wadman 15:08에

5

속도 제한 규칙을 적용하고 -s스위치를 추가하는 것만 큼 간단 합니다. -s스위치는 들어오는 IP를 일치합니다. 예를 들어 iptables -A INPUT -s 1.1.1.1해당 규칙에 대해 선호하는 속도 제한 방법으로 마무리합니다.


신속한 답변 감사합니다. 불행히도 내 주요 문제는 후반입니다. 나는 --limit를 살펴 보았고 KB / s를 기반으로 제한 할 수있는 것을 보지 못했습니다.
James

1
@James 나는 당신에게 돌아 왔을 것이지만 친구의 집으로 나갔습니다. 방금 돌아와서 MIfe가 상당한 일을했다고 볼 수 있습니다. =)
웨슬리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.