iptables 규칙이 추가될 때마다 iptables connlimit 카운터가 재설정되는 것을 방지하는 방법은 무엇입니까?

iptables 규칙이 추가될 때마다 iptables connlimit 카운터가 재설정되는 것을 방지하는 방법은 무엇입니까?

문맥

간단히 말해서, 저는 컨테이너 네트워킹 솔루션의 컨테이너에 대한 대상 호스트당 아웃바운드 연결 횟수 속도와 하드 제한을 제공하는 기능을 개발 중입니다(참조:실크 탈형). 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>.connlimitiptableshashlimit이 모듈을 사용하려고 하는데 recent어떤 방법도 모르겠어요.

이 질문은 다음과 유사합니다.하나connlimit그러나 다른 사용 사례에서는 현재 열려 있는 연결을 추적하지 않고(또는 다른 모듈에서) 규칙을 동적으로 수정할 수 있어야 하기 때문입니다 .

귀하의 지원에 미리 감사드립니다.

추신 - 더 많은 아키텍처 세부 사항이 필요하면 쉽게 제공할 수 있지만 질문의 RC는 위에서 언급한 내용이라고 생각합니다.

관련 정보