Статья Создание своего VPN с помощью Shadowsocks и обфускация трафика - часть 3

147768_O.jpg

1 часть: Создание своего VPN с помощью Shadowsocks и обфускация трафика

2 часть: Создание своего VPN с помощью Shadowsocks и обфускация трафика - часть 2

Введение

В этой части мы рассмотрим то, как пропустить обфусцированный трафик Shadowsocks через CDN от Cloudflare. Это позволит нам обмануть DPI, т.к. ему будет казаться, что вы используете обычный HTTPS, а также повысить защищенность благодаря TLS. Также, при использовании этого способа мы будем подключаться не напрямую к VPN, а через сервера Cloudflare.

Подготовительный этап

Кроме сервера (о тонкостях его выбора я писал в предыдущих статьях) нам также потребуется домен и аккаунт на Cloudflare. Доменное имя и зона в данном случае большой роли не играют, но советую брать наиболее неприметные, близкие к служебным доменам каких-либо сайтов.
Будем считать, что мы нашли домен. Теперь нам нужен аккаунт на Cloudflare
.
После регистрации он предложит нам выбрать тарифный план, но т.к. мы не будем использовать его услуги по защите, то смело выбираем Free. Затем он предложит добавить сайт и отредактировать DNS-записи. Нам нужны всего две A записи вида и example.com, в которые мы вставляем IP нашего сервера. Послеэтого он выдаст неймсервера, которые потребуется вставить в панель управления вашего домена. После всего этого вы должны подождать некоторое время для обновления DNS, после чего вы увидите это:

1620979061600.png


Пока оставим Cloudflare и перейдем к настройке сервера

Настройка сервера

В целом она не отличается от описанной во второй статье. Скачиваем shadowsocks:

Код:
apt install shadowsocks-libev

Скачиваем плагин v2ray и перемещаем его в /usr/local/bin, дабы не писать путь в конфиге, а также позволяем использовать ему привилегированные порты:

Код:
cd /usr/local/bin
wget https://github.com/shadowsocks/v2ray-plugin/releases/download/v1.3.1/v2ray-plugin-linux-amd64-v1.3.1.tar.gz
tar xf v2ray-plugin-linux-amd64-v1.3.1.tar.gz
mv v2ray-plugin_linux_amd64 v2ray-plugin
setcap 'cap_net_bind_service=+eip' v2ray-plugin

Создаем конфиг:

Код:
nano /etc/shadowsocks-libev/v2ray.json

В него вставляем следующее:

JSON:
{
    "server": ["::1", "127.0.0.1"],
    "server_port": 8888,
    "password": "пароль",
    "timeout": 120,
    "method": "алгоритм шифрования",
    "nameserver": "DNS сервер",
    "plugin": "v2ray-plugin",
    "plugin_opts": "server;loglevel=none",
    "mode": "tcp_only",
    "no_delay": true,
    "fast_open": true,
    "reuse_port": true
}

Выходим и сохраняем

Сразу создадим сервис, чтобы не возвращаться к настройке:

Код:
sudo nano /etc/systemd/system/ss-v2ray.service

Вставляем это:

Код:
[Unit]
Description=Shadowsocks-libev with V2RAY-websocket obfuscation
Documentation=man:shadowsocks-libev(8)
After=network.target

[Service]
Type=simple
User=nobody
Group=nogroup
LimitNOFILE=51200
ExecStart=/usr/bin/ss-server -c /etc/shadowsocks-libev/v2ray.json

[Install]
WantedBy=multi-user.target

Теперь приступим к получению сертификатов и настройке Nginx

Получение сертификатов

Возвращаемся на Cloudflare и переходим в раздел Firewall, и в настройках отключаем проверку капчи:

1620980186400.png


После этого идем в SSL/TLS и выбираем строгое шифрование соединения (Full (strict)):

1620980338600.png


Затем переходим в раздел Origin Server и создаем сертификат:

1620980411800.png


Созданный сертификат и ключ нужно поместить на сервер в папку /etc/ssl:

Для сертификата:

Код:
nano /etc/ssl/cert.pem

Для ключа:

Код:
nano /etc/ssl/cert.key

Сразу же сгенерируем параметр Диффи-Хеллмана (это может занять продолжительное время!):

Код:
openssl dhparam -out /etc/ssl/dhparams.pem 4096

Теперь, когда сертификаты готовы, перейдем к Nginx

Настройка Nginx

Для начала - установка:
Код:
apt install nginx

Затем - удаление стандартного конфига сайта и создание нового:

Код:
rm /etc/nginx/sites-available/default
nano /etc/nginx/sites-available/default

В него вставляем следующий код:

Код:
server {
        listen       443 ssl http2 reuseport backlog=131072 fastopen=256;
        listen       [::]:443 ssl http2 reuseport backlog=131072 fastopen=256;     
    server_name example.com;
    add_header Allow "GET" always;
    if ( $request_method !~ ^(GET)$ ) {
          return 444;
    }
    ssl_certificate /etc/ssl/cert.pem;
    ssl_certificate_key /etc/ssl/cert.key;
    ssl_dhparam /etc/ssl/dhparams.pem;
    ssl_session_cache shared:le_nginx_SSL:1m;
    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;
    ssl_protocols TLSv1.3 TLSv1.2; 
    ssl_ecdh_curve secp384r1;
    add_header Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'" always;
    add_header Strict-Transport-Security 'max-age=63072000; includeSubdomains; preload' always;
    add_header X-Robots-Tag "noindex, nofollow" always; 
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Xss-Protection "1; mode=block" always;
    resolver localhost valid=300s;
    ssl_buffer_size 8k;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_prefer_server_ciphers on;
        ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
    location / {
            proxy_pass https://google.com;
        limit_rate 1000k;
        proxy_redirect off;

        }     
        location /ss {
            proxy_redirect off;         
        proxy_buffering off;
        proxy_http_version 1.1;
            proxy_pass http://localhost:8888/;
            proxy_set_header Host $http_host;
            proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        }
}

Вместо example.com вставляем наш домен, а вместо google.com - любой другой сайт, на который будет идти перенаправление при переходе на наш домен

Теперь отредактируем конфиг Nginx:

Код:
rm /etc/nginx/nginx.conf
nano /etc/nginx/nginx.conf

В него вставим это:

Код:
user www-data;
worker_processes auto;
worker_cpu_affinity auto;
pcre_jit on;
pid /run/nginx.pid;
worker_rlimit_nofile 131072;
include /etc/nginx/modules-enabled/*.conf;

events {
worker_connections 4000;
multi_accept on;
use epoll;
epoll_events 512;
}

http {
##
# Basic Settings
##

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
client_body_timeout 12;
client_header_timeout 12;
send_timeout 30;
keepalive_requests 2000;
reset_timedout_connection on;
types_hash_max_size 2048;
server_tokens off;
server_names_hash_max_size 4096;
client_body_buffer_size 128K;
client_header_buffer_size 3m;
client_body_in_single_buffer on;
client_max_body_size 8m;
large_client_header_buffers 4 256k;

open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
## Block spammers and other unwanted visitors ##
include /etc/nginx/blockips.conf;
##
# Logging Settings
##
access_log off;
error_log /var/log/nginx/error.log crit;
##
# Gzip Settings
##
gzip off;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-available/*;
}

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

Код:
nano /etc/nginx/blockips.conf

В самый конец вставляем:

Код:
allow 173.245.48.0/20;
allow 103.21.244.0/22;
allow 103.22.200.0/22;
allow 103.31.4.0/22;
allow 141.101.64.0/18;
allow 108.162.192.0/18;
allow 190.93.240.0/20;
allow 188.114.96.0/20;
allow 197.234.240.0/22;
allow 198.41.128.0/17;
allow 162.158.0.0/15;
allow 104.16.0.0/12;
allow 172.64.0.0/13;
allow 131.0.72.0/22;
allow 2400:cb00::/32;
allow 2606:4700::/32;
allow 2803:f800::/32;
allow 2405:b500::/32;
allow 2405:8100::/32;
allow 2a06:98c0::/29;
allow 2c0f:f248::/32;
deny all;

Запрещаем ICMP трафик (тоже в целях безопасности):


Код:
iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT &&
iptables -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT &&
iptables -A OUTPUT -p icmp --icmp-type 4 -j ACCEPT &&
iptables -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT &&
iptables -A OUTPUT -p icmp --icmp-type 12 -j ACCEPT &&
iptables -A OUTPUT -p icmp -j DROP &&
iptables -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT &&
iptables -A OUTPUT -p icmp --icmp-type 12 -j ACCEPT &&
iptables -A INPUT -p icmp -j DROP

Перезагружаем Nginx и включаем Shadowsocks:

Код:
systemctl restart nginx
sudo systemctl enable ss-v2ray.service && sudo systemctl restart ss-v2ray.service

Все готово!

Настройка клиентов

Настройка клиентов, опять же, не отличается от предыдущей статьи:
  • Windows - скачиваем Shadowsocks и плагин v2ray, указываем в IP наш домен, порт - 443, а в опциях плагина указываем tls;fast-open;path=/ss;host=example.com
  • Android - скачиваем клиент и плагин, а потом сканируем QR код с ПК​
  • Linux - проводим аналогичные процедуры, как и с сервером, только в конфиге в параметре plugin-opts пишем tls;fast-open;path=/ss;host=example.com
Вот так, в несколько простых шагов, мы получаем весьма мощный VPN, который очень трудно отследить
 
Последнее редактирование:
Небольшой UPD: в связи с устареванием shadowsocks-libev советую использовать go-shadowsocks2 - реализацию Shadowsocks на языке Go
Найти её вы можете тут
 
Если shadowsocks через cdn CF идёт, провайдер и админы видят коннект к одному серверу/домену или они видят коннект к сети CF?
 
Приветсвую,подскажите выдает ошибку в консоле :tcp.go:89: relay error: EOF а в браузере Error code: PR_END_OF_FILE_ERROR в чем может быть проблема уже все перепробывал ?
и самое что интерестное настроиваю уже не один раз,и как то через раз то норм работает то натыкаюсь на эту ошибку,и ещё когда запущен nginx в логе пишет
[warn] 26931#26931: "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/cert.pem"
 
Всем привет!
Могу в этой теме задать вопрос про личный VPN?
Или лучше создать новую тему в разделе - Приватность — Anonymity?
(поднимал vpn на площадке, которая размещена в Голандии, все удалось настроить без проблем, но один нюанс меня мучает, не все сайты смог открыть через него.
Думал, что IP бесплатных vpn давно в черном списке, потому и поднял свой собственный за бабки.
Но с доступом, к сожалению, проблема. В какую сторону копать, честно говоря подвис маленько.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!