![네트워크 속도를 제한하지만 제한하기 전에 TCP 연결당 버스트를 허용합니다.](https://linux55.com/image/72894/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%20%EC%86%8D%EB%8F%84%EB%A5%BC%20%EC%A0%9C%ED%95%9C%ED%95%98%EC%A7%80%EB%A7%8C%20%EC%A0%9C%ED%95%9C%ED%95%98%EA%B8%B0%20%EC%A0%84%EC%97%90%20TCP%20%EC%97%B0%EA%B2%B0%EB%8B%B9%20%EB%B2%84%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%ED%97%88%EC%9A%A9%ED%95%A9%EB%8B%88%EB%8B%A4..png)
속도 제한(경찰 정책이라고 함)을 허용하지만 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