Настройка и использование 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-клиенте.