FreeBSD 로드 밸런서 구현

FreeBSD 로드 밸런서 구현

멀티 프로세스\멀티 스레드 모드에서는 사용할 수 없는 프로그램이 있어서 CPU 코어 한 개만 먹고 나머지 코어는 프리로 사용하는데 RAM과 네트워크 대역폭 사용량이 최대치의 10%에 가깝습니다.

해당 목적에 사용되는 서버에는 8코어 CPU, 16GB RAM 및 4094개의 외부 IP 주소에서 오는 요청을 처리하기 위한 /20 서브넷이 있습니다.

주요 아이디어는 각각 별도의 TCP 포트가 있는 8개의 인스턴스를 실행한 다음 일부 방화벽 소프트웨어를 사용하여 리디렉션 규칙을 만드는 것입니다.

Linux(ubuntu 14.04 LTS amd64)에서는 iptables를 사용하여 수행됩니다.

/etc/iptables/rules.v4(리디렉션 부분만)

-A 사전 라우팅 -p tcp -m tcp --dport 4000 -m 통계 --mode nth --every 8 --packet 0 -j DNAT --to-destination :4001
-A 사전 라우팅 -p tcp -m tcp --dport 4000 -m 통계 --mode nth --every 7 --packet 0 -j DNAT --to-destination :4002
-A 사전 라우팅 -p tcp -m tcp --dport 4000 -m 통계 --mode nth --every 6 --packet 0 -j DNAT --to-destination :4003
-A 사전 라우팅 -p tcp -m tcp --dport 4000 -m 통계 --mode nth --every 5 --packet 0 -j DNAT --to-destination :4004
-A 사전 라우팅 -p tcp -m tcp --dport 4000 -m 통계 --mode nth --every 4 --packet 0 -j DNAT --to-destination :4005
-A 사전 라우팅 -p tcp -m tcp --dport 4000 -m 통계 --mode nth --every 3 --packet 0 -j DNAT --to-destination :4006
-A 사전 라우팅 -p tcp -m tcp --dport 4000 -m 통계 --mode nth --every 2 --packet 0 -j DNAT --to-destination :4007
-A 사전 라우팅 -p tcp -m tcp --dport 4000 -j DNAT --to-destination :4008

하지만 프로그램이 불안정해져서 freebsd(releng 11 amd64)용으로 컴파일하고 pf를 사용하여 4000 포트를 리디렉션하려고 했습니다.

/etc/pf.conf

테이블 <mainips> { aaaa/32 }

ext_if = "lagg0"

바인딩된 경우 상태 정책 설정
최적화 공격성 설정
건너뛰기 설정 { lo0 }
한도 상태를 150000으로 설정

inet의 모든 조각을 스크러빙하여 임의 ID를 재조립합니다.
inet을 모두 제거하고 tcp를 모두 재조립합니다.

inet6에서 모두 스크러빙

rdr은 $ext_if inet proto tcp 로그를 통해 any에서 xx240.0/20 포트 4000 -> xx240.0/20 포트 4001:4008로 루프합니다.

$ext_if inet proto tcp를 xx240.0/20 포트 4000에 전달합니다.

$ext_if inet proto icmp 전달
$ext_if inet6 프로토타입 icmp6 전달
$ext_if inet proto tcp를 <mainips> 포트 { 22 }에 전달합니다.
{ $ext_if } inet proto tcp의 모든 플래그 S/SA 변조 상태를 전달합니다.
{ $ext_if } inet proto udp all을 전달하세요.

#블록올

하지만 로드 밸런싱 주기는 포트가 아닌 IP 주소만 고려하므로 ipfilter\ipnat를 사용해 보았습니다.

/etc/ipf.규칙:

lo0 all을 빠르게 전달하세요.
ㅋㅋㅋ 다들 빨리 기절해버렸어
lagg0 proto tcp = 22 플래그의 모든 포트에서 빠른 전달 상태 유지
lagg0 proto tcp의 모든 포트에서 빠른 패스 = 4000 플래그 상태 유지
모든 포트 proto tcp=4001 플래그 S 유지 상태의 빠른 통과 lagg0
lagg0 proto tcp = 4002 플래그 S 상태 유지의 모든 포트에서 빠른 전달
lagg0 proto tcp = 4003 플래그 S 상태 유지의 모든 포트에서 빠른 전달
lagg0 proto tcp = 4004 플래그 S 상태 유지의 모든 포트에서 빠른 전달
lagg0 proto tcp = 4005 플래그 S 상태 유지의 모든 포트에서 빠른 전달
lagg0 proto tcp = 4006 플래그 S 상태 유지의 모든 포트에서 빠른 전달
lagg0 proto tcp = 4007 플래그 S 상태 유지의 모든 포트에서 빠른 전달
lagg0 proto tcp = 4008 플래그 S 상태 유지의 모든 포트에서 빠른 전달

/etc/ipnat.규칙:

rdr lagg0 xx240.1/20 포트 4000 -> xx240.1-xx255.254 포트 4001 tcp 루프
rdr lagg0 xx240.1/20 포트 4000 -> xx240.1-xx255.254 포트 4002 TCP 루프
rdr lagg0 xx240.1/20 포트 4000 -> xx240.1-xx255.254 포트 4003 tcp 루프
rdr lagg0 xx240.1/20 포트 4000 -> xx240.1-xx255.254 포트 4004 tcp 루프
rdr lagg0 xx240.1/20 포트 4000 -> xx240.1-xx255.254 포트 4005 tcp 루프
rdr lagg0 xx240.1/20 포트 4000 -> xx240.1-xx255.254 포트 4006 tcp 루프
rdr lagg0 xx240.1/20 포트 4000 -> xx240.1-xx255.254 포트 4007 tcp 루프
rdr lagg0 xx240.1/20 포트 4000 -> xx240.1-xx255.254 포트 4008 tcp 루프

이 구성을 사용하면 루프 대상 포트를 얻을 수 있지만 모든 포트를 xx240.1 주소로만 리디렉션할 수 있습니다.

주요 질문: Linux에서와 같이 freebsd에서 동일한 리디렉션 동작을 얻는 방법은 무엇입니까?

관련 정보