Это повторная реализация mmproxy на Go, созданная для улучшения стабильности выполнения mmproxy, обеспечивая при этом потенциально большую производительность с точки зрения соединения и пропускной способности пакетов.
go-mmproxy
— это автономное приложение, которое реализует протокол PROXY HAProxy (также принятый в других проектах, таких как NGINX), так что сетевое соединение с конечным сервером происходит с IP-адреса и номера порта клиента, а не с прокси-сервера. Поскольку они используют общие базовые механизмы, сообщение в блоге Cloudflare о mmproxy служит отличным описанием того, как go-mmproxy
работает под капотом.
go install github.com/path-network/go-mmproxy@latest
Вам понадобится как минимум go 1.21
для сборки двоичного файла go-mmproxy
. См. раздел «Начало работы с Go», если ваш менеджер пакетов не поддерживает достаточно новую версию golang.
go-mmproxy
необходимо запустить:
CAP_NET_ADMIN
, чтобы иметь возможность установить опцию сокета IP_TRANSPARENT
. Направьте весь трафик, исходящий из шлейфа, обратно в шлейф:
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
Тест проводился на Dell XPS 9570 с процессором Intel Core i9-8950HK @ 2,90 ГГц (12 логических ядер). Восходящая служба, на которую прокси-сервер отправлял трафик, была имитирована сервером bpf-echo. Трафик был сгенерирован tcpkali v1.1.1.
Во всех случаях для генерации нагрузки использовалась следующая команда (50 подключений, время выполнения 10 с, отправка заголовка PROXYv1 для каждого соединения, использование PINGrn
в качестве TCP-сообщения):
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
⇅ Мбит/с | ↓ Мбит/с | ↑ Мбит/с | ↓ пкт/с | ↑ пкт/с | |
---|---|---|---|---|---|
облачная вспышка/ммпрокси | 1524,454 | 756,385 | 768,069 | 70365.9 | 65921,9 |
go-mmproxy GOMAXPROCS=1 | 7418.312 | 2858,794 | 4559,518 | 262062.7 | 391334.6 |
го-ммпрокси | 45483.233 | 16142.348 | 29340.885 | 1477889,6 | 2518271.5 |
нет прокси | 52640.116 | 22561.129 | 30078.987 | 2065805.4 | 2581621.3 |