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に同等のルールを追加しない限り、この場合の使用法はあります。いずれの場合も、使用可能かどうかに関係なく、このポートにバインドできます。