С развитием современных технологий защита сетевого трафика становится не просто актуальной, но и обязательной. В этой статье я покажу, как с помощью Shadowsocks и плагина xray настроить защищенное соединение с внешним миром.
Еще по теме: Шифрование трафика в Linux
Защита трафика с помощью Shadowsocks
С помощью данного способа никто не сможет расшифровать или заблокировать сетевой трафик передаваемый от вас в сеть и обратно.
Для начала, нам необходимо:
- выбрать и купить VPS;
- выбрать и купить доменное имя;
- открыть аккаунт на Cloudflare и изменить настройки.
Рассмотрим все шаги по порядку.
Выбор VPS
К выбору хостера надо подходит серьезно и скрупулезно. Стоит обратить внимание на то, в какой стране была зарегистрирована компания. В каких государствах находятся сервера. Лучше выбирать страны, в которых строго относятся к личной информации (например, Исландия или Швейцария).
Выбор домена
Здесь нет особенных рекомендаций. Можете выбрать домен предлагаемый хостингом. На мой взгляд это даже безопаснее.
В данной статье я буду использовать абстрактный доменное имя secret-site.com..
Почему не стоит юзать ESNI/ECH? Потому, что некоторые сетевые фильтры не смогут определить сайт назначения и попросту заблокируют соединение.
Настройка Cloudflare
Сервис Cloudflare в качестве защитного механизма и защите трафика играет важную роль : мы скрываем реальный IP-адрес нашего VPS-сервера и защищаем его от различных атак. Сетевой трафик от нашего компьютера пойдет сначала в сеть Cloudflare и только потом из нее — к VPS.
Кроме этого, Cloudflare создаст сертификат для TLS-соединения, и весь сетевой трафик будет завернут и защищен с TLS 1.3.
Итак, необходимо зарегистрировать и привязать к сервису наш ранее купленный домен. Теперь на вкладке DNS необходимо заполнить строки А (две штуки), в которые надо ввести наше доменное имя (одной строчкой у с приставкой www, в другую без нее) и IP-адрес VPS.
После этого необходимо ввести показанные нам серверы имен Cloudflare в панель управления нашего доменного регистратора на вкладке DNS.
Далее на вкладке SSL/TLS:
- выбираем шифрование Full (strict);
- включаем Always Use HTTPS;
- включаем TLS 1.3;
- устанавливаем Minimum TLS Version на 1.3;
- включаем Opportunistic Encryption;
- включаем Automatic HTTPS Rewrites.
Немного защитили трафик укрепив TLS и можно идти дальше. Теперь в Client Certificates на той же вкладке и жмем кнопку Create Certificate для генерации сертификата и ключа (условимся, что файлы будут называться secret-site.pem и secret-site.key).
Теперь идем на VPS и приступаем к настройке.
Настройка VPS
Итак, в некоторой степени утомительная подготовительная процедура окончена, давайте теперь настраивать сам VPS. Все настройки будут делаться на Debian х64.
Сначала обновим пакеты и установим вспомогательные утилиты:
1 2 |
apt update && apt upgrade -y apt install -y dnsutils nethogs vnstat sendmail fail2ban nano wget unzip htop psmisc nginx |
Теперь разберемся с сертификатами и ключами от Cloudflare — их мы положим на наш VPS в папку:
1 |
/etc/ssl/ |
и выдадим ей права только на чтение.
Далее надо сгенерировать параметр Диффи — Хеллмана:
1 |
openssl dhparam -out /etc/ssl/dh-param.pem 4096 |
Положим его в ту же папку:
1 |
/etc/ssl/ |
Теперь приступим к настройкам Nginx в файле:
1 |
/etc/nginx/nginx.conf |
В его стандартную структуру достаточно добавить наш сертификат, ключ, DH и некоторые служебные настройки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server{ listen 443 ssl http2 reuseport backlog=131072 fastopen=256; ssl_certificate /etc/ssl/secret-site.pem; ssl_certificate_key /etc/ssl/secret-site.key; ssl_dhparam /etc/ssl/dh-param.pem ssl_protocols TLSv1.3; ssl_ecdh_curve secp384r1; add_header X-Robots-Tag "noindex, nofollow" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Xss-Protection "1; mode=block" always; add_header Strict-Transport-Security 'max-age=63072000; includeSubdomains; preload' always; resolver localhost valid=300s; ssl_buffer_size 8k; ssl_prefer_server_ciphers off; |
Далее добавим локации:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
location / { limit_req zone=one burst=5 nodelay; index index.html index.htm; limit_rate 19k; set $limit_rate 19K; proxy_redirect off; } location /secretline { proxy_redirect off; proxy_buffering off; proxy_http_version 1.1; proxy_pass http://localhost:8008/; proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Early-Data $ssl_early_data; proxy_set_header Connection "upgrade"; } |
В location / я вписал index.html — это просто сайт‑заглушка, который будет болтаться на нашем сервере для того, чтобы противостоять активному зондированию. Проще говоря, если какой‑то зонд будет сканировать сервер в поисках Shadowsocks или чего‑то еще, он просто наткнется на нашу заглушку. Тогда он подумает, что это обычный сайт, оставит нас в покое и уйдет пить пиво.
Локация location /secretline — это и есть наш Shadowsocks. Вместо строки secretline нужно придумать что‑то более оригинальное и трудноподбираемое, эта строка будет передаваться в качестве параметра на клиенте к плагину xray.
Далее скачиваем и устанавливаем Shadowsocks и xray-plugin:
1 2 3 4 |
wget https://github.com/shadowsocks/shadowsocks-rust/releases/download/v1.14.3/shadowsocks-v1.14.3.x86_64 unknown-linux-gnu.tar.xz && tar -xf shadowsocks-v1.14.3.x86_64-unknown-linux-gnu.tar.xz wget https://github.com/teddysun/xray-plugin/releases/download/v1.5.4/xray-plugin-linux-amd64-v1.5.5.tar.gz && tar -xf xray-plugin-linux-amd64-v1.5.5.tar.gz |
Создаем папку shadowsocks и копируем в нее нужные файлы:
1 2 |
mv ssserver /bin mv xray-plugin /etc/shadowsocks/xray-plugin |
Настраиваем разрешения:
1 2 |
setcap 'cap_net_bind_service=+eip' /etc/shadowsocks/xray-plugin setcap 'cap_net_bind_service=+eip' /bin/ssserver |
Теперь создадим файл конфигурации сервера Shadowsocks:
1 2 |
touch /etc/shadowsocks/shadowsocks-rust.json nano /etc/shadowsocks/shadowsocks-rust.json |
И запишем туда такой текст:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "server":["127.0.0.1"], "server_port":8008, "password":"Password123", "timeout":300, "method":"chacha20-ietf-poly1305", "fast_open":true, "reuse_port":true, "plugin":"/etc/shadowsocks/xray-plugin", "plugin_opts":"server;loglevel=none", "nameserver":"1.1.1.1", "mode": "tcp_and_udp", "no_delay": true, "workers":1 } |
Давайте пройдемся по основным пунктам:
- « server_port» — порт, на котором будет висеть сервер shadowsocks;
- « workers» — количество ядер на сервере;
- « ipv6_first» — поддержка протокола IPv6;
- « nameserver» — IP DNS-сервера, если есть локальный, то 127.0.0.1;
- « plugin» и « plugin_opts» используются для плагина xray;
- « reuse_port» — оптимизация для более быстрого использования сети;
- « method» — используемое шифрование;
- « password» — пароль для подключению к серверу.
Теперь создадим сервис ss-xray.service:
1 |
nano /etc/systemd/system/ss-xray.service |
Записываем туда следующий текст:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[Unit] Description=Shadowsocks with XRAY After=network.target [Service] Type=simple User=nobody Group=nogroup LimitNOFILE=51200 ExecStart=/bin/ssserver -c /etc/shadowsocks/shadowsocks-rust.json ExecStop=/bin/killall ssserver Restart=always RestartSec=10 [Install] WantedBy=multi-user.target |
Сохраняемся и выходим: Ctrl + O, Ctrl + X. Включаем сервис:
1 |
sysctl -p && systemctl enable ss-xray.service |
С основной настройкой мы закончили, теперь можно немного оптимизировать сетевой стек. В файл /etc/sysctl.conf дописываем следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
fs.file-max = 131072 net.core.rmem_max = 8388608 net.core.wmem_max = 8388608 net.core.rmem_default = 8388608 net.core.wmem_default = 8388608 net.core.optmem_max = 8388608 net.core.netdev_max_backlog = 131072 net.core.somaxconn = 131072 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_mem = 25600 51200 102400 net.ipv4.tcp_rmem = 4096 1048576 4194304 net.ipv4.tcp_wmem = 4096 1048576 4194304 net.ipv4.tcp_fastopen=3 net.ipv4.tcp_low_latency = 1 net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_adv_win_scale = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_keepalive_time = 150 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_slow_start_after_idle=0 net.ipv4.tcp_max_syn_backlog = 65536 net.ipv4.tcp_max_tw_buckets = 720000 net.ipv4.tcp_mtu_probing = 1 |
Опять сохраняемся и перезагружаем сервер. Теперь все должно работать.
Что в итоге у нас получилось? Запрос от нашего компа уходит в CDN Cloudflare, а возвращается от нашего VPS. Для внешнего наблюдателя создается впечатление, будто комп общается по TLS с каким‑то сайтом, но что передает — узнать не получится, ибо шифрование. Другими словами, наблюдается обычная сетевая активность, чего мы и хотели добиться.
В качестве клиентов к серверу можно смело использовать:
- SagerNet для Android;
- Shadowsocks-windows для винды;
- ShadowsocksX-NG для macOS.
Как еще можно укрепить наш VPS? Например, так:
- сменить порт SSH для того, чтобы автоматические сканеры не ломились на стандартный порт;
- настроить Fail2ban, чтобы ограничить количество попыток ввести неправильный пароль для входа на сервер;
- вместо прямого обращения к DNS-серверу можно настроить локальный сервер, который связывается с внешним миром при помощи DoH или DoT, чтобы даже хостер VPS не знал, какие DNS-запросы вы шлете;
- настроить учет трафика, чтобы не получить внезапный счет от хостера (если трафик у него лимитирован).
См. также Способы защиты сервера VPS
Одним словом, включайте фантазию и обустраивайте свой неприступный VPS!
Заключение
Кого может заинтересовать мой сетевой трафик? Да кого угодно! От хакеров до злых сетевых администраторов, которые любят перехватывать разные виды трафика. Кстати, данный способ может быть использован не только для защиты трафика, но и для более банального применения, когда нужно изменить IP-адрес (например, для просмотра зарубежных новинок в онлайн‑кинотеатре).
Полезные ссылки:
- Как поднять VPN-сервер на роутере
- Как обмануть провайдера и обойти DPI
- Как защититься от утечки VPN-трафика