이 글의 작성자: Spark (Ms08067 인트라넷 보안 팀원)
1. 개요
Haproxy는 C 언어로 개발된 고성능 로드 밸런싱 프록시 소프트웨어로 tcp 및 http 애플리케이션 프록시를 무료로 제공하며 Fast입니다. 그리고 신뢰할 수 있습니다.
frp와 유사하게 구성 파일 + 서버를 사용하여 실행할 수 있습니다.
장점:
대규모 비즈니스 분야에서 널리 사용됨
4계층 프록시(전송 계층) 및 7계층 프록시(응용 계층) 지원
acl(액세스 제어 목록) 지원 및 라우팅을 유연하게 구성 가능
Windows 컴파일 가능 cygwin Runnable 사용(크로스 플랫폼)
액세스 제어 목록(ACL)은 라우터 인터페이스에 적용되는 명령 목록입니다. 이 명령 목록은 라우터에 허용할 수 있는 데이터 패킷과 거부해야 하는 데이터 패킷을 알려주는 데 사용됩니다.
2. 구성
공식 구성 매뉴얼: https://cbonte.github.io/haproxy-dconv/2.2/configuration.html
구성 파일은 전역 구성과 프록시 구성으로 구성됩니다:
Global 구성(전역): haproxy 프로세스 관리 보안 및 성능과 관련된 매개변수를 정의합니다.
프록시 설정(프록시):
defaults: 다른 구성 섹션에 기본 매개변수를 제공합니다. 기본 구성 매개변수는 다음 "기본값"으로 재설정될 수 있습니다.
프론트엔드: 일련의 청취 소켓을 정의합니다. 이 소켓은 클라이언트 요청을 수락하고 연결을 설정할 수 있습니다. 백엔드: "백엔드" 서버를 정의하면 프런트엔드 프록시 서버가 이러한 서버에 단기 요청을 전달합니다. 듣기: 프런트엔드와 백엔드 세그먼트를 함께 배치하는 것과 유사하게 청취 소켓과 백엔드 서버를 정의합니다
예:
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 트래픽이 들어오면 웹 서비스로 전달되고, RDP 트래픽이 들어오면 RDP 서비스로 전달됩니다.
어떤 대상과 어떤 포트로 전송하기 위한 특정 작업을 백엔드에 작성해야 합니다.
세 가지 아이디어
(1) 아이디어 1(일반)
acl 규칙을 작성하고 이를 네 번째 계층(전송 계층)에 로드한 후 프로토콜 유형에 따라 배포합니다. 트래픽을 http 서비스로 보내고, rdp를 만나면 rdp 서비스로 보냅니다.
(2) 아이디어 2
acl 규칙을 작성하고 이를 일곱 번째 계층(애플리케이션 계층)에 로드하고 배포할 애플리케이션 유형을 결정합니다. 예를 들어 http가 발견되면 http 서비스에 배포하고, 그렇지 않으면 전송합니다. xxx 서비스로 보내주세요.
4단계
아이디어 1을 예로 들어보세요.
wireshark를 통해 tpkt(애플리케이션 계층 데이터 전송 프로토콜) 정보 캡처 트래픽 분산을 위한 ACL 규칙 라우팅 작성 백엔드 서버 추가원래 인터페이스 인계 Complete
4.1 Capture tpkt
tpkt에 대해서는 Baidu를 참조하거나 참조 링크를 확인하세요
3방향 핸드셰이크 후 애플리케이션 계층 데이터 전송이 시작됩니다.
wireshark를 사용하여 패킷 캡처:
ssh 프로토콜:
처음 세 개의 패킷은 3방향 핸드셰이크이고 네 번째 패킷의 처음 세 자리는 필요한 tpkt입니다. 예를 들어 ssh는 535348입니다.
rdp 프로토콜: 030000
빠른 확인:
protocol | TPKT |
SSH | 535348 |
RD P | 030000 |
HTTP(GET) | 474554 |
HTTP(POS) | 504f53 |
HTTP(PUT) | 505554 |
HTTP(DEL) | 44454c |
HT TP(선택) | 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!