Настройка и использование redsocks

Для перенаправления TCP-трафика через прокси можно воспользоваться демоном redsocks.

Кроме перенаправления трафика в redsocks также есть заглушка DNS-сервера, которая принимает UDP-запросы и возвращает ответ о необходимости повторить запрос с использованием протокола TCP. А также можно настроить приём DNS-запросов на TCP-порту и их перенаправление через SOCKS5-прокси. В этой статье эти возможности не освещаются.

Настройка redsocks

Установим демон redsocks из одноимённого пакета:

# apt-get install redsocks

Пропишем в файле конфигурации /etc/redsocks.conf в секции redsocks настройки используемого прокси-сервера:

redsocks {
    local_ip = 127.0.0.1;
    local_port = 12345;

    type = http-connect;
    ip = 127.0.0.1;
    port = 3128;
}

Кроме прокси-сервера типа http-connect поддерживаются также socks5, socks4 и http-relay.

Если прокси-сервер требует аутентификацию, можно указать логин и пароль учётной записи, добавив соответствующие настройки в ту же секцию redsocks:

login = "foobar";
password = "baz";

Подготовка iptables

Теперь нужно перенаправить в redsocks TCP-трафик средствами iptables.

Создаём новую цепочку:

# iptables -t nat -N REDSOCKS

Добавляем в цепочку два правила:

# iptables -t nat -A REDSOCKS -p tcp -m tcp -d 10.0.25.3 --dport 8080 -j RETURN
# iptables -t nat -A REDSOCKS -p tcp -m tcp -j REDIRECT --to-ports 12345

Второе правило перенаправляет трафик в redsocks, а первое отменяет перенаправление трафика к вышестоящему прокси-серверу.

Перенаправление всего исходящего трафика

Теперь нужно определиться, какой трафик будет перенаправляться в цепочку REDSOCKS. Например, можно перенаправлять в цепочку REDSOCKS весь исходящий трафик к веб-ресурсам, вот так:

# iptables -t nat -A OUTPUT -p tcp -m multiport --dports 80,443,8080 -j REDSOCKS

Перенаправление трафика локального пользователя

Чтобы перенаправлять трафик только определённого пользователя, можно воспользоваться такой командой:

# iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner stupin -m multiport --dports 80,443,8080 -j REDSOCKS

Внимание! Если прокси, на который redsocks перенаправляет запросы, расположен локально на IP-адресе 127.0.0.1, убедитесь, что iptables не блокирует входящий трафик на интерфейс lo с IP-адресов вне сети 127.0.0.1. Например, правило, которое я обычно использую при настройке iptables, мне пришлось переделать следующим образом:

#-A INPUT -s 127.0.0.0/8 -i lo -j ACCEPT
-A INPUT -i lo -j ACCEPT

Перенаправление трафика группы локальных пользователей

Можно создать группу socksified, трафик которой будем перенаправлять:

# groupadd socksified

И добавить в эту группу пользователей, трафик которых нужно перенаправлять:

# usermod -aG socksified stupin

Теперь можно перенаправлять через redsocks трафик всех пользователей, состоящих в этой группе, аналогично тому, как это было сделано при перенаправлении трафика отдельного пользователя:

# iptables -t nat -A OUTPUT -p tcp -m owner --gid-owner socksified -j REDSOCKS

Если socksified - не основная группа пользователя, то трафик пользователя по умолчанию перенаправляться через redsocks не будет. В таком случае можно запускать с правами этой группы отдельные приложения. Например, вот так можно запустить firefox для перенаправления через redsocks только его трафика:

$ sg socksified -c "firefox"

Перенаправление трафика другого компьютера

Если же компьютер используется в качестве маршрутизатора, то можно перенаправлять входящие TCP-подключения с указанных интерфейсов в цепочку REDSOCKS правилами следующего вида:

# iptables -t nat -A PREROUTING -i wlan0 -p tcp -m multiport --dports 80,443,8080 -j REDSOCKS

Или можно ограничить IP-адреса компьютеров, трафик которых нужно перенаправлять через redsocks:

# iptables -t nat -A PREROUTING -i wlan0 -s 192.168.122.0/24 -p tcp -m multiport --dports 80,443,8080 -j REDSOCKS

Внимание! При перенаправлении трафика с другого компьютера redsocks должен принимать подключения на соответствующем интерфейсе или со всех интерфейсов. В последнем случае в конфигурации опция local_ip будет иметь следующий вид:

local_ip = 127.0.0.1;

Внимание! Т.к. в примере выше трафик, поступающий на интерфейс wlan0 перенаправляется фактически на тот же интерфейс, может потребоваться разрешить соответствующий входящий трафик на этом интерфейсе:

-A INPUT -i wlan0 -s 192.168.122.0/24 -p tcp -m tcp --dport 12345 -j ACCEPT

Проверка и завершение настройки iptables

Теперь можно попробовать проверить работу redsocks, например, запустив команду wget следующим образом:

$ wget https://stupin.su/blog/index.html

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

# iptables-save > /etc/network/iptables

Прописать применение этих правил при загрузке компьютера можно в файле /etc/network/interfaces, добавив правило pre-up к настройкам интерфейса lo:

auto lo
iface lo inet loopback
    pre-up /usr/sbin/iptables-restore < /etc/network/iptables

Дополнительные материалы

redsocks можно также настроить каскадом с cntlml или SOCKS5-прокси в SSH-клиенте.

Использованные материалы