Как да използвате прозрачно прокси с всяко приложение (Docker), използвайки Iptables и RedSocks

Използването на интернет прокси сървъри е доста често срещано в днешно време като средство за налагане на ограничения (за целите на сигурността) за това как дадено приложение или машина може да се свърже с интернет.

По-голямата част от приложенията или библиотеките предоставят поддръжка за HTTP / HTTPS / FTP прокси. Обичайният начин да активирате прокси в Linux система е като зададете променливите на средата:

експортиране http_proxy = http: // myproxy: 3128
експортиране https_proxy = http: // myproxy: 3128
експортиране ftp_proxy = http: // myproxy: 3128
експортиране no_proxy = .local

Обикновено активирането на това (или като алтернатива на конфигурацията на приложението) прави трика. Въпреки това ... има ъглови случаи, когато това не работи.

Можете ли да ми дадете пример?

Първоначално започнах да изследвам различни алтернативи заради рамката Scrap (*) и това е FTP поддръжка.

Scrap е отворен код и рамка за сътрудничество за извличане на необходимите данни от уебсайтове.

Докато Scrapy поддържа Proxy за обхождане на HTTP и HTTPS, за съжаление това не се отнася за FTP. Валидна алтернатива, разбира се, би разширила скрапа и прилага тази функция, като по този начин допринесе за проекта. Реших да не поема по този маршрут, просто защото исках да проуча опция, която би била агностично приложение и ще реши проблема по общ начин.

Как можем да преодолеем това по общ начин?

Настройването на променливите на средата работи с повечето приложения, но винаги има такива, които или не поддържат изобщо, или някакъв ъглов случай (например Scrapy & FTP Proxy).

Моят подход беше да използвам комбинация от IPTables с RedSocks за прозрачно пренасочване на FTP трафика (напр. Дестинация порт 21) чрез прокси сървъра.

Препарати

Ако решите да не използвате докер, можете да пропуснете тези препарати.

  1. Изтеглете и инсталирайте Docker
  2. Създайте докерска мрежа, за да активирате комуникацията между контейнерите: docker network create --driver bridge mynet

пълномощник

Вземете прокси сървър и работи с поддръжка за HTTP, HTTPS и FTP. Ако все още нямате такъв, не се колебайте да използвате Squid Proxy, който използвах в статията си за Разрешаване на централизирано регистриране на приложения с помощта на стека Elastic (ELK) от Stratch.

docker run -p 3128: 3128 --name proxy --network mynet forward-proxy

Използване на прокси чрез Iptables и Redsocks

Започваме със създаването на Docker контейнер, наречен proxy-via-iptables.

Контейнерът ще принуди дадено приложение (например curl) да пренасочи изходящия трафик към даден порт чрез локалната услуга redsocks (която ще препрати към прокси сървъра).

Папката ще съдържа три файла: Dockerfile, redsocks.conf и run.sh

Dockerfile

ОТ debian: най-ново
Поддръжка на LABEL = "Bruno Amaro Almeida | brunoamaro.com"
# Задайте работната директория на / app
WORKDIR / ап
# Копирайте текущото съдържание на директория в контейнера в / app
ДОБАВЯНЕ / приложение
ENV PROXY_SERVER = localhost
ENV PROXY_PORT = 3128
RUN apt-get update
RUN apt-get upgrade -qy
RUN apt-get install iptables redsocks curl lynx -qy
COPY redsocks.conf /etc/redsocks.conf
ВХОД / bin / bash run.sh

redsocks.conf

база {
 log_debug = изключен;
 log_info = включено;
 log = "файл: /var/log/redsocks.log";
 демон = включен;
 потребител = червени чорапи;
 група = червени чорапи;
 redirector = iptables;
}
redsocks {
 local_ip = 127.0.0.1;
 local_port = 12345;
 ip = vPROXY-СЪРВЪР;
 порт = vPROXY-PORT;
 type = http-connect;
}

run.sh

#! / Хамбар / Баш
ехо "Конфигурация:"
ехо "PROXY_SERVER = $ PROXY_SERVER"
ехо "PROXY_PORT = $ PROXY_PORT"
ехо "Настройване на конфигурационни променливи"
sed -i "s / vPROXY-SERVER / $ PROXY_SERVER / g" /etc/redsocks.conf
sed -i "s / vPROXY-PORT / $ PROXY_PORT / g" /etc/redsocks.conf
ехо „Рестартиране на червени стъпки и пренасочване на трафика чрез iptables“
/etc/init.d/redsocks рестартирайте
iptables -t nat -A ИЗХОД -p tcp --dport 21 -j ПРЕДВАРИТЕЛНО - до порт 12345
# Стартиране на приложение
ехо "Тестване на ftp достъп чрез: ftp://speedtest.tele2.net"
къдря ftp://speedtest.tele2.net
докато е вярно; спите 1000; Свършен

С тези три файла на място, изградете контейнера с помощта на командата: docker build -t proxy-via-iptables.

Ако контейнерът е изграден успешно, стартирайте го в mynet мрежата с помощта на командата:

docker run -i -t - mynet mynet --privileged -e PROXY_SERVER = proxy -e PROXY_PORT = 3128 proxy-via-iptables

Защо флага на Докер привилегировано? По подразбиране контейнерите на docker работят с няколко привилегии с хоста. Този флаг ще разшири тези привилегии, като предостави достъп до всички устройства на хоста. В нашия случай е необходимо да използвате iptables с Docker. Моля, проверете привилегията за изпълнение и възможностите на Linux в документацията на Docker за подробна информация.

Както можете да видите, при стартиране контейнерът прави бърз тест, като посещава ftp дестинация с помощта на curl (и без конфигуриране на curl да използва прокси).

На нашия контейнер за прокси сървъри можем да проверим дали заявката е направена в дневника за достъп:

Това е! Току-що препратихте заявката за къдряне до прокси сървъра, без да я знаете.

Защо червени чорапи?

Redsocks е прозрачен прокси пренасочване. Той даде възможност за пренасочване на всички TCP пакети към SOCKS или HTTP прокси.

Ако сте запознати с iptables, може би се чудите защо не мога да го използвам за всичко. Това беше първият ми подход, но най-големият недостатък на този подход беше, че не можем да го използваме за HTTPS или FTP, защото той не обработва прозрачно PROXY CONNECT / SSL.

Redsocks беше проектиран да преодолее това ограничение и да се справи с това пренасочване към прокси прозрачно. Също така е доста популярно сред потребителите на Tor да пренасочват трафика към мрежата на Tor (важи същия принцип).

Защо IPtables?

IPtables е ножът на швейцарската армия на Linux, който накратко ви позволява да създавате правила, които определят как трябва да се обработва трафика (пакетите). Той също така често се използва за създаване на собствени правила за защитна стена на Linux.

В нашия конкретен случай използваме iptables, за да създадем едно правило, което пренасочва целия изходящ FTP трафик (дестинация порт 21) към локалния RedSocks (порт 12345).

Почисти

Не забравяйте да почистите вашата машина, като спрете всичките си работещи контейнери: docker stop $ (docker ps -a -q)

Освен това можете да премахнете всички контейнери, изображения и създадени от потребители мрежи, като използвате командата: docker system prune -a

Надявам се, че сте намерили тази статия за полезна! Моля, споделете вашите отзиви и мисли.

Контейнерите по-горе могат да бъдат намерени и на моя Github: https://github.com/brunoamaroalmeida/awesome-quickstart-containers

Достигнете и следвайте в Twitter и Instagram

Bruno