IPTablesポートリダイレクトはApacheを中断する必要がありますが、そうではありません。

IPTablesポートリダイレクトはApacheを中断する必要がありますが、そうではありません。

Apacheでロードバランシングを設定しましたhttpd

<VirtualHost *:80>
        DocumentRoot /var/www/html
        ServerName xxx.xxx.xxx.com
        ProxyRequests           Off
        ProxyPreserveHost       On
        ProxyPass / http://xxx.xxx.xxx.xxx:8080/
        ProxyPassReverse / http://xxx.xxx.xxx.xxx:8080/
</VirtualHost>

:8080tomcat同じホストで実行されているApacheアプリケーションサーバー。私が働いているところではログ保存要件があるので、すべてをApacheに変更すると、分析するhttpdのにかなり良いと思いました。

エンドユーザーが持つ可能性のあるリンクやブックマークを損なうことなく、すべての公開要求がポート80を通過するようにします。すべてがポート80を介してアプリケーションに入っているように見えるように、いくつかのポート変換を実行してこれを行います。上記のロードバランシングを考慮せずに、テーブルに次のルールを追加しましたnat

-A PREROUTING -i eth0 -p tcp -m tcp --dport 8080 -j REDIRECT --to-ports 80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 8081 -j REDIRECT --to-ports 80

問題は、またはhttpdを介してアプリに直接アクセスできることです:8080。各ルールのパケット数も増加するので、明らかに一致します。

私の質問はこれです:これが無限ループを生成しないのはなぜですか?

:8080要求が転送され、要求httpd自体が を通過して要求を取得しようとするため、:8080新しい履歴書の書式を再指定するまでループが続行されます。

答え1

答えはにあります-i eth0

もしあなたが17.98.65.28IPであると仮定し、接続するためにhttpdを設定していてもeth0、トラフィックは実際にはそれを通過せずにeth0使用されますlo

その理由は、ボックス自体が所有するIPにルーティングされたときにトラフィックが通過するためですlo

ip route get 17.98.65.28

dev loそのアドレスにトラフィックを送信するためにどのインターフェイスが使用されるかを示すthisを含む行が表示されます。

たとえば、私のラップトップには次のものがwlan0あります10.252.28.62

$ ip route get 10.252.28.62
local 10.252.28.62 dev lo  src 10.252.28.62 
    cache <local> 

関連情報