これは mmproxy の Go 再実装であり、mmproxy の実行時の安定性を向上させながら、接続とパケットのスループットの点で潜在的に優れたパフォーマンスを提供するために作成されました。
go-mmproxy
は、HAProxy の PROXY プロトコル (NGINX などの他のプロジェクトでも採用されている) をアンラップして、エンド サーバーへのネットワーク接続がプロキシ サーバーの代わりにクライアントの IP アドレスとポート番号から行われるようにするスタンドアロン アプリケーションです。これらは基本的なメカニズムを共有しているため、mmproxy に関する Cloudflare のブログ投稿は、 go-mmproxy
内部でどのように動作するかについての優れた記事として機能します。
go install github.com/path-network/go-mmproxy@latest
go-mmproxy
バイナリをビルドするには、少なくともgo 1.21
必要です。パッケージマネージャーに十分な新しいバージョンの golang が含まれていない場合は、「Go の入門」を参照してください。
go-mmproxy
実行する必要があります。
IP_TRANSPARENT
ソケットのオプションを設定できるCAP_NET_ADMIN
機能を使用してください。 ループバックから発信されたすべてのトラフィックをループバックにルーティングします。
ip rule add from 127.0.0.1/8 iif lo table 123
ip route add local 0.0.0.0/0 dev lo table 123
ip -6 rule add from ::1/128 iif lo table 123
ip -6 route add local ::/0 dev lo table 123
--mark
オプションがgo-mmproxy
に指定されている場合、ループバック インターフェイスにルーティングされるすべてのパケットにマークが設定されます。これは、ループバックからのトラフィックをマシンの外部にルーティングする必要がある場合など、iptables を使用してより高度なルーティング ルールを設定するために使用できます。
UDP はコネクションレス型であるため、ソケットが0.0.0.0
にバインドされている場合、カーネル スタックは、元のパケットの受信元インターフェイスを単に使用するのではなく、スプーフィングされた送信元アドレスに応答を送信するためにインターフェイスを検索します。見つかったインターフェイスはループバック インターフェイスではない可能性が高いため、上記で指定したルールが回避されます。これを修正する最も簡単な方法は、エンドサーバーのリスナーを127.0.0.1
(または::1
) にバインドすることです。これは、非プロキシ接続の受信を避けるためにも一般的に推奨されます。
Usage of ./go-mmproxy:
-4 string
Address to which IPv4 traffic will be forwarded to (default "127.0.0.1:443")
-6 string
Address to which IPv6 traffic will be forwarded to (default "[::1]:443")
-allowed-subnets string
Path to a file that contains allowed subnets of the proxy servers
-close-after int
Number of seconds after which UDP socket will be cleaned up (default 60)
-l string
Address the proxy listens on (default "0.0.0.0:8443")
-listeners int
Number of listener sockets that will be opened for the listen address (Linux 3.9+) (default 1)
-mark int
The mark that will be set on outbound packets
-p string
Protocol that will be proxied: tcp, udp (default "tcp")
-v int
0 - no logging of individual connections
1 - log errors occurring in individual connections
2 - log all state changes of individual connections
呼び出しの例:
sudo ./go-mmproxy -l 0.0.0.0:25577 -4 127.0.0.1:25578 -6 [::1]:25578 --allowed-subnets ./path-prefixes.txt
ベンチマークは、Intel Core i9-8950HK CPU @ 2.90 GHz (12 論理コア) を搭載した Dell XPS 9570 で実行されました。プロキシがトラフィックを送信するアップストリーム サービスは、bpf-echo サーバーによって模擬されました。トラフィックは tcpkali v1.1.1 によって生成されました。
すべてのケースで次のコマンドが負荷生成に使用されました (50 接続、実行時間 10 秒、接続ごとに PROXYv1 ヘッダーを送信、TCP メッセージとしてPINGrn
使用):
tcpkali -c 50 -T 10s -e1 'PROXY TCP4 127.0.0.1 127.0.0.1 {connection.uid} 25578rn' -m 'PINGrn' 127.0.0.1:1122
⇅Mbps | ↓ Mbps | ↑ Mbps | ↓ パケット/秒 | ↑ パケット/秒 | |
---|---|---|---|---|---|
クラウドフレア/MMプロキシ | 1524.454 | 756.385 | 768.069 | 70365.9 | 65921.9 |
go-mmproxy GOMAXPROCS=1 | 7418.312 | 2858.794 | 4559.518 | 262062.7 | 391334.6 |
go-mmproxy | 45483.233 | 16142.348 | 29340.885 | 1477889.6 | 2518271.5 |
プロキシなし | 52640.116 | 22561.129 | 30078.987 | 2065805.4 | 2581621.3 |