Сам себе прокси-сервер

29 июня 2016. Комментарии .

Описаны три способа превращения своей удаленной машины в прокси-сервер. Все это в разное время я узнал от hombit. Свой удаленный сервер можно получить, к примеру, за 200₽/месяц у vscale (ссылка с моим промокодом). На момент написания записи через vscale можно выходить в мир. Обновлено в июле 2018.

Оглавление #

SSH-туннель #

Не требуется установка программ. Подойдет как временное быстрое решение для компьютера. Чтобы проложить туннель через удаленную машину, выполните на своем компьютере:

user 
ssh -D 2222 username@hostname.com -N

-D позволяет использовать порт 2222, -N запрещает выполнять команды на сервере.

Если пароль введен или не требуется, то должно сложиться впечатление, что команда находится в процессе выполнения. Оставляйте терминал в этом состоянии и в мессенджере или браузере выставляйте настройки Proxy. Надо указать:

Имя пользователя и пароль указывать не надо.

В браузере Firefox, например, это можно сделать так: Настройки → Дополнительные → Сеть; в пункте «Соединение» нажимаете «Настроить», «Ручные настройки прокси», HTTP Прокси: localhost, Порт: 2222. Также надо поставить галочку «Использовать этот прокси-сервер для всех протоколов».

В браузере Chrome нужно выбрать Настройки → Дополнительно → Сеть → Прокси. В Linux браузер может показать такое сообщение:

When running Google Chrome under a supported desktop environment, the system proxy settings will be used. However, either your system is not supported or there was a problem launching your system configuration.

But you can still configure via the command line. Please see man google-chrome-stable for more information on flags and environment variables.

Если в самом браузере настройку выполнить нельзя, то можно запустить его таким образом (это должна быть новая сессия, то есть до выполнения команды браузер должен быть закрыт):

user $
google-chrome --proxy-server="socks://localhost:2222"

Аналогично можно запустить и браузер Opera:

user $
opera --proxy-server="socks://localhost:2222"

Если хочется запустить команду в фоне, достаточно добавить ключ -f:

user $
ssh -f -D 2222 username@hostname.com -N

После выполнения этой команды терминал можно будет закрыть.

3proxy и аналоги #

На удаленную машину устанавливается прокси-сервер, и вы подключаетесь к желаемому пункту назначения через этот сервер.

Следуйте, например, инструкции по установке и настройке прокси-сервера 3proxy. Обратите внимание на последнюю строку в файле /etc/3proxy/3proxy.cfg (шаг 4 в инструкции). Указано proxy -n -p3128 -a, то есть использоваться будет HTTP-прокси на порту 3128, а не SOCKS5-прокси. Чтобы изменить тип прокси и порт, можно в последней строке указать, например, socks -p1111.

Существуют и другие прокси-серверы, например, Squid, tinyproxy. Все они позволяют использовать SOCKS5 прокси, подключаясь к своей удаленной машине. Общий недостаток всех этих методов — логин и пароль передаются в незашифрованном виде, то есть при перехвате трафика они доступны злоумышленнику.

На всякий случай максимально кратко скопирую выжимку по установке 3proxy в Ubuntu из инструкции по ссылке выше.

root #
apt-get install -y build-essential nano wget tar gzip

На июль 2018 последний релиз версии 0.8.12, проверьте.

user 
user
user
user
cd ~
wget --no-check-certificate https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz
tar xzf 0.8.12.tar.gz
cd ~/3proxy-0.8.12
root #
root #
root #
root #
make -f Makefile.Linux
mkdir /etc/3proxy
cp ~/3proxy-0.8.12/src/3proxy /usr/bin/
adduser --system --no-create-home --disabled-login --group proxy3

Редактируйте файл /etc/3proxy/3proxy.cfg. Значения setgid и setuid можно узнать командой id proxy3. Значения nserver можно посмотреть в /etc/resolv.conf. Последняя строка указывает тип прокси socks и порт 5780.

/etc/3proxy/3proxy.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
setgid 115
setuid 109
# see /etc/resolv.conf
nserver 188.93.16.19
nserver 188.93.17.19
nscache 65536
timeouts 1 5 30 60 180 1800 15 60
users $/etc/3proxy/.proxyauth
daemon
log /var/log/3proxy/3proxy.log D
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
auth cache strong
socks -p5780

Создайте файл /etc/3proxy/.proxyauth, указав нужные username и password (пользователь — это не user на машине linux, это для подключения к proxy, так что имя и пароль могут быть любые).

/etc/3proxy/3proxy.cfg
1
username:CL:password
root #
root #
root #
root #
root #
root #
chown proxy3:proxy3 -R /etc/3proxy
chown proxy3:proxy3 /usr/bin/3proxy
chmod 444 /etc/3proxy/3proxy.cfg
chmod 400 /etc/3proxy/.proxyauth
mkdir /var/log/3proxy
chown proxy3:proxy3 /var/log/3proxy

Запустить можно так:

root #
/usr/bin/3proxy /etc/3proxy/3proxy.cfg

Для автозагрузки в systemd можно сделать такой корявый сервис в /etc/systemd/system/3proxy:

/etc/systemd/system/3proxy
1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=start 3proxy

[Service]
Type=oneshot
ExecStart=/usr/bin/3proxy /etc/3proxy/3proxy.cfg
ExecStop=/usr/bin/killall 3proxy
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Перезагрузите daemons:

root #
systemctl daemon-reload

Запустите сервис и проверьте статус:

root #
root #
systemctl restart 3proxy.service
systemctl status 3proxy.service

Последняя команда должна возвращать active. Если все в порядке, то добавьте в автозагрузку:

root #
systemctl enable 3proxy.service

MTProxy для Telegram #

Протокол MTProto для Telegram позволяет использование шифрования при передаче логина и пароля. Приложение надо обновить до версии 4.8.8 и новее. Можно либо собрать из исходников (очень просто, по ссылке подробная инструкция), либо установить с помощью официального Docker контейнера. На всякий случай скопирую команды для Debian/Ubuntu + systemd, но лучше смотрите официальную инструкцию.

root #
apt install git curl build-essential libssl-dev zlib1g-dev
user $
user $
user $
user $
user $
user $
user $
git clone https://github.com/TelegramMessenger/MTProxy
cd MTProxy
make && cd objs/bin
curl -s https://core.telegram.org/getProxySecret -o proxy-secret
curl -s https://core.telegram.org/getProxyConfig -o proxy-multi.conf
head -c 16 /dev/urandom | xxd -ps
./mtproto-proxy -u nobody -p 8888 -H 443 -S <secret> --aes-pwd proxy-secret proxy-multi.conf -M 1

В последней команде замените <secret> на вывод предыдщей команды (head...), а 443 на другой порт (если на этом сервере 443 уже используется).

Для автозапуска после перезагрузки можно создать сервис в systemd, создав файл /etc/systemd/system/MTProxy.service. Вот пример моего файла (использую порт 5780, не забудьте поменять /home/user/MTProxy и <secret>).

/etc/systemd/system/MTProxy.service
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=MTProxy
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/user/MTProxy
ExecStart=/home/user/MTProxy/objs/bin/mtproto-proxy -u nobody -p 8888 -H 5780 -S <secret> --aes-pwd /home/user/MTProxy/objs/bin/proxy-secret /home/user/MTProxy/objs/bin/proxy-multi.conf -M 1
Restart=on-failure

[Install]
WantedBy=multi-user.target

Перезагрузите daemons:

root #
systemctl daemon-reload

Запустите сервис и проверьте статус:

root #
root #
systemctl restart MTProxy.service
systemctl status MTProxy.service

Последняя команда должна возвращать active. Если все в порядке, то добавьте в автозагрузку:

root #
systemctl enable MTProxy.service