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ただし、他のユースケースでは、現在開いている接続を追跡せずに(または他のモジュールで)ルールを動的に変更できる必要があるためです。

ご支援ありがとうございます。

PS - より多くのアーキテクチャの詳細が必要な場合は簡単に提供できますが、質問のRCは上記の内容だと思います。

関連情報