iptablesとマルチnatリダイレクト

iptablesとマルチnatリダイレクト

マイコンピュータには約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

答え2

実際、iptablesはこれを十分に迅速に実行でき、ほぼ1900のルールをテストしました。必要なのは、リストファイルでip:portsを追跡し、以下に示すbashスクリプトなどのスクリプトを作成し、そのファイルからip:portを再ロードすることです。

ファイルの各行はrealport:vps-ip:portと同じであるとします。

#/bin/bash
HOST=100.200.100.200 # your public address
LIST=/path/to/file

iptables -t nat -F
cat "$LIST" | while read line
do
realport=`echo $line|cut -f1 -d:`
vpsip=`echo $line|cut -f2 -d:`
port=`echo $line|cut -f3 -d:`
iptables -t nat -A PREROUTING -p tcp -d $HOST --dport $realport -i eth0 -j DNAT --to-destination $vpsip:$port
done

iptables save

これにより、リストのみを処理できます。 realport:vps-ip:port の代わりにコンマ区切りなどの他の形式を使用することもできます。次に、-d:を-dまたは他のものに変更します。

関連情報