Предыдущие части: 1, 1.1(она же 4), 2, 3
Если вы вдохновились моими статьями и сделали всё, как написано, то у вас уже есть:
1. Сервер, расположенный где-то в дебрях Европы.
2. На сервере настроен вход SSH по сертификату и файрвол.
3. На сервер установлен VPN-сервер, сгенерирован ворох сертификатов для сервера и клиентов.
4. Ваши устройства (компьютеры, смартфоны, планшеты и т.п.) настроены на соединение с VPN-сервером.
Теперь ваш трафик по территории собственной страны идет только в зашифрованном виде, а доступ к ключам шифрования только у вас.
Казалось бы, живи и радуйся. Но не всё так просто. Ваше клиентское устройство, напрямую или косвенно, продолжает многое сообщать о вас: тип устройства, операционная система, внутренний IP адрес, и пр. Так происходит, потому что VPN-ервер не модифицирует полученные от вас пакеты, он просто их расшифровывает и отправляет в сеть.
Хватит это терпеть! Мы запилим свой прокси-сервер с анонимностью и прозрачностью.
Из статьи в википедии:
Proxy server (Прокси сервер) – промежуточный компьютер, который является посредником между вашим компьютером и Интернетом. Прокси обычно используют либо для ускорения работы в сети Интернет, либо для анонимного прохождения в сети Интернет. Так же использование анонимного прокси, может быть использовано, как дополнительное средство защиты: анонимный прокси (anonymous proxy) подменяет Ваш IP-адрес, и злоумышленник будет пытаться совершить атаку не на Ваш компьютер, а на прокси сервер, у которого, зачастую, максимально мощная система защиты.
Там ещё есть интересное в статье, почитайте.
Нас интересует умение прокси подменять отправителя пакетов и обрезать из них всё лишнее. Т.е. повысить нашу анонимность. Я уже писал в первой части, что 100% анонимности мы не добьёмся, но двигаться в этом направлении мы будем.
Есть over9000 реализаций прокси. Изначально я хотел использовать squid в связке с squidguard + adblock, но с кальмаром возникли проблемы. В разных версиях дистрибутивов он вёл себя по-разному с протоколом https, да и вообще последние его редакции какие-то не удачные. Поскольку данная статья рассчитана на не квалифицированного читателя, то перегружать её всеми возможными костылями для squid я посчитал не целесообразным. Поэтому, после недолгих исканий, был выбран 3proxy. В дальнейшем я всё-таки запили статью про squid.
И да, как вы наверняка помните, наш файрволл настроен таким образом, что прокси будет принимать подключения только от клиентов VPN-сети.
Пока мы еще не сделали анонимный прокси, попробуйте позаходить на сайты, показывающие степень вашей анонимности. Например:
https://do-know.com/privacy-test.html
https://whoer.net/ru
https://2ip.ru/privacy/
http://witch.valdikss.org.ru/
и прочие. Тысячи их. Потом сравните с тем, что будет после настройки прокси.
Хватит читать, открываем консоль. Будем отращивать бороду собирать наш прокси из исходников.
Установим компилятор
yum -y install gcc
Перейдём в домашнюю папку
cd ~
Быстренько посмотрим, какая версия 3proxy сейчась актуальна на странице загрузок https://www.3proxy.ru/download/
На момент написания статьи это была версия 0.8.9
Качаем её
wget https://github.com/z3APA3A/3proxy/archive/0.8.9.tar.gz
Распаковываем
tar -xvzf 0.8.9.tar.gz
И переходим в папку с исходниками
cd 3proxy-0.8.9
В опциях исходников делает наш сервер полностью анонимным.
sed -i '1s/^/#define ANONYMOUS 1\n/' ./src/proxy.h
Компилируем (О да! Теперь вы можете хвастаться, что в линуксе компилировали из сырцов. Чувствуете, как на вашем лице начинает пробиваться борода, на спине прорастать свитер?)
make -f Makefile.Linux
Подготовим рабочее место для нашего прокси
mkdir -p /etc/3proxy/bin
touch /etc/3proxy/3proxy.pid
Теперь перенесем скомпилированные исполняемые файлы в рабочую папку
cp ./src/3proxy /etc/3proxy/bin
cp ./src/TransparentPlugin.ld.so /etc/3proxy/bin
cp ./cfg/3proxy.cfg.sample /etc/3proxy/3proxy.cfg
В папке /etc/rc.d/init.d
создаем файл 3proxy следующего содержания
#!/bin/sh
#
# chkconfig: 2345 20 80
# description: 3proxy tiny proxy server
#
#
#
#
case "$1" in
start)
echo Starting 3Proxy
/etc/3proxy/bin/3proxy /etc/3proxy/3proxy.cfg
RETVAL=$?
echo
[ $RETVAL ]
;;
stop)
echo Stopping 3Proxy
if [ /etc/3proxy/3proxy.pid ]; then
/bin/kill `cat /etc/3proxy/3proxy.pid`
else
/usr/bin/killall 3proxy
fi
RETVAL=$?
echo
[ $RETVAL ]
;;
restart|reload)
echo Reloading 3Proxy
if [ /etc/3proxy/3proxy.pid ]; then
/bin/kill -s USR1 `cat /etc/3proxy/3proxy.pid`
else
/usr/bin/killall -s USR1 3proxy
fi
;;
*)
echo Usage: $0 "{start|stop|restart}"
exit 1
esac
exit 0
Сохраняем и устанавливаем права 0755. К сожалению формат пикабу не позволяет разместить тексты скриптов с нормальным форматированием. Можете посмотреть, как он выглядит в нормальном виде здесь. Но и без форматирования работать будет.
Теперь откроем файл /etc/3proxy/3proxy.cfg
Удалите всё его содержимое и вставьте следующее:
daemon
pidfile /etc/3proxy/3proxy.pid
plugin /etc/3proxy/bin/TransparentPlugin.ld.so transparent_plugin
nserver 8.8.8.8
nserver 8.8.4.4
nscache 65536
timeouts 1 5 30 60 180 1800 15 60
#log /dev/null
log /etc/3proxy/3proxy.log D
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
external 123.123.123.123
internal 10.8.0.1
auth none
maxconn 64
allow *
parent 1000 http 0.0.0.0 0
allow *
parent 1000 socks5 0.0.0.0 0
tcppm -i10.8.0.1 8080 127.0.0.1 11111
Здесь, в строчке
external 123.123.123.123
место 123.123.123.123 вписываем IP адрес вашего сервера.
Сохраним и закроем.
Прокси-сервер готов к запуску. Запустим его
service 3proxy start
Отлично, прокси запустился.
Если пишет ошибки, смотрим, что написано в консоли, что написано в /etc/3proxy/3proxy.log.[дата и время лога]
Если вы всё сделали в точности, как написано выше, ошибок быть не должно.
Теперь нам нужно поправить правила для iptables. Чтобы не настраивать прокси-сервер на всех клиентских устройствах (на смартфонах это зачастую попросту невозможно без рут-прав), мы сделаем наш прокси-сервер прозрачным. Т.е. для клиентов он будет не виден. Однако весь трафик, приходящий по VPN будет заворачиваться на прокси-сервер, а уже потом отправляться в открытую сеть.
Открываем Файл /root/ipt-set и аккуратно вносим следующие исправления:
Находим строчку:
SQUID_PORT=»8080″
и исправляем на
PROXI_PORT=»8080″
Находим строчки
# squid
$IPT -A INPUT -i $IF_OVPN -p tcp —dport $SQUID_PORT -j ACCEPT
$IPT -A INPUT -i $IF_OVPN -p udp —dport $SQUID_PORT -j ACCEPT
и исправляем на
# proxi
$IPT -A INPUT -i $IF_OVPN -p tcp —dport $PROXI_PORT -j ACCEPT
$IPT -A INPUT -i $IF_OVPN -p udp —dport $PROXI_PORT -j ACCEPT
И сразу, после этих строчек добавляем ещё две:
$IPT -t nat -A PREROUTING -i $IF_OVPN -p tcp -m tcp —dport 80 -j DNAT —to-destination 10.8.0.1:$PROXI_PORT
$IPT -t nat -A PREROUTING -i $IF_OVPN -p tcp -m tcp —dport 443 -j DNAT —to-destination 10.8.0.1:$PROXI_PORT
Сохраняем и закрываем файл.
Приведу, на всякий случай, файл /root/ipt-set полностью:
#!/bin/sh
IF_EXT="venet0"
IF_OVPN="tun0"
OVPN_PORT="443"
PROXI_PORT="8080"
IPT="/sbin/iptables"
IPT6="/sbin/ip6tables"
# flush
$IPT --flush
$IPT -t nat --flush
$IPT -t mangle --flush
$IPT -X
$IPT6 --flush
# loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
$IPT6 -P INPUT DROP
$IPT6 -P OUTPUT DROP
$IPT6 -P FORWARD DROP
# allow forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# NAT
# #########################################
# SNAT - local users to out internet
$IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE
# INPUT chain
# #########################################
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ssh
$IPT -A INPUT -i $IF_EXT -p tcp --dport 22 -j ACCEPT
# VPN
$IPT -A INPUT -i $IF_OVPN -p icmp -s 10.8.0.0/24 -j ACCEPT
# DNS
$IPT -A INPUT -i $IF_OVPN -p udp --dport 53 -s 10.8.0.0/24 -j ACCEPT
# openvpn
$IPT -A INPUT -i $IF_EXT -p udp --dport $OVPN_PORT -j ACCEPT
# proxi
$IPT -A INPUT -i $IF_OVPN -p tcp --dport $PROXI_PORT -j ACCEPT
$IPT -A INPUT -i $IF_OVPN -p udp --dport $PROXI_PORT -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF_OVPN -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.8.0.1:$PROXI_PORT
$IPT -t nat -A PREROUTING -i $IF_OVPN -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.8.0.1:$PROXI_PORT
# FORWARD chain
# #########################################
$IPT -A FORWARD -i $IF_OVPN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_OVPN -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -s 10.8.0.0/24 -d 10.8.0.0/24 -j ACCEPT
# OUTPUT chain
# #########################################
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Теперь весь трафик из VPN для портов 80 и 443 (т.е. http и https) будет перенаправлен на наш прокси.
Применим правила командой:
/root/ipt-set
Если вы прямо сейчас подключены к VPN-серверу, то уже можете заходить на разные сайты и проверять, что всё работает. Зайдите на один-два любых сайта, убедитесь, что они открываются. Теперь посмотрите в файл лога /etc/3proxy/3proxy.log.[дата и время лога]
В нем вы должны увидеть свою активность. Если всё работает, то остановим наш прокси:
service 3proxy stop
Откроем его конфиг /etc/3proxy/3proxy.cfg и строчки:
#log /dev/null
log /etc/3proxy/3proxy.log D
logformat «- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T»
превратим в:
log /dev/null
#log /etc/3proxy/3proxy.log D
#logformat «- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T»
Теперь прокси-сервер не будет писать логи и сохранять историю посещений сайтов. Сразу удалим уже имеющийся лог /etc/3proxy/3proxy.log.[дата и время лога]
И запустим прокси:
service 3proxy start
И добавим его в автозагрузку:
/sbin/chkconfig 3proxy on
Итак, что мы имеем после выполнения всех инструкций:
1. Арендован и настроен VPS. Вход по сертификату.
2. Установлен и настроен личный VPN-сервер и, в нагрузку, свой удостоверяющий уентр.
3. Настроены клиенты VPN-сети.
4. Установлен и настроен анонимный, прозрачный прокси-сервер.
В следующих статьях мы добавим еще немного анонимности нашему серверу и вообще поговорим за личную информационную безопасность во всемирной паутине. Не переключайтесь.