Pull to refresh

Прозрачное Socks5 проксирование приложений в linux

Configuring Linux *
Потребовалось мне как-то запустить игру, которая запускается под wine, через прокси. Поднял ssh-туннель, запустил игру через proxychains, и… игра не смогла соединиться с сервером, хотя chromium без проблем работал и показывал ip прокси. Попробовал tsocks — игра вообще не запустилась. Можно, конечно, было настроить VPN-туннель с помощью того же ssh, но сервер — VPS, под OpenVZ, у которого по умолчанию выключен TUN, что привело бы к письму в техподдержку и ожиданию.
Итак, пятиминутное гугление привело меня к заброшенному проекту Transocks, который, в отличие от proxychains и tsocks, которые подгружают свои библиотеки и перехватывают сетевые вызовы, слушает определенный порт и перенаправляет все, что в него пришло, через socks4 прокси. К сожалению, transocks у меня не собрался, и я начал гуглить дальше. Оказывается, у проекта есть два форка: transocks_ev на c и transocks_em на ruby. Первый поддерживает Socks5, не поддерживает авторизацию и UDP. Второй же поддерживает Socks5, UDP, *BSD, но тоже, вроде бы, не поддерживает авторизацию(не нашел в коде, а документации нет). Так как UDP мне не нужно, я остановился на transocks_ev.

Сборка


Собрать transocks_ev очень просто: достаточно скачать Makefile и transocks_ev.c со страницы проекта, установить libevent и выполнить
make
У нас появился бинарник transocks_ev
tranSOCKS-ev - libevent-based transparent SOCKS5-Proxy
Usage: ./transocks_ev [-f] [-p Port] [-H IP-Address] [-s port] [-S IP-Address]

-f Do not fork into background upon execution
-p Bind our server-socket to this port
-H Listen on this IP-Address for incomming connections
-s Expect SOCKS5-Server on this Port
-S Expect SOCKS5-Server on this IP-Address


Так как я поднимал ssh-туннель на порту 4441, запускаю transocks_ev с такими параметрами:
./transocks_ev -p 4445 -H 127.0.0.1 -s 4441 -S 127.0.0.1
Теперь у нас на порту 4445 висит сервер, который будет пускать все запросы через наш socks5. Немного похоже на NAT, только на определенном порту.

Настройка


Перенаправлять пакеты будем с помощью iptables. Я решил сделать подобие proxychains, чтобы можно было запустить любое приложения через прокси, а не просто проксирование по адресу или порту(хотя для игры сгодится и оно).
Создаем новую группу proxified:
sudo groupadd proxified
Редактируем /etc/sudoers так, чтобы мы могли запускать приложения под этой группой. Должно быть что-то вроде этого:
valdikss ALL=(ALL:ALL) ALL

Теперь перейдем к настройкам iptables.
sudo iptables -t nat -I OUTPUT -m owner --gid-owner proxified -p tcp -j REDIRECT --to-ports 4445
Эта команда будет перенаправлять все пакеты от приложений с группой proxified на transocks сервер.

Запуск


Запускаем приложение с группой proxified
sudo -g proxified chromium-browser

Вот и всё. Этот метод может быть использован для гарантированной проксификации всей системы, либо даже для прозрачной проксификации на роутере. Если вам нужно использовать прокси с аутентификацией, то установите 3proxy локально и укажите в нем ваш прокси как прокси сервер верхнего уровня.
Tags:
Hubs:
Total votes 44: ↑43 and ↓1 +42
Views 22K
Comments Comments 17