
bbs는 SOCKS 및 HTTP 프록시용 라우터입니다. SOCKS5(또는 HTTP CONNECT) 서비스를 노출하고 요청의 대상에 따라 수신 요청을 프록시 또는 프록시 체인으로 전달합니다. 라우팅은 PAC 스크립트(PAC 지원으로 빌드된 경우) 또는 JSON 파일로 구성할 수 있습니다.
이전 bbs는 여기에서 찾을 수 있습니다.
bbs는 SOCKS 및 HTTP 프록시용 라우터입니다. SOCKS5, HTTP CONNECT 또는 포트 포워딩 서비스를 노출하고, 요청 대상에 따라 수신 요청을 프록시 또는 프록시 체인으로 전달합니다. 라우팅은 (PAC 지원으로 빌드한 경우) PAC 스크립트 또는 JSON 파일을 통해 구성할 수 있습니다.
go install github.com/synacktiv/bbs@master
PAC 스크립트 지원으로 bbs를 설치하려면:
go install -tags pac github.com/synacktiv/bbs@master
참고: PAC는 감사되지 않은 타사 라이브러리에 의존합니다.
bbscli.py 파이썬 CLI는 bbs 구성을 쉽게 하고 JSON 파일을 수동으로 작성하지 않도록 제공됩니다. Debian에서 패키지로 제공되는 pyparsing 라이브러리가 필요합니다:
apt install python3-pyparsing
라이브러리가 배포판에 패키지로 제공되지 않는 경우 pip를 사용해 설치할 수 있습니다:
pip install pyparsing
구성은 여러 섹션으로 구성된 하나의 JSON 파일에서 수행됩니다:
구성 파일 경로는 -c <path> 인자로 제공됩니다(기본값 ./bbs.json). bbs는 SIGHUP 시 구성 파일을 다시 로드합니다. kill -HUP <pid>를 사용해 다시 로드하세요.
다음은 이러한 구성의 예입니다:
{
"proxies": {
"proxy1": {
"connstring": "socks5://127.0.0.1:1337",
"user": "user",
"pass": "s3cr3t"
},
"proxy2": {
"connstring": "http://127.0.0.1:1338"
}
},
"chains": {
"chain1": {
"proxyDns": true,
"tcpConnectTimeout": 1000,
"tcpReadTimeout": 2000,
"proxies": [
"proxy1",
"proxy2"
]
},
"direct": {
"proxies": []
}
},
"routes": {
"table1": {
"default": "direct",
"blocks": [
{
"comment": "Block1 comment",
"rules": {
"rule": "regexp",
"variable": "host",
"content": "me\\.gandi\\.net"
},
"route": "chain1"
},
{
"comment": "Route non web traffic towards 10.35.0.0/16 through proxy2",
"rules": {
"rule1": {
"rule": "subnet",
"content": "10.35.0.0/16"
},
"op": "AND",
"rule2": {
"rule": "regexp",
"variable": "port",
"content": "^(80|443)$",
"negate": true
}
},
"route": "proxy2"
},
{
"comment": "Drop traffic to 445",
"rules": {
"rule": "regexp",
"variable": "port",
"content": "^445$"
},
"route": "drop"
},
{
"comment": "Route *.corp.local through chain1",
"rules": {
"rule": "regexp",
"variable": "host",
"content": "(?i)^(.*\\.)?corp\\.local$"
},
"route": "chain1",
"disable": true
}
]
},
"table2": {
"default": "drop",
"blocks": [
{
"comment": "Route *.corp.local through chain2",
"rules": {
"rule": "regexp",
"variable": "host",
"content": "(?i)^(.*\\.)?corp\\.local$"
},
"route": "chain2"
}
]
}
},
"servers": [
"socks5://127.0.0.1:1081:table1",
"http://127.0.0.1:1080:table2",
"fwd://127.0.0.1:4445:chain1:10.0.0.1:445"
],
"hosts": {
"host1": "1.1.1.1",
"host2": "10.0.0.1",
"host3": "modified.host3",
"10.1.1.4": "10.1.1.5"
}
}
업스트림 프록시는 proxies 섹션에 프록시 구조체의 맵으로 선언해야 합니다. 맵 키는 자유롭게 선택할 수 있지만 체인 정의에 사용된 키와 일치해야 합니다. 프록시 구조체는 다음과 같습니다:
connstring은 protocol://host:port 형식으로 필수입니다 (protocol은 socks5 또는 httpconnect/http 가능)user와 pass는 선택 사항입니다선언된 각 프록시에 대해 동일한 이름의 암시적 체인(다음 문단 참조)이 생성됩니다. 기본 매개변수를 가지며 단일 연결 프록시로 구성됩니다. 기본이 아닌 매개변수를 사용하려면 체인을 명시적으로 생성해야 합니다.
체인은 chains 섹션에 체인 구조체의 맵으로 선언해야 합니다. 맵 키는 자유롭게 선택할 수 있지만 경로 정의에 사용된 키와 일치해야 하며, proxies 섹션의 맵 키와 달라야 합니다. 체인 구조체는 proxychains와 유사한 매개변수를 가집니다 (참조: https://github.com/rofl0r/proxychains-ng):
proxyDns: 불리언, 선택 사항, 기본값 truetcpConnectTimeout: 정수, 선택 사항, 기본값 1000 (체인의 첫 번째 프록시 또는 대상에 직접 소켓을 연결할 때 사용됨)tcpReadTimeout: 정수, 선택 사항, 기본값 2000 (연결된 소켓에서 프록시 핸드셰이크 응답을 읽을 때 사용됨)proxies: 문자열 목록, 선택 사항, 기본값 빈 목록chain의 proxies 키에는 proxies 섹션에 키로 선언된 프록시 이름의 배열이 포함되어야 합니다. 앞 문단에서 언급했듯이, proxies 섹션에 선언된 각 프록시에 대해 동일한 이름의 암시적 체인(다음 문단 참조)이 생성됩니다. 기본 매개변수를 가지며 단일 연결 프록시로 구성됩니다.
라우팅을 위한 기본 제공 구성 모드는 구성 파일을 통한 것입니다. 주소를 체인 이름과 연결합니다. 파일에는 라우팅 테이블의 맵이 포함되어야 합니다. 맵 키는 자유롭게 선택할 수 있지만 servers 섹션에 사용된 키와 일치해야 합니다. 각 라우팅 테이블에는 기본 경로를 나타내는 default 키와 규칙 블록 배열인 blocks 키가 포함됩니다. 각 규칙 블록에는 comment, rules 집합, 그리고 연결된 체인 이름이 포함됩니다. 규칙은 host:port 형식의 주소가 주어졌을 때 true 또는 false로 평가됩니다. 주어진 주소에 대해 블록은 선언된 순서대로 평가됩니다. 블록은 disable 필드를 true로 설정하여 비활성화할 수 있습니다. 이를 통해 JSON에서는 불가능한 "주석 처리" 형태가 가능합니다. 평가는 true인 첫 번째 블록에서 멈추고 연결된 체인 이름이 반환됩니다. (servers 섹션의) 각 열린 서버는 구성의 라우팅 테이블 하나와 연결됩니다. 각 서버에서 수신된 요청은 일치하는 라우팅 테이블에 따라 라우팅됩니다. 모든 블록이 false로 평가되면 기본 경로가 사용됩니다. default가 정의되지 않은 경우 연결은 기본적으로 끊어집니다.
블록 필드:
comment (문자열)rules (Rule 또는 RuleCombo)route (문자열)disable (불리언)규칙 필드:
rule (문자열): 규칙 유형, regexp, subnet.variable (문자열): 정규식 평가를 위한 변수, host, port 또는 addr (host:port).content (문자열): 규칙의 내용, 규칙 유형에 따라 다름 (아래 참조).negate (불리언) [선택 사항]: 규칙을 부정할지 여부.RuleCombo 필드:
rule1 (Rule 또는 RuleCombo): 왼쪽 피연산자.op (문자열): 연산자, AND, And, and, &, &&, OR, Or, or, |, ||.rule2 (Rule 또는 RuleCombo): 오른쪽 피연산자.규칙 유형:
regexp: variable에 정의된 변수(host, port 또는 addr=host:port)를 content의 정규식과 대조합니다.subnet: 호스트가 content에 정의된 서브넷에 있는지 확인합니다. 호스트가 도메인 이름이고 서브넷 주소가 아닌 경우 규칙은 false를 반환합니다.routes 섹션의 규칙 블록 또는 PAC 함수는 프록시 이름이 아닌 선언된 체인 이름을 반환해야 합니다. 단일 프록시를 사용하려면 체인으로 감싸야 합니다. drop 이름은 특별하며 이 구성에 선언할 필요가 없습니다. PAC 함수 또는 라우팅 블록이 체인 이름으로 drop을 반환하면 연결이 끊어집니다.
bbs가 PAC 지원으로 빌드되었고 -pac 인수가 PAC 파일을 가리키는 경우 구성 파일에 정의된 경로는 사용되지 않습니다. PAC 파일 라우팅은 여러 라우팅 테이블을 지원하지 않습니다. 동일한 PAC 파일이 열린 모든 서버에 사용됩니다.
bbs가 여는 리스너는 protocol://bind_addr:bind_port:routing_table 또는 protocol://bind_addr:bind_port:chain:dest_addr:dest_port 형식의 연결 문자열 목록으로 servers 섹션에 선언해야 합니다.
protocol은 routing_table이 제공되면 http 또는 socks5가 될 수 있습니다protocol은 chain, dest_addr, dest_port가 제공되면 fwd가 될 수 있습니다routing_table은 routes 섹션에 정의된 테이블 중 하나와 일치해야 합니다chain은 chains 섹션에 정의된 체인 중 하나와 일치해야 합니다사용자 정의 호스트 해석(/etc/hosts와 유사)은 hosts 섹션에 문자열 맵으로 구성할 수 있습니다. 맵 키는 호스트 이름에 해당하고 값은 호스트가 해석되어야 할 IP 주소에 해당합니다.
맵 키는 IP 주소일 수도 있습니다. 이 경우 키 IP 주소는 값 IP 주소로 대체됩니다. 마찬가지로 맵 값은 호스트 이름일 수 있으며 해당 맵 키를 대체합니다.
정의된 경우 사용자 정의 호스트 해석은 연결 단계의 시작, 라우팅 결정이 이루어진 후, 로컬 DNS 해석 전(체인이 proxyDns=false로 구성된 경우), 그리고 대상 주소를 체인의 각 프록시로 보내기 전에 수행됩니다.
bbs가 PAC 지원으로 빌드된 경우 라우팅을 JSON 구성 파일 대신 PAC 스크립트로 구성할 수 있습니다. 하지만 이는 신뢰할 수 없는 Go 라이브러리를 사용해야 합니다. PAC 파일 경로는 -pac로 제공해야 합니다.
PAC 스크립트는 FindProxyForURL(url, host) 함수를 정의해야 합니다. 이 함수가 반환하는 값은 JSON 구성에 선언된 체인(프록시가 아닌)의 이름과 일치해야 합니다.