この記事の著者: 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 プロトコル:
最初の 3 つのパケットは 3 ウェイ ハンドシェイクであり、4 番目のパケットの最初の 3 桁は tpkt です。が必要です。たとえば、ssh は 535348 です。
rdp プロトコル: 030000
クイック チェック:
| プロトコル | TPKT
| SSH | 535348
| RDP | 030000
| HTTP(GET) | 474554
| HTTP(POS) | 504f53
| HTTP(PUT) #505554 |
HTTP(DEL) |
44454c |
HTTP(OPT) |
4f5054 |
HTTP(HEA) |
484541 |
HTTP(CON) |
434f4e |
#HTTP(TRA)#545241 |
| #HTTPS
160301 |
|
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端口
Target2:Win7 x64
IP:192.168.213.129
开启3389端口
启动haproxy,-f 指定配置文件,开启8888端口表示启动成功。-d:调试模式,可不加。
HTTP协议:访问靶机的8888端口,流量被haproxy分发至本机的80。
RDP协议:访问靶机的8888端口,流量被haproxy分发至192.168.213.129的3389。
SSH协议:访问靶机的8888端口,流量被haproxy分发至本机的22。
haproxy日志:
六、端口重定向
为了不影响常规的80端口访问,将输入的80端口流量重定向到8888端口。当用户以正常方式访问80端口时,流量将转发到8888端口,然后由haproxy再次转发回80端口。
iptables ‐t nat ‐A PREROUTING ‐i eth0 ‐p tcp ‐‐dport 80 ‐j REDIRECT ‐‐to‐port 8888
ログイン後にコピー
访问80可以正常访问:
Haproxy日志有记录,说明流量由80先到8888,再回到80。
netsh interface portproxy add v4tov4 listenport=80 connectport=8888 connectaddress=127.0.0.1
ログイン後にコピー
注意:如果在windows下启用端口重定向,需要在端口启动前添加netsh端口转发规则。
以上がHaproxy ポートの再利用を分析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。