Dante. Установка и настройка прокси-сервера

01.03.2024

Теги: LinuxКлиентКонфигурацияНастройкаСерверСокетУстановка

Хотя прокси-серверы очень похожи по своей функции на VPN, они имеют одно существенное отличие — трафик не шифруется, то есть уровень обеспечения безопасности ниже. Несмотря на это, прокси-серверы активно используют, так как этот метод позволяет скрыть свой ip-адрес и фактическое местоположение.

Установка и настройка

Установка пакета SOCKS сервера Dante

$ sudo apt install dante-server

Добавляем службу в автозагрузку

$ sudo systemctl enable dante-server

Редактируем файл конфигурации

$ sudo nano /etc/danted.conf
#
# ОБЩИЕ НАСТРОЙКИ СЕРВЕРА
#

# Все сообщения будут записываться в системный лог syslog
logoutput: syslog

# Прослушивать клиентов на интерфейсе eth0 на порту 8888
internal: eth0 port = 8888
# Отправлять запросы клиентов во внешний мир через eth0
external: eth0

# Для прослушивания сокета привилегий не нужно, достаточно nobody
user.unprivileged: nobody

# Аутентификации не будет, потому что разрешены только два ip-адреса
clientmethod: none
socksmethod: none
#
# ПРАВИЛА ДЛЯ ДОСТУПА КЛИЕНТОВ К СЕРВЕРУ
#

# Эти правила определяют доступ к прокси-серверу, они применяются
# еще до того, как какие-либо данные будут получены от клиента.
# Прокси-сервер по умолчанию блокирует все входящие соединения
# клиентов, поэтому необходимо создать хотя бы одно правило.

# разрешается доступ клиенту с ip-адресом 111.111.111.111 куда угодно
client pass {
    from: 111.111.111.111/32 to: 0.0.0.0/0
    log: error # connect disconnect
}

# разрешается доступ клиенту с ip-адресом 222.222.222.222 куда угодно
client pass {
    from: 222.222.222.222/32 to: 0.0.0.0/0
    log: error # connect disconnect
}
#
# ПРАВИЛА ПРОХОЖДЕНИЯ ТРАФИКА ЧЕРЕЗ СЕРВЕР
#

# Эти правила контролируют прохождение трафика через прокси-сервер в двух
# направлениях — от клиентов во внешний мир и обратно. Прокси-сервер по
# умолчанию блокирует прохождение трафика, поэтому необходимо создать хотя
# бы два правила — во внешний мир и обратно.

# любой клиент может отправлять запросы любому внешнему хосту
socks pass {
   from: 0.0.0.0/0 to: 0.0.0.0/0
   command: bind connect udpassociate
   log: error # connect disconnect iooperation
}

# любой клиент может принимать ответы от любого внешнего хоста
socks pass {
   from: 0.0.0.0/0 to: 0.0.0.0/0
   command: bindreply udpreply
   log: error # connect disconnect iooperation
}

Директивы конфигурации

Файл конфигурации состоит из трех групп — общие настройки сервера, правила доступа для клиентов к серверу и правила прохождения трафика через сервер.

1. Общие настройки сервера

Директива logoutput

Куда записывать логи сервера, возможные значения — путь к файлу или ключевые слова syslog, stdout, stderr. Для директивы допускается использование нескольких значений.

logoutput: syslog stdout /var/log/dante.log

Директива errorlog

Куда записывать ошибки сервера, возможные значения — путь к файлу или ключевые слова syslog, stdout, stderr. Директиву можно использовать, чтобы записывать только ошибки и предупреждения. Уровень ошибок задается директивой debug, которая может принимать значения 0 (нет), 1 (подробно), 2 (очень подробно).

errorlog: /var/log/dante.error.log
debug: 2

Директивы internal и external

Директивы используются для указания сетевых интерфесов, к которым должен быть привязан сервер. Аргумент может быть ip-адресом, именем интерфейса или именем хоста. Сервер принимает запросы от клиентов по внутреннему интерфейсу и использует внешний интерфейс при пересылке данных во внешний мир. Обычно внутренний интерфейс подключен к локальной сети, а внешний интерфейс подключен к интернету, но при настройке «обратного прокси» все будет наоборот.

Внутренний и внешний сетевые интерфейсы могут отличаться, если прокси-сервер работает как шлюз и имеет два сетевых интерфейса. Номер порта, на котором сервер принимает запросы, можно изменить, но 1080 — это стандартный номер порта SOCKS.

# Прослушивать запросы от клиентов на интерфейсе с ip-адресом 192.168.110.1 на порту 1080
internal: 192.168.110.1 port = 1080
# Отправлять запросы клиентов во внешний мир через интерфейс с ip-адресом 123.123.123.123
external: 123.123.123.123

Директивы user.privileged и user.notprivileged

Директивы задают имена пользователей операционной системы, которые сервер должен использовать для различных типов операций. Использование директивы user.notprivileged гарантирует, что сервер не будет выполнять операций от имени root без необходимости.

Для привязки к порту SOCKS по умолчанию обычно не требуется никаких специальных привилегий. Директива user.privileged требуется только для некоторых методов аутентификации или если серверу необходимо использовать привилегированные TCP/UDP-порты (номера ниже 1024).

Директивы clientmethod и socksmethod

Директива clientmethod в качестве аргумента принимает названия методов аутентификации, которые используются до или во время согласования протокола SOCKS. После этого названия методов аутентификации используются в правилах для доступа клиентов к серверу (см. ниже). Допустимые значения — rfc931, pam.address, pam.username.

clientmethod: rfc931

client pass {
    from: 192.168.100.0/24 to: 0.0.0.0/0
    log: error # connect disconnect
    clientmethod: rfc931
}

Директива socksmethod в качестве аргумента принимает названия методов аутентификации, которые используются после завершения согласования протокола SOCKS. После этого названия методов аутентификации используются в правилах для прохождения трафика через сервер (см. ниже). Допустимые значения — username, gssapi, bsdauth.

socksmethod: username

socks pass {  
    from: 0.0.0.0/0 to: 0.0.0.0/0
    command: bind connect udpassociate
    log: error # connect disconnect iooperation
    socksmethod: username
}

Чтобы не использовать аутентификацию вовсе — в качестве значения этих директив нужно указать ключевое слово none.

Пример настройки аутентификации

Чтобы включить аутентификацию по логину и паролю — для директивы socksmethod нужно установить значение username. При этом пользователь должен иметь учетную запись на прокси-сервере, а пароль передается в виде простого текста. И нужно добавить в файл конфигурации директиву user.privileged, чтобы прокси-сервер мог проверить логин и пароль пользователя.

# права root нужны для проверки логина и пароля
user.privileged: root
# не использовать этот способ аутентификации
clientmethod: none
# включить аутентификацию по логину и паролю
socksmethod: username

Для этого способа аутентификации давайте создадм пользователя, у которого не будет никаких прав в системе.

$ sudo useradd --system --shell /bin/false dante
$ sudo passwd dante

Теперь способ аутентификации нужно использовать в правилах прохождения трафика через сервер (см.ниже). Но только в правилах для трафика во внешний мир (bind, connect, udpassociate), в правилах для трафика из внешнего мира (bindreply, udpreply) это не допускается.

socks pass {  
    from: 0.0.0.0/0 to: 0.0.0.0/0
    command: bind connect udpassociate
    log: error
    user: dante # разрешено только пользователю dante
    socksmethod: username
}

2. Правила для доступа клиентов к серверу

Эти правила определяют доступ к прокси-серверу, они применяются еще до того, как какие-либо данные будут получены от клиента. Сервер Dante по умолчанию блокирует все входящие соединения клиентов, поэтому необходимо создать хотя бы одно правило.

# запрещается доступ клиенту с ip-адресом 192.168.100.22/32 куда бы то ни было
client block {
    from: 192.168.100.22/32 to: 0.0.0.0/0
    log: error # connect disconnect
}
# разрешается доступ клиентам из локальной сети 192.168.100.0/24 куда угодно
client pass {
    from: 192.168.100.0/24 to: 0.0.0.0/0
    log: error # connect disconnect
}

3. Правила прохождения трафика через сервер

Эти правила контролируют прохождение трафика через прокси-сервер в двух направлениях — от клиентов во внешний мир и обратно. Эти правила выполняются после аутентификации — это значит, что в правилах можно использовать личность клиента.

Сервер Dante поддерживает пять команд, которые можно использовать в правилаx — bind, connect, udpassociate, bindreply, udpreply. Первые три команды соответствуют запросам клиентов: from — адрес клиента, to — адрес внешнего хоста. Последние две команды соответствуют ответам внешних хостов: from — адрес внешнего хоста, to — адрес клиента. По этой причине для каждого набора команд должны быть созданы отдельные правила.

Сервер Dante по умолчанию блокирует прохождение трафика, поэтому необходимо создать хотя бы два правила — во внешний мир и обратно.

# блокировать прохождение трафика от всех клиентов к серверу www.example.org
socks block {
    from: 0.0.0.0/0 to: www.example.org
    command: bind connect udpassociate
    log: error # connect disconnect iooperation
}
# разрешить прохождение трафика от всех клиентов куда угодно во внешний мир
socks pass {  
    from: 0.0.0.0/0 to: 0.0.0.0/0
    command: bind connect udpassociate
    log: error # connect disconnect iooperation
}
# блокировать прохождение трафика из внешнего мира к серверу ftp.example.org
socks block {
    from: 0.0.0.0/0 to: ftp.example.org
    command: bindreply udpreply
    log: error # connect disconnect iooperation
}
# разрешить прохождение любого трафика из внешнего мира к любому клиенту
socks pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    command: bindreply udpreply
    log: error # connect disconnect iooperation
}

Поиск: Linux • Клиент • Конфигурация • Настройка • Сервер • Установка • SOCKS • сокет • proxy • прокси • Dante

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.