ファイルから読み取るために-fオプションを指定したhaproxy ACLを使用して(ユーザーエージェントヘッダーのサブストリングを照合することにより)特定のユーザーエージェントからの接続を拒否しようとしています。ただし、機能していないため、構成が無視されているかのように実行されます。
Haproxyの経験が豊富な誰かが、私が欠けているものを特定できますか?または、このhaproxy構成をデバッグする方法に関するいくつかのヒント?
私はhaproxy 1.4.18を実行しています。
これはhaproxy.cfgからの抜粋です。
listen http 0.0.0.0:80
acl abuser hdr_sub(user-agent) -f /etc/haproxy/abuser.lst
tcp-request content reject if abuser
mode http
server www1 127.0.0.1:8080 maxconn 10000
これは、abuser.lstファイルの内容です。
# annoying bots
annoyingbot1
annoyingbot2
この質問は古いですが、誰かがこの問題に遭遇した場合:
あなたの問題は、tcp-request content
は、HAProxyがレイヤー7データを受信/読み取る時間がある前に実行されます。
これを修正するには?
簡単: tcp-request inspect-delay を追加:
listen http 0.0.0.0:80
tcp-request inspect delay 15s
acl abuser hdr_sub(user-agent) -f /etc/haproxy/abuser.lst
tcp-request content reject if abuser
mode http
server www1 127.0.0.1:8080 maxconn 10000
これはHAProxyのドキュメントからのこれについての重要なビットです:
コンテンツ検査を実行するとき、haproxyは、それらのデータが部分的であるという事実を考慮して、入ってくるすべての新しいチャンクのルール全体を評価することに注意してください。前述の遅延の前に一致するルールがない場合、最後のチェックが期限切れ時に実行されます。今回は、内容が確定的であると見なされます。 遅延が設定されていない場合、haproxyはまったく待機せず、利用可能な情報に基づいてすぐに判定を適用します。明らかに、これはあまり有用ではなく、際どい場合もあるので、そのような設定は推奨されません。