
bbs is a router for SOCKS and HTTP proxies. It exposes a SOCKS5 (or HTTP CONNECT) service and forwards incoming requests to proxies or chains of proxies based on the request's target. Routing can be configured with a PAC script (if built with PAC support), or through a JSON file.
旧バージョンの 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 Python CLI は、bbs の設定を容易にし、JSON ファイルを手動で書くことを避けるために提供されています。pyparsing ライブラリが必要で、これは Debian でパッケージ化されています:
apt install python3-pyparsing
このライブラリがお使いのディストリビューションでパッケージ化されていない場合は、pip でインストールできます:
pip install pyparsing
設定は、複数のセクションからなる 1 つの 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 セクションから) は、設定内の1つのルーティングテーブルに関連付けられます。各サーバーで受信されたリクエストは、対応するルーティングテーブルに従ってルーティングされます。すべてのブロックが false と評価された場合、デフォルトルートが使用されます。default が定義されていない場合、接続はデフォルトでドロップされます。
ブロックのフィールド:
comment (文字列)rules (Rule または RuleCombo)route (文字列)disable (ブール値)ルールのフィールド:
rule (文字列): ルールタイプ。regexp、subnet。variable (文字列): regexp 評価のための変数。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 内の regexp と照合します。subnet: ホストが content で定義されたサブネット内にあるかどうかを確認します。ホストがドメイン名でありサブネットアドレスでない場合、ルールは false を返します。routes セクションのルールブロックまたは PAC 関数は、プロキシ名ではなく、宣言されたチェーン名を返さなければなりません。単一のプロキシを使用したい場合は、それをチェーンでラップする必要があります。drop という名前は特別で、この設定で宣言する必要はありません。PAC 関数またはルーティングブロックがチェーン名として drop を返した場合、接続はドロップされます。
bbs が PAC サポート付きでビルドされ、-pac 引数が PAC ファイルを指している場合、設定ファイルで定義されたルートは使用されません。PAC ファイルのルーティングは複数のルーティングテーブルをサポートしていません。同じ PAC ファイルが開かれたすべてのサーバーで使用されます。
bbs が開くリスナーは、servers セクションで protocol://bind_addr:bind_port:routing_table または protocol://bind_addr:bind_port:chain:dest_addr:dest_port 形式の接続文字列のリストとして宣言する必要があります。
routing_table が指定されている場合、protocol は http または socks5 にできます。chain、dest_addr、dest_port が指定されている場合、protocol は 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 設定で宣言されたチェーン (プロキシではない) の名前と一致する必要があります。