Установка и использование Dante в качестве сервера Socks5 на Ubuntu 16

Множество вариантов проще описанного ниже – деплой своего прокси/VPN сервера это вариант не для простых пользователей.

В свете огромной вероятности блокировки 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

Leave a Reply