네트워크 속도를 제한하지만 제한하기 전에 TCP 연결당 버스트를 허용합니다.

네트워크 속도를 제한하지만 제한하기 전에 TCP 연결당 버스트를 허용합니다.

속도 제한(경찰 정책이라고 함)을 허용하지만 TCP 연결별로 버스트를 허용하는 Cisco 라우터가 있습니다. 예를 들어 대역폭을 50Mbit로 제한할 수 있지만 4MB가 전송될 때까지 제한을 적용하지 않을 수 있습니다. 이는 설정된 모든 TCP 연결에 대해 적용됩니다.

Linux에서 이를 수행할 수 있는 방법이 있습니까? 또한 이 솔루션에 단점이 있습니까? 누군가에게 도움이 된다면 버스트를 설정하는 데 사용되는 Cisco 명령은 정책 맵(적어도 ASA 5505에서는)에서 실행되는 경찰 명령의 세 번째 매개변수입니다.

이것의 목적은 서버가 95/5 버스트를 활용하여 가능한 한 빨리 일반 사용자에게 웹 페이지를 제공하지만 시간의 5% 이상 버스트 가능성을 줄이는 것입니다(예를 들어, 서버 간 전송 수행 또는 웹사이트에서 대용량 파일 다운로드). 내가 아는 한, 이는 장기간 지속되는 DDoS 공격에 대한 솔루션이 아닐 수도 있지만 여러 가지 이유로 문제가 되지는 않습니다.

답변1

iptables이는 Linux에서 및 를 통해 달성할 수 있습니다 tc. MARK특정 바이트 수를 전송한 연결에서 패킷을 갖도록 iptables를 구성할 수 있습니다 . 그런 다음 tc이러한 태그가 지정된 패킷을 대기열 규칙의 클래스에 넣어 대역폭의 속도를 제한할 수 있습니다 .

약간 까다로운 부분은 업로드 및 다운로드 연결을 제한하는 것입니다. tc수신 트래픽 조절은 지원되지 않습니다. 웹 서버에 대한 인터페이스의 송신(웹 서버에 대한 다운로드에 영향을 줌) 및 업스트림 공급자에 대한 인터페이스의 송신(웹 서버의 업로드에 영향을 줌) 질문을 조정하여 이 문제를 해결할 수 있습니다. 업스트림 공급자가 데이터를 전송하는 속도를 제어할 수 없기 때문에 실제로 수신(다운로드) 트래픽을 규제하지 않습니다. 그러나 네트워크 서버에 대한 인터페이스를 조정하면 패킷이 삭제되고 업로더는 대역폭 제한을 수용하기 위해 TCP 창을 축소하게 됩니다.

예: (웹 서버 연결 인터페이스가 있고 eth0업스트림이 있는 Linux 기반 라우터에 있다고 가정 eth1)

# mark the packets for connections over 4MB being forwarded out eth1
# (uploads from webserver)
iptables -t mangle -A FORWARD -p tcp -o eth1 -m connbytes --connbytes 4194304: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 50

# mark the packets for connections over 4MB being forwarded out eth0
# (downloads to webserver)
iptables -t mangle -A FORWARD -p tcp -o eth0 -m connbytes --connbytes 4194304: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 50

# Setup queuing discipline for server-download traffic
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:50 htb rate 50mbit

# Setup queuing discipline for server-upload traffic
tc qdisc add dev eth1 root handle 1: htb
tc class add dev eth1 parent 1: classid 1:50 htb rate 50mbit

# set the tc filters to catch the marked packets and direct them appropriately
tc filter add dev eth0 parent 1:0 protocol ip handle 50 fw flowid 1:50
tc filter add dev eth1 parent 1:0 protocol ip handle 50 fw flowid 1:50

Linux 라우터 대신 웹 서버 자체에서 이 작업을 수행하려는 경우에도 위의 업로드 부분을 사용할 수 있습니다. 한 가지 주목할만한 변화는 을(를) 대체한다는 것입니다 FOWARD. OUTPUT다운로드하려면 "중간 기능 블록" 장치를 사용하거나 대기열 규칙을 설정해야 합니다 ifb. 간단히 말해서, 수신 트래픽을 송신 트래픽으로 처리하고 사용할 수 있도록 가상 인터페이스를 사용합니다 tc. 설정 방법에 대한 자세한 내용은 ifb여기에서 확인할 수 있습니다.https://serverfault.com/questions/350023/tc-ingress-policing-and-ifb-mirroring

이러한 유형의 콘텐츠는 규모를 조정하기 위해 많은 조정이 필요한 경우가 많습니다. 긴급한 문제는 많은 수의 연결이 있는 확장 벽에 부딪히는 경향이 있는 모듈 connbytes에 대한 의존성 입니다. conntrack고부하 테스트를 권장합니다.

주목해야 할 또 다른 점은 이것이 상태 비저장(stateless)이기 때문에 UDP에서는 전혀 작동하지 않는다는 것입니다. 이 문제를 해결하는 다른 기술이 있지만 귀하의 요구 사항은 TCP에만 해당되는 것 같습니다.

또한 위의 모든 작업을 실행 취소하려면 다음을 수행하십시오.

# Flush the mangle FORWARD chain (don't run this if you have other stuff in there)
iptables -t mangle -F FORWARD

# Delete the queuing disciplines
tc qdisc del dev eth0 root
tc qdisc del dev eth1 root

관련 정보