IPTables とポートリダイレクト Apache2

IPTables とポートリダイレクト Apache2

私は Apache を使用してサブドメインをポート ( mod_proxy、、 ) にリダイレクトし、IP テーブルを使用しmod_proxy_httpmod_proxy_ajp自分とローカル サーバー以外の直接ポート アクセスを制限しています。

私の IP テーブルは次のようになります:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:tproxy
ACCEPT     tcp  --  localhost            anywhere             tcp dpt:tproxy
DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:http-alt
DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:webmin
ACCEPT     tcp  --  localhost            anywhere             tcp dpt:webmin

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

この投稿で使用するコンテキストは次のとおりです。

ソナタイプネクサス:nexus.example.com => example.com:8081

ジェンキンスCI:jenkins.example.com => example.com:8080

ウェブミン:webmin.example.com => example.com:10000

現在動作しているのは、私以外への直接ポート アクセスではありません。また、ローカル システムがポートにアクセスできるようにしたいのですが、現在それができていると思います。Jenkins mod_proxy_ajpCI と Webmin、およびmod_proxy_httpSonatype Nexus に使用しています。

直接ポートにアクセスすると、これらの各サービスは正常に読み込まれます。他の人に各サービスを読み込むように依頼したところ、読み込めませんでした。これが機能している理由です。

しかし、サブドメインの 1 つにアクセスしようとすると、終わりのないロード (無限ループ?) が発生します。

ただし、サブドメインで tracert を実行すると正常に終了するため、無限ループを解消できます。

これが私の Sonatype Nexus Apache 仮想ホスト構成です:

<VirtualHost *:80>
        ServerName nexus.majornoob.com
        ServerAlias www.nexus.majornoob.com
        ProxyRequests Off
        ProxyPreserveHost On
        ProxyPass / http://localhost:8081/
        ProxyPassReverse / http://localhost:8081/
        ProxyPassReverseCookiePath / /
        ErrorLog /var/www/majornoob/error-nexus.log
        LogLevel warn
        CustomLog /var/www/majornoob/access-nexus.log combined
</VirtualHost>

これが私の Jenkins です:

<VirtualHost *:80>
        ServerName jenkins.majornoob.com
        ServerAlias www.jenkins.majornoob.com
        ProxyRequests Off
        ProxyPreserveHost On
        ProxyPass / ajp://127.0.0.1:8080/
        ProxyPassReverse / ajp://127.0.0.1:8080/
        ProxyPassReverseCookiePath / /

        ErrorLog /var/www/majornoob/error-jenkins.log

        LogLevel warn

        CustomLog /var/www/majornoob/access-jenkins.log combined
</VirtualHost>

これら 2 つの仮想ホストの例では、それぞれ と を使用していmod_proxy_ajpますmod_proxy_http

なぜ無限の負荷が発生するのか、誰か解明を手伝ってくれませんか?

ありがとう。

編集:無限ループについては気にしないでください。しばらくすると、503 Service Unavailable エラーが表示されました。

答え1

iptables ルールは、印刷されたとおりに上から下へ順番に評価されます。問題は、プロキシ接続がローカルホストから行われ、次のルールに一致することです。

DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:tproxy

localhostではないc-24-7-...ため、接続は切断されます。プロキシ モジュールは最終的にタイムアウトします。ルールが DROP ではなく REJECT だった場合、エラーはより早く発生します (接続試行が単に消えるのではなく、明示的に拒否されるため)。

解決策は非常に簡単です。ルールを並べ替えて、「localhost からの受け入れ」を「他の場所からの拒否」の前に配置します。(IP ルーティングは最も具体的なものと一致しますが、iptables は複数の要素を持つため、必ずしも定義されているわけではありません)。

一般的には、すべてのローカルホスト通信を許可する最初のルール(ループバックインターフェース経由、誰かがイーサネット経由で何か変なことをしようとした場合に備えて)を設定することをお勧めします。

iptables -I INPUT -i lo -s localhost -d localhost -j ACCEPT

-Iリストの先頭に( ) を挿入します。

関連情報