문맥
간단히 말해서, 저는 컨테이너 네트워킹 솔루션의 컨테이너에 대한 대상 호스트당 아웃바운드 연결 횟수 속도와 하드 제한을 제공하는 기능을 개발 중입니다(참조:실크 탈형). vxlan
각 컨테이너에 전용 개인 IP가 있는 오버레이 네트워크를 만듭니다.
우리는 사용하고 있습니다CNIiptables
새 컨테이너가 생성될 때마다 규칙 및 체인을 포함한 네트워크 아티팩트를 배치하고 구성하는 트리거 역할을 합니다.
질문
VM에서 컨테이너가 시작될 때마다 다음을 iptables
통해 아웃바운드 트래픽에 대한 규칙을 구성합니다.
iptables -N netout--container-id
# where the container ip from the overlay network is "1.2.3.4/32"
iptables -A FORWARD -s 1.2.3.4/32 -o underlay-interface -j netout--container-id
iptables -A netout--container-id -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A netout--container-id -p tcp -m state --state INVALID -j DROP
# hard limit rule allowing a maximum of 1000 concurrent connections per dest ip
iptables -A netout--container-id -m conntrack --ctstate NEW -m connlimit --connlimit-above 1000 --connlimit-mask 32 --connlimit-daddr -j REJECT
# rate limit rule allowing 100 new connections per sec with a burst of 999 per dest ip
iptables -A netout--container-id -m conntrack --ctstate NEW -m hashlimit --hashlimit-above 100/sec --hashlimit-burst 999 --hashlimit-mode dstip --hashlimit-name container-id --hashlimit-htable-expire 10000 -j REJECT
# A bunch of accept rules...
# And finally a reject all rule
iptables -A netout--container-id -j REJECT --reject-with icmp-port-unreachable
이것은 아주 잘 작동합니다! 조절 규칙이 올바르게 적용되었습니다. 우리는 다음을 ssh
사용하여 단일 호스트에 대해 너무 많은 연결을 연 컨테이너를 실행하여 이를 테스트했습니다.
# monitors the number of open connections to the destip
watch -n 1 'netstat -anp tcp | grep ESTABLISHED | grep -v <dest-port> | grep <proc-name> | wc -l'
이 문제는 새 컨테이너가 생성될 때마다 발생합니다. 그런 다음 iptables
새 규칙을 추가하면 netfilter(제 기억이 맞다면)가 다시 시작되고 connlimit
열려 있는 모든 연결을 추적하지 못하게 됩니다.
따라서 위 코드 조각의 예(최대 1000개 연결)를 가정하면 새 컨테이너를 시작할 때(예: 새 규칙 추가) 컨테이너가 이미 하드 제한에 도달한 경우 제한이 재설정되고 또 다른 1000개의 연결을 열 수 있습니다. , 다음 컨테이너가 시작될 때까지 계속됩니다.
이 모듈은 항목을 파일에 유지 hashlimit
하므로 문제가 없습니다 ./proc/net/ipt_hashlimit/<container-id>
.connlimit
iptables
hashlimit
이 모듈을 사용하려고 하는데 recent
어떤 방법도 모르겠어요.
이 질문은 다음과 유사합니다.하나connlimit
그러나 다른 사용 사례에서는 현재 열려 있는 연결을 추적하지 않고(또는 다른 모듈에서) 규칙을 동적으로 수정할 수 있어야 하기 때문입니다 .
귀하의 지원에 미리 감사드립니다.
추신 - 더 많은 아키텍처 세부 사항이 필요하면 쉽게 제공할 수 있지만 질문의 RC는 위에서 언급한 내용이라고 생각합니다.