web-dev-qa-db-ja.com

iptablesにDNATのエントリがあるポートにバインドすることは可能ですか?

PREROUTINGを使用してiptablesのポート(たとえば30001)の(ホスト内の)DNATエントリを追加しました

$ Sudo iptables -t nat -A PREROUTING -p tcp --dport 30001 -j DNAT --to-destination <my guest vm ip>:80

注:上記では、ゲストVMへの入力を許可するためにポート転送技術を試しました。

ホストプロセスがポートにバインドすることは可能ですか30001上記のルールを適用した後? Linuxはこれを許可しますか、それともすでに使用されていると言ってブロックしますか?

はい、ポートのバインドはネットワークスタックの一部であり、netfilterとは別です。ここでiptablesはに属します。 netfilterは、この新しいリスニングポートを気にせず、認識せず、ネットワークスタックは、その背後で何か特別なことが行われることを通知されません。後で。

したがって、プロセスをポート30001/tcpにバインドすることは問題ありません。ルールを使用してリモートから到達することはできませんが、ローカルで使用できます。ホストからそれ自体へのローカル(ルーティングされていない)アクセスはチェーン[〜#〜]出力に従います。 [〜#〜]を放出し、ループバックすると、[〜#〜] input [〜#〜]ヒットせずに[〜#〜] prerouting [〜#〜]、つまりnat /この場合、PREROUTINGルールは実行されません。

この 回路図 は、DNAT /ルーティングされたケースでどのように機能するかを理解するのに役立ちます(ルーティングされていないローカルケースは明確に示されていません)。リモートアクセスは次のようになります[〜#〜] prerouting [〜#〜]->ルーティングの決定->[ 〜#〜] input [〜#〜]->ローカルプロセスですが、DNATルールの場合、パス[〜#〜 ] prerouting [〜#〜]->ルーティング決定->[〜#〜] forward [〜#〜]-> ...ローカルプロセスに到達しません。 nat/OUTPUTに同等のルールを追加しない限り、この場合の使用法はあります。いずれの場合も、使用可能かどうかに関係なく、このポートにバインドできます。

2
A.B