Создание и настройка SOCKS5 прокси сервера в Ubuntu
Для ускорения работы с некоторыми программами и парсерами, которые я использую, требуются прокси, сначала я арендовал их, но потом решил поднять свои SOKS5 прокси сервера на уже имеющихся серверах с сайтами.
На всех серверах стоит Ubuntu Server 14.04, может где-то и 12.04, но описание должно подойти и для всех остальных систем основанных на Debian.
Есть 2 известных мне способа организации работы SOKS5 сервера:
- SOCKS через SSH. Этот способ удобен своей простотой но неудобен при частом использовании, или использовании с разных машин;
- Установка SOCKS сервера. При использовании этого способа уйдет чуть больше времени на первоначальную настройку, но потом пользоваться прокси будет быстрее и удобнее.
SOCKS через SSH
Для того чтоб поднять SOCKS5 через SSH нужен только доступ к SSH сервера.
Вводим в терминале или SSH клиенте (PuTTY для Windows)
Если запросит пароль, то нужно ввести пароль от SSH сервера.
-D – указывает порт по которому будет доступен SOKS5 сервер
Все, после этого вы можете подключиться к SOKS5 серверу по адресу localhost:1080 или 127.0.0.1:1080
Такой способ удобен тем что не нужно ничего дополнительно устанавливать и настраивать. Но перед каждым подключением или после разрыва ssh соединения, например из-за проблем с интернетом придется заново вводить эту команду.
Установка SOCKS сервера
Я знаю 2 SOCKS сервера 3proxy и Dante. У себя использовал Dante Server его настройку и опишу.
Установить Dante сервер можно с помощью apt-get, по умолчанию устанавливается старая версия (v.1.1). Ниже будут настройки для старой и новой (v.1.4) версий.
Установка новой версии Dante Server
sudo apt-get update sudo apt-get install software-properties-common python-software-properties sudo add-apt-repository ppa:dajhorn/dante sudo apt-get update sudo apt-get install dante-server
После этих действий Dante Server будет установлен, но ругнется и не сможет запуститься, видимо дефолтные настройки имеют ошибку.
Далее нужно отредактировать файл настроек
Приведя его к такому виду
logoutput: syslog /var/log/danted.log internal: eth0 port = 1080 external: eth0 socksmethod: username user.privileged: root user.unprivileged: nobody client pass < from: 0.0.0.0/0 to: 0.0.0.0/0 log: error >socks pass < from: 0.0.0.0/0 to: 0.0.0.0/0 command: connect log: error method: username >
- указываем лог файл который будет находиться по адресу /var/log/danted.log;
- eth0 — сетевой интерфейс на котором висит внешний IP сервера, узнать его можно воспользовавшись командой ifconfig, либо можно просто указать свой внешний IP вместо названия интерфейса;
- порт для SOKS5 прокси – 1080;
- socksmethod — метод авторизации. username — авторизация с указанием логина и пароля системных пользователей. Можно указать none если вы хотите не использовать авторизацию, но не советую оставлять открытым для порт для прокси т.к. сканеры прокси не дремлют, и у меня через открытый порт начали спам рассылать, после чего мне хостер отписал что у моего IP идет спам и надо что-то решать, можно использовать не дефолтный порт а какой-то другой, это позволит отсрочить нахождения вашего прокси сканерами;
- user.privileged — имя пользователя с расширенными правами;
- user.unprivileged — имя пользователя с обычными правами (как я понял dante работает от имени этих пользователей в зависимости от того какими правами нужно обладать для выполнения операции).
После сохранения настроек нужно перезагрузить Dante
sudo service danted restart
Все, теперь к SOKS5 прокси можно подключиться с любого устройства, указав IP сервера, порт – 1080, и данные для авторизации (имя и пароль пользователей которые зарегистрированы на сервере).
Я для доступа к прокси создал отдельного пользователя и указываю его данные. Создавал командой
sudo useradd -m soksuser && sudo passwd soksuser
Где soksuser – имя создаваемого пользователя.
Установка старой версии Dante Server
sudo apt-get update sudo apt-get install dante-server
Далее нужно отредактировать файл настроек
Приведя его к такому виду
logoutput: syslog /var/log/danted.log internal: eth0 port = 1085 external: eth0 method: username user.privileged: root user.notprivileged: nobody client pass < from: 0.0.0.0/0 to: 0.0.0.0/0 log: error >pass < from: 0.0.0.0/0 to: 0.0.0.0/0 command: connect log: error method: username >
Дальше все так-же как и в новой версии о которой я писал выше.
ошибка в итоге
Job for danted.service failed because the control process exited with error code. See «systemctl status danted.service» and «journalctl -xe» for details.
Использование HTTP proxy и SOCKS в Linux
В Linux существует много полезных консольных команд, которые при необходимости хотелось бы запустить через proxy. Некоторые приложения имеют встроенную поддержку proxy, а некоторые нет. Далее описано как пользоваться востребованными утилитами через proxy, даже теми, которые этой поддержки не имеют.
curl: передача данных через proxy
curl имеет полноценную поддержку как HTTP proxy так и SOCKS.
Для тестирования возможно использовать proxy сервера из бесплатных списков (socks — sockslist.net, и HTTP proxy — proxyhttp.net). Проверка IP адреса будет производиться с помощью ресурса check-host.net
# Проверить HTTP proxy
curl —proxy 11.22.33.44:5555 check-host.net/ip
# Тоже самое, но если для HTTP proxy требуется авторизация
curl —proxy 11.22.33.44:5555 -U username:password check-host.net/ip
# Проверить socks4
curl —socks4 11.22.33.44:5555 check-host.net/ip
# Проверить socks5
curl —socks5 11.22.33.44:5555 check-host.net/ip
# Тоже самое, только преобразование имен идет также через SOCKS
# (подробнее о преобразовании имен можно прочитать ниже в подразделе «DNS запросы через proxy»)
curl —socks5-hostname 11.22.33.44:5555 check-host.net/ip
Часть параметров curl можно записать в файл ~/.curlrc:
socks5 = 11.22.33.44:5555
proxy-user = username:password
user-agent = «Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1»
С помощью time и curl также можно замерить время отклика сервера:
# Без proxy:
time curl check-host.net/ip
# С proxy:
time curl —socks5 11.22.33.44:5555 check-host.net/ip
# Или любого сайта:
time curl habrahabr.ru
Результат будет выглядеть так:
real 0m0.307s
user 0m0.000s
sys 0m0.004s
wget: закачка файлов через proxy
wget имеет встроенную поддержку proxy. Недостаток лишь в том, что только поддержку HTTP proxy. Для использования совместно с SOCKS рекомендуется использовать соксификатор dante.
# Скачать файл через proxy:
http_proxy=»http://33.22.44.44:8080″ wget http://www.google.com/favicon.ico
Тоже самое, но для HTTPS
https_proxy=»http://33.22.44.44:8080″ wget https://www.google.com/favicon.ico
# Использовать proxy с авторизацией
http_proxy=»http://33.22.44.44:8080″ wget —proxy-user=user —proxy-password=password http://www.google.com/favicon.ico
Чтобы все время не указывать —proxy-user и —proxy-password можно их прописать в файл ~/.wgetrc:
proxy-user = username
proxy-password = password
user-agent = Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
ssh: доступ к серверам
Для доступа к серверам через ssh и proxy также лучше использовать соксификатор dante.
apt-get install dante-client # пример для Debian-based систем
# Если требуется зайти по ssh на сервер
SOCKS_PASSWORD=»» SOCKS_SERVER=»11.22.33.44:1080″ socksify ssh myserver
# Тоже самое, только если для подключения к соксу требуется авторизация
SOCKS_USERNAME=»user» SOCKS_PASSWORD=»password» SOCKS_SERVER=»11.22.33.44:1080″ socksify ssh myserver
# Пример с использованием IRC клиента — irssi
SOCKS_PASSWORD=»» SOCKS_SERVER=»11.22.33.44:1080″ socksify irssi
# Тоже самое, только с использованием HTTP proxy с поддержкой метода CONNECT
HTTP_CONNECT_PROXY=»http://11.22.33.44:8080″ socksify irssi
С помощью socksify можно направить через proxy почти любое приложение, не только консольное.
Чтобы все время не вводить данные о proxy можно создать файл /etc/socks.conf
Пример для SOCKS:
route <
from: 0.0.0.0/0 to: 0.0.0.0/0 via: 11.22.33.44 port = 55555
protocol: tcp udp
proxyprotocol: socks_v4 socks_v5
method: none
>
Пример для HTTP proxy с авторизацией:
route <
from: 0.0.0.0/0 to: 0.0.0.0/0 via: 11.22.33.44 port = 8080
command: connect
proxyprotocol: http
method: username
>
А также экспортировать переменные SOCKS_USERNAME и SOCKS_PASSWORD, если для SOCKS или HTTP proxy требуется авторизация:
export SOCKS_USERNAME=»username»
export SOCKS_PASSWORD=»password»
DNS запросы через proxy
Часто требуется чтобы и преобразование имен происходило через proxy. Если использовать dante, то запрос на преобразование имен идет и через proxy, и через именной сервер указанный в /etc/resolv.conf . Понять почему же идет два одинаковых запроса вместо одного не удалось. Поэтому можно предложить два варианта:
1) Закомментировать именные сервера в файле /etc/resolv.conf, чтобы преобразование имен шло только через proxy. Это отразится на всей системе.
2) Изменить /etc/resolv.conf и выставить именные сервера необходимой страны, или просто отличные от серверов провайдера. Например установить сервера Google:
nameserver 8.8.8.8
nameserver 8.8.4.4
Чтобы данные не были перезаписаны именными серверами провайдера (при переподключении), можно запретить обновление списка именных серверов сетевому менеджеру (NetworkManager/wicd) или DHCP-клиенту (спасибо ergil за корректировку).
Или воспользоваться «грубым» методом — запрещением изменения файла /etc/resolv.conf:
sudo chattr +i /etc/resolv.conf
Если есть какие-то дополнения, пожалуйста, напишите, это будет полезно узнать и применить.