マイコンピュータには約20個のローカルPSで動作するVPSがあり、このVPSでiptablesを使用して次の特定のポートをリダイレクトします。
iptables -t nat -A PREROUTING -p tcp -d %hostIP% --dport %real_port% -i eth0 -j DNAT --to-destination %vps_local_ip%":%vps_destination_port%
更新(新しいvpsを作成または削除)するには、2000個のiptablesコマンドを実行する必要があります。まず、すべてのルールを削除してから再挿入する必要があります。場合によっては、iptablesはすばやく処理できず、間隔を追加することは重要ではないため、いくつかのコマンドをスキップすることがあります。オプションを選択してください。なぜなら、このコマンドをすばやく完了する必要があるからです。
この問題に対するより良い解決策はありますか?
ベストアンサー1
VPSが変更された場合、すべてのルールをリセットする理由はありません。 VPSあたり2000個の命令を意味しない限り、この場合には何か間違っていると仮定します。
通常、私は各VPSに2つのチェーン、つまり1つはアクティブであり、もう1つは非アクティブであることをお勧めします。 2つのコマンド間で実際に待たなければならない場合は、iptables
非アクティブチェーンを構成するときにそうします。これが完了したら、メインチェーンの参照をアクティブチェーンから非アクティブチェーン(おそらくPREROUTING
)に変更できます。
iptables
どのVPSがターゲットであるかを確認するために多くのコマンドを使用している場合は、それを使用して単一のipset
コマンドでこれを実行できます。
はい
すべてのアクティブチェーンとすべての非アクティブチェーンに対して2つのチェーンを作成します。これにより、競合条件なしで変更を行うことができます。
iptables -t nat -I PREROUTING 1 -j chaingroup_a
iptables -t nat -A chaingroup_a -j vps_1a
iptables -t nat -A chaingroup_a -j vps_2a
iptables -t nat -A chaingroup_a -j vps_3a
iptables -t nat -A chaingroup_a -j ACCEPT # stop applying rules
iptables -t nat -A vps_1a -d 1.2.3.4 -p tcp --dport 42 -j DNAT --to-destination 10.1.2.3:4242
設定を変更するには、非アクティブチェーンをリセットして設定します。
iptables -t nat -F chaingroup_b
iptables -t nat -F vps_1b
iptables -t nat -F vps_2b
iptables -t nat -F vps_3b
iptables -t nat -A chaingroup_b -j vps_1b
iptables -t nat -A chaingroup_b -j vps_2b
iptables -t nat -A chaingroup_b -j vps_3b
iptables -t nat -A chaingroup_b -j ACCEPT # stop applying rules
iptables -t nat -A vps_1a -d 1.2.3.4 -p tcp --dport 4321 -j DNAT --to-destination 10.1.2.3:12345
準備が完了したら、非アクティブチェーングループをアクティブチェーングループに設定します。
iptables -t nat -I PREROUTING 1 -j chaingroup_b
-j ACCEPT
シャットダウンのためにchaingroup_b
まだ存在するコンテンツchaingroup_a
は無視されます。ただしPREROUTING
、変更するたびに成長を防ぐには、とにかく削除する必要があります。
iptables -t nat -D PREROUTING 2