ホームページ >運用・保守 >安全性 >Haproxy ポートの再利用を分析する方法

Haproxy ポートの再利用を分析する方法

WBOY
WBOY転載
2023-05-29 09:25:411776ブラウズ

この記事の著者: Spark (Ms08067 イントラネット セキュリティ チーム メンバー)

1. 概要

Haproxy は C 言語を使用して開発されています。 -パフォーマンス負荷分散プロキシ ソフトウェア。無料、高速、信頼性の高い TCP および HTTP アプリケーション プロキシを提供します。
frp と同様に、1 つの構成ファイルと 1 つのサーバーを使用して実行できます。
利点:

大規模なビジネス分野で広く使用されている

4層プロキシ(トランスポート層)および7層プロキシ(アプリケーション層)をサポート

acl (アクセス コントロール リスト) をサポートし、ルーティングを柔軟に設定できます。

Windows は cygwin でコンパイルした後に実行できます (クロスプラットフォーム可能)

アクセス コントロール リスト (ACL) はルーターに適用される インターフェース用のコマンドのリスト これらのコマンド・リストは、どのデータ・パケットが受け入れられ、どのデータ・パケットが拒否される必要があるかをルーターに伝えるために使用されます。

2. 設定

公式設定マニュアル:
https://cbonte.github.io/haproxy-dconv/2.2/configuration.html 設定ファイルは、グローバル設定とプロキシ設定で構成されます。

グローバル設定 (グローバル): haproxy プロセス管理のセキュリティとパフォーマンスに関連するパラメータを定義します。

プロキシ設定 (プロキシ) :

defaults: 他の構成セクションにデフォルトのパラメーターを提供します。デフォルトの構成パラメーターは、次の「デフォルト」によってリセットできます。

フロントエンド: 一連の待機ソケットを定義します。ソケットはクライアント要求を受け入れ、接続を確立できます。

バックエンド:「バックエンド」サーバーを定義すると、フロントエンド プロキシ サーバーがこれらのサーバーに短期リクエストをディスパッチします

listen:ソケットとバックエンド サーバーをリッスンすることは、フロントエンド セグメントとバックエンド セグメントを結合することに似ています。

例:

global
defaults
  log global
  mode tcp
  option dontlognull
  timeout connect 5000
  timeout client 50000
  timeout server 50000

frontend main
  mode tcp
  bind *:8888
  option forwardfor except 127.0.0.1
  option forwardfor header X‐Real‐IP

# 配置acl规则
  acl is‐proxy‐now urlp_reg(proxy) ^(http|https|socks5)$
# 分发到对应的backend
  use_backend socks5 if is‐proxy‐now
  use_backend http
backend socks5
  mode tcp
  timeout server 1h
  server ss 127.0.0.1:50000
backend http
  mode tcp
  server http 127.0.0.1:80

フロントエンドとバックエンドに焦点を当てます。
フロントエンドで ACL ルールを作成し、転送を構成する必要があります。たとえば、HTTP トラフィックが到着すると Web サービスに転送され、RDP トラフィックが到着すると RDP サービスに転送されます。 どのターゲットのどのポートに転送するかという特定の操作をバックエンドに記述する必要があります。

3. アイデア

(1) アイデア 1 (一般)

レイヤー 4 (送信層) で ACL ルールを作成します。 ) 負荷を実行し、プロトコル タイプに従って負荷を分散します。たとえば、http トラフィックが発生した場合は http サービスに送信され、rdp が発生した場合は rdp サービスに送信されます。

(2) アイデア 2

ACL ルールを作成し、7 番目の層 (アプリケーション層) にロードし、配布するアプリケーションのタイプを決定します。たとえば、 http 配信は http サービスに、それ以外の場合は xxx サービスに送信されます。

4. 手順

アイデア 1 を例として挙げます:

wireshark を通じて tpkt (Application Layer Data Transfer Protocol) 情報をキャプチャします

トラフィック分散のための ACL ルール ルーティングの作成

バックエンド サーバーの追加

元のインターフェイスの引き継ぎ

完了

#4.1 キャプチャtpkt


tpkt については、Baidu を参照するか、参考リンクを参照してください。
スリーウェイ ハンドシェイクの後、アプリケーション層のデータ送信が開始されます。
Wireshark を使用してパケットをキャプチャします:
ssh プロトコル: Haproxy ポートの再利用を分析する方法


最初の 3 つのパケットは 3 ウェイ ハンドシェイクであり、4 番目のパケットの最初の 3 桁は tpkt です。が必要です。たとえば、ssh は 535348 です。

rdp プロトコル: 030000

Haproxy ポートの再利用を分析する方法

クイック チェック:プロトコルTPKTSSH535348RDP030000 HTTP(GET)474554HTTP(POS)504f53HTTP(PUT) #HTTP(TRA)#HTTPS160301

4.2 编写acl规则

global
defaults
  timeout connect 5000
  timeout client 50000
  timeout server 50000
frontend main
  mode tcp
  bind *:8888
# 重点:编写acl规则进行转发
  tcp‐request inspect‐delay 3s
  acl is_http req.payload(0,3) ‐m bin 474554 504f53 505554 44454c 4f5054 484541 434f4e 545241
  acl is_ssh req.payload(0,3) ‐m bin 535348
  acl is_rdp req.payload(0,3) ‐m bin 030000
# 设置四层允许通过
  tcp‐request content accept if is_http
  tcp‐request content accept if is_ssh
  tcp‐request content accept if is_rdp
  tcp‐request content accept
# 分发到对应的backend
  use_backend http if is_http
  use_backend ssh if is_ssh
  use_backend rdp if is_rdp
  use_backend socks5
backend socks5
  mode tcp
  timeout server 1h
  server ss 127.0.0.1:50000
backend http
  mode tcp
  server http 127.0.0.1:80
backend ssh
  mode tcp
  server ssh 127.0.0.1:22
backend rdp
  mode tcp
  server rdp 192.168.213.129:3389

该配置文件的功能是监听8888端口,将http流量(速查表中http协议的8种tpkt)转发到本地的80上,将ssh流量转发到本地的22端口上,将rdp流量转发到另一主机的3389上。

五、实验

Target1:Ubuntu 16.04 x64

IP:192.168.213.128

开启22端口、80端口

Haproxy ポートの再利用を分析する方法

Target2:Win7 x64

IP:192.168.213.129

开启3389端口

Haproxy ポートの再利用を分析する方法

启动haproxy,-f 指定配置文件,开启8888端口表示启动成功。-d:调试模式,可不加。

Haproxy ポートの再利用を分析する方法

HTTP协议:访问靶机的8888端口,流量被haproxy分发至本机的80。

Haproxy ポートの再利用を分析する方法

RDP协议:访问靶机的8888端口,流量被haproxy分发至192.168.213.129的3389。

Haproxy ポートの再利用を分析する方法SSH协议:访问靶机的8888端口,流量被haproxy分发至本机的22。

Haproxy ポートの再利用を分析する方法

haproxy日志:

Haproxy ポートの再利用を分析する方法

六、端口重定向

为了不影响常规的80端口访问,将输入的80端口流量重定向到8888端口。当用户以正常方式访问80端口时,流量将转发到8888端口,然后由haproxy再次转发回80端口。

  • Linux:iptables(不需要重启服务)

iptables ‐t nat ‐A PREROUTING ‐i eth0 ‐p tcp ‐‐dport 80 ‐j REDIRECT ‐‐to‐port 8888

访问80可以正常访问:

Haproxy ポートの再利用を分析する方法

Haproxy日志有记录,说明流量由80先到8888,再回到80。

Haproxy ポートの再利用を分析する方法

  • Windows:netsh(需要重启web服务)

netsh interface portproxy add v4tov4 listenport=80 connectport=8888 connectaddress=127.0.0.1

注意:如果在windows下启用端口重定向,需要在端口启动前添加netsh端口转发规则。

#505554
HTTP(DEL) 44454c
HTTP(OPT) 4f5054
HTTP(HEA) 484541
HTTP(CON) 434f4e
#545241

以上がHaproxy ポートの再利用を分析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。