В свете огромной вероятности блокировки telegram в ближайшее время возник вопрос в установке и использовании Dante в качестве сервера Socks5 на Ubuntu 16.
Большая часть инфы нагло взята из офф. доки и отсюда.
Не забываем про теорию
Proxy – может использоваться по разному, например для логгирования клиентских запросов в компании, ограничения доступа (хех) или наоборот, обхода ограничения, блокировки определенного контента.
Reverse proxy – может использоваться для отказоустойчивости/балансировки/кеширования перед backend web-серверами или для доступа во внутренние ресурсы без использования VPN (часто используемый подход для доступа в интранет – в том числе с авторизацией по паролю/сертификату/токену на этом сервере). Поддерживается всеми крупными проектами – nginx, haproxy, apache. Ставится reverse proxy обычно между двумя firewall (ну или по крайней мере после вашего единственного или можно router on a stick).
Ставим
Cтавим из пакета т.к. в репозитории старая версия, которая плохо работает при необходимости авторизации (подробнее в ссылке выше).
wget http://ppa.launchpad.net/dajhorn/dante/ubuntu/pool/main/d/dante/dante-server_1.4.1-1_amd64.deb sudo apt-get install gdebi-core sudo gdebi dante-server_1.4.1-1_amd64.deb
Базово настраиваем
vi /etc/danted.conf
# /etc/danted.conf logoutput: syslog user.privileged: root user.unprivileged: nobody # The listening network interface or address. internal: 0.0.0.0 port=3321 internal: 0.0.0.0 port=1080 # можно указать несколько портов, по умолчанию 1080 # The proxying network interface or address. external: eth0 # socks-rules determine what is proxied through the external interface. # The default of "none" permits anonymous access. socksmethod: username # client-rules determine who can connect to the internal interface. # The default of "none" permits anonymous access. clientmethod: none client pass { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect disconnect error } socks pass { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect disconnect error }
Создаем пользователя
adduser testuser
Включаем сервис, добавляем в автозагрузку
service danted start service danted enable
Немного о авторизации
Методы:
- socksmethod: none – proxy без авторизации. Очень полезен для работы в браузерах – по умолчанию IE/Firefox/Chrome не умеют работать с SOCKS5 proxy с авторизацией.
- socksmethod: username – авторизация по наличию учетки на сервере. Причем username не должен быть заблокирован (sudo passwd -l testuser то есть не используем). Если пользователь новый и не должен ходить на сервер, то делаем ему nologin, во избежание (sudo usermod -s /usr/sbin/nologin testuser, проверяем через sudo -i -u testuser).
Apr 13 18:18:11 ip-172-31-17-248 danted[5997]: info: pass(1): tcp/accept [: 111.215.123.135.45629 0.0.0.0.33231 Apr 13 18:18:12 ip-172-31-17-248 danted[5997]: warning: passwordcheck(): Strange. This should not happen: system password crypt(3) failed for user "testuser": Invalid argument
- socksmethod: pam – по радиусу.
Если нужно сделать разные методы авторизации в зависимости от сети (например, всем ходить с паролями, а откуда то можно подключаться без авторизации), то для начала нужно указать в перечне используемых методов авторизации все, иначе будет ругаться.
socksmethod: username none Apr 26 13:19:39 ip-172-31-17-248 danted[12152]: error: /etc/danted.conf: problem on line 29 near token "}": method "none" is set in the rule, but not in the global socksmethod s Apr 26 13:19:39 ip-172-31-17-248 danted[12152]: alert: mother[1/1]: shutting down Apr 26 13:19:39 ip-172-31-17-248 danted[12147]: Starting Dante SOCKS daemon: Apr 26 13:19:39 ip-172-31-17-248 systemd[1]: danted.service: Control process exited, code=exited status=1 Apr 26 13:19:39 ip-172-31-17-248 systemd[1]: Failed to start LSB: SOCKS (v4 and v5) proxy daemon (danted).
Далее в конкретном правиле socks указать используемый тип.
socks pass { from: 85.20.101.72/32 to: 0.0.0.0/0 log: connect disconnect error socksmethod: none } socks pass { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect disconnect error socksmethod: username }
bandwidth
Описание работы и ограничение в офиц. доке
Проблема в том, что функционал лицензируемый (400$) и dante сервис не запустится без лицензии.
Можно сделать ограничение через wondershaper, trickle или tc.
Ограничение использованием только для Telegram
Обычно делают (1,2) через правила разрешения/запрещения типа ниже:
pass { from: 0.0.0.0/0 to: 91.108.4.0/22 } pass { from: 0.0.0.0/0 to: 91.108.8.0/22 } pass { from: 0.0.0.0/0 to: 91.108.12.0/22 } pass { from: 0.0.0.0/0 to: 91.108.16.0/22 } pass { from: 0.0.0.0/0 to: 91.108.20.0/22 } pass { from: 0.0.0.0/0 to: 91.108.36.0/23 } pass { from: 0.0.0.0/0 to: 91.108.38.0/23 } pass { from: 0.0.0.0/0 to: 91.108.56.0/22 } pass { from: 0.0.0.0/0 to: 109.239.140.0/24 } pass { from: 0.0.0.0/0 to: 149.154.172.0/22 } pass { from: 0.0.0.0/0 to: 149.154.160.0/22 } pass { from: 0.0.0.0/0 to: 149.154.162.0/22 } pass { from: 0.0.0.0/0 to: 149.154.164.0/22 } pass { from: 0.0.0.0/0 to: 149.154.168.0/22 } pass { from: 0.0.0.0/0 to: 149.154.172.0/22 } pass { from: 0.0.0.0/0 to: 149.154.172.0/22 } block { from: 0.0.0.0/0 to: 0.0.0.0/0 } # не обязательно, по умолчанию если клиент не подпадает ни под одно из rules pass он блокируется
Но мне такой способ не нравится т.к. IP для русских пользователей мигрируют. Лучше указать помимо IP домены telegram, как сделали тут:
# AS62041 socks pass { from: 0.0.0.0/0 to: 149.154.160.0/20 } socks pass { from: 0.0.0.0/0 to: 149.154.164.0/22 } socks pass { from: 0.0.0.0/0 to: 91.108.4.0/22 } socks pass { from: 0.0.0.0/0 to: 91.108.8.0/22 } socks pass { from: 0.0.0.0/0 to: 91.108.56.0/22 } socks pass { from: ::/0 to: 2001:67c:4e8::/48 } # AS44907 socks pass { from: 0.0.0.0/0 to: 91.108.20.0/22 } socks pass { from: 0.0.0.0/0 to: 91.108.36.0/23 } socks pass { from: 0.0.0.0/0 to: 91.108.38.0/23 } socks pass { from: ::/0 to: 2001:b28:f23c::/48 } # AS62014 socks pass { from: 0.0.0.0/0 to: 149.154.168.0/22 } socks pass { from: 0.0.0.0/0 to: 91.108.16.0/22 } socks pass { from: 0.0.0.0/0 to: 91.108.56.0/23 } socks pass { from: ::/0 to: 2001:b28:f23f::/48 } # AS59930 socks pass { from: 0.0.0.0/0 to: 149.154.172.0/22 } socks pass { from: 0.0.0.0/0 to: 91.108.12.0/22 } socks pass { from: ::/0 to: 2001:b28:f23d::/48 } # Other socks pass { from: 0.0.0.0/0 to: 149.154.167.0/22 } socks pass { from: 0.0.0.0/0 to: 149.154.174.0/22 } socks pass { from: 0.0.0.0/0 to: .telegram.org } socks pass { from: 0.0.0.0/0 to: .stel.com } socks pass { from: 0.0.0.0/0 to: .t.me } socks pass { from: 0.0.0.0/0 to: .telegram.me } socks pass { from: 0.0.0.0/0 to: .telegram.dog } socks pass { from: 0.0.0.0/0 to: .telegra.ph }
Если при этом хотим сохранить авторизацию и логгирование + добавить в последнюю строку “explicit deny” с логгированием – нам поможет sh-скрипт на вышестоящий список в файле <file>:
cat <file> | while read str; do echo $str; done | grep from | awk '{print $4,$5,$6,$7}' | while read range; do echo "socks pass {"; echo " $range"; echo " log: connect disconnect error"; echo " socksmethod: username"; echo "}"; done ; echo "socks block {"; echo " from: 0.0.0.0/0 to: 0.0.0.0/0"; echo " log: connect disconnect error"; echo " socksmethod: username"; echo "}"
Так же для работы звонков т.к. они p2p понадобится разрешение UDP, но я не стал:
socks pass { from: 0.0.0.0/0 to: 0.0.0.0/0 command: udpreply log: connect disconnect error socksmethod: username }
Проверка работы
Проще всего проверить работу PROXY можно через curl. Аналогично проверяем если сделали ограничение работы только на определенные IP (telegram) – должно отбивать Can’t complete SOCKS5 connection при попытке подключения на IP, отсутствующие в разрешении.
curl -v -x socks5://11.146.29.66:33231 http://www.google.com/ # Без авторизации curl -v -x socks5://testuser:testuser@11.146.29.66:33231 http://www.google.com/ # С авторизацией
Логи
Последние можно посмотреть в статусе сервиса
sudo service danted status
Все логи можно посмотреть тут /var/log/syslog (определяется переменной logoutput в конфиге):
Apr 13 18:54:03 ip-172-31-17-248 danted[5579]: info: pass(1): tcp/accept ]: 684 -> 188.215.163.135.45717 0.0.0.0.33231 -> 322: local client closed. Session duration: 40s Apr 13 18:54:08 ip-172-31-17-248 danted[5579]: info: pass(1): tcp/connect ]: 267 -> username%testuser@128.61.117.217.57802 0.0.0.0.33231 -> 443, 443 -> 172.31.17.248.57802 119.153.163.2.443 -> 267: remote peer closed. Session duration: 769s
Количество сессий можно посмотреть через netstat фильтром по порту:
netstat -na | grep ":33231" | awk '{print $5}' | awk -F':' '{print $1}' | sort -u | wc -l
Смотрим откуда они подключены:
netstat -na | grep ":33231" | awk '{print $5}' | awk -F':' '{print $1}' | sort -u | while read ip; do echo $ip; whois $ip | grep address:; done >res.txt