June 9, 2022

Хакер - Неприступный VPS. Строим защищенный канал с внешним миром

https://t.me/hacker_frei

Nik Zerof

Содержание статьи

  • VPS
  • Доменное имя
  • Cloudflare
  • Настройка VPS

В нашем пол­ном опас­ностей, чрез­вычай­но жес­током мире нуж­но уметь защищать свою жизнь, иму­щес­тво, тра­фик и дра­гоцен­ные фоточ­ки с котика­ми. В этой статье я рас­ска­жу, как нас­тро­ить защищен­ный канал свя­зи с внеш­ним миром, который будет слож­но отли­чить от обыч­ного HTTPS-тра­фика и, сле­дова­тель­но, заб­локиро­вать или рас­шифро­вать. Кол­дунс­тво­вать мы будем с помощью прок­си Shadowsocks с пла­гином xray. Все ПО на находит­ся в акту­аль­ном сос­тоянии и пос­тоян­но обновля­ется.

WARNING

Ин­форма­ция пре­дос­тавле­на исклю­читель­но для озна­коми­тель­ных и ака­деми­чес­ких целей. Автор про­сит соб­людать законо­датель­ство той стра­ны, на тер­ритории которой ты находишь­ся!

Кто может инте­ресо­вать­ся тво­ими сетевы­ми соеди­нени­ями? Да кто угод­но! От хакер­ских груп­пировок до злоб­ных адми­нов, которые любят шей­пить раз­ные типы тра­фика (нап­ример, наши любимые тор­ренты). Да и прос­то иног­да тре­бует­ся сме­нить IP (нап­ример, что­бы пос­мотреть зарубеж­ную новин­ку в онлайн‑киноте­атре).

Итак, перед нас­трой­кой соф­та нам при­дет­ся занять­ся необ­ходимы­ми под­готови­тель­ными работа­ми:

  • ку­пить VPS;
  • ку­пить домен­ное имя;
  • за­регис­три­ровать­ся на Cloudflare и выпол­нить необ­ходимую нас­трой­ку.

Раз­берем по поряд­ку.

VPS

Что­бы свес­ти рис­ки к миниму­му, необ­ходимо выбирать хос­тера VPS дос­таточ­но дотош­но — обра­щай вни­мание на то, в каком государс­тве зарегис­три­рова­но юри­дичес­кое лицо, в каких стра­нах физичес­ки рас­положе­ны сер­веры. Пред­почте­ние сле­дует отда­вать тем, где законо­датель­ство стро­го отно­сит­ся к лич­ной информа­ции (нап­ример, Швей­цария или Исландия). Это каса­ется как мес­та регис­тра­ции юри­дичес­кого лица, так и физичес­кого нахож­дения сер­веров.

Кро­ме того, не сле­дует забывать про «аль­янс 14 глаз» (Авс­тра­лия, Бель­гия, Великоб­ритания, Гер­мания, Дания, Испа­ния, Ита­лия, Канада, Нидер­ланды, Новая Зелан­дия, Нор­вегия, США, Фран­ция, Шве­ция) — это стра­ны, которые сво­бод­но обме­нива­ются раз­веддан­ными друг с дру­гом (законо­датель­ство у них соот­ветс­тву­ющее). Если твои дан­ные попали в руки одной стра­ны из это­го спис­ка, мож­но счи­тать, что осталь­ные тоже их получи­ли.

Кро­ме того, есть стра­ны, которые так или ина­че сот­рудни­чают с аль­янсом: Южная Корея, Япо­ния, Изра­иль, Син­гапур. Это на уров­не слу­хов, но, как извес­тно, дыма без огня не быва­ет. Мож­но мно­го говорить о том, что кон­крет­но ты им не нужен, что у них и без тебя забот пол­но, — тут каж­дый реша­ет для себя, что ему важ­нее. Нап­ример, автор эти стра­ны сра­зу вычер­кнул из спис­ка кан­дидатов. Итак, VPS купили, идем даль­ше.

ДОМЕННОЕ ИМЯ

Здесь нет никаких осо­бых тре­бова­ний, хочу толь­ко отме­тить, что час­то хос­тинги VPS заод­но тор­гуют и домен­ными име­нами. На мой взгляд, более секь­юрно исполь­зовать воз­можнос­ти того же хос­тинга VPS, чем обра­щать­ся в дру­гую ком­панию и там по вто­рому кру­гу све­тить свои дан­ные. В этой статье мы будем исполь­зовать некий абс­трак­тный домен secret-site.com. Идем даль­ше.

INFO

По­чему не сле­дует исполь­зовать ESNI/ECH? Все очень прос­то: если некото­рые сетевые филь­тры не могут опре­делить сайт наз­начения, то они прос­то бло­киру­ют соеди­нение.

CLOUDFLARE

Cloudflare в нашей цепоч­ке игра­ет роль защит­ного механиз­ма: мы скры­ваем нас­тоящий IP нашего VPS и защища­ем его от некото­рых видов атак. Тра­фик от нашего ком­па будет идти сна­чала в сеть Cloudflare и толь­ко из нее — к нашему VPS. Кро­ме того, Cloudflare сге­нери­рует сер­тификат для TLS-соеди­нения, и весь тра­фик на всем пути сле­дова­ния будет завер­нут в TLS 1.3.

Для начала нам нуж­но прой­ти регис­тра­цию и при­вязать к сер­вису куп­ленный домен. Далее на вклад­ке DNS нуж­но запол­нить стро­ки А (две шту­ки), в которые мы вво­дим наш домен (в одну стро­ку с прис­тавкой www, в дру­гую без нее) и IP нашего VPS.

За­пол­нение записей А

Пос­ле это­го необ­ходимо ввес­ти показан­ные нам сер­веры имен Cloudflare в панель управле­ния нашего домен­ного регис­тра­тора на вклад­ке DNS.

Сер­веры имен Cloudflare

Да­лее на вклад­ке 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 11 x64.

Сна­чала обно­вим пакеты и уста­новим вспо­мога­тель­ные ути­литы:

apt update && apt upgrade -y

apt install -y dnsutils nethogs vnstat sendmail fail2ban nano wget unzip htop psmisc nginx

Те­перь раз­берем­ся с сер­тифика­тами и клю­чами от Cloudflare — их мы положим на наш VPS в пап­ку /etc/ssl/ и выдадим ей пра­ва толь­ко на чте­ние.

Да­лее надо сге­нери­ровать параметр Диф­фи — Хел­лма­на:

openssl dhparam -out /etc/ssl/dh-param.pem 4096

По­ложим его в ту же пап­ку /etc/ssl/.

Те­перь прис­тупим к нас­трой­кам Nginx в фай­ле /etc/nginx/nginx.conf — в его стан­дар­тную струк­туру дос­таточ­но добавить наш сер­тификат, ключ, DH и некото­рые слу­жеб­ные нас­трой­ки:

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;

Да­лее добавим локации:

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:

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 и копиру­ем в нее нуж­ные фай­лы:

mv ssserver /bin

mv xray-plugin /etc/shadowsocks/xray-plugin

Нас­тра­иваем раз­решения:

setcap 'cap_net_bind_service=+eip' /etc/shadowsocks/xray-plugin

setcap 'cap_net_bind_service=+eip' /bin/ssserver

Те­перь соз­дадим файл кон­фигура­ции сер­вера Shadowsocks:

touch /etc/shadowsocks/shadowsocks-rust.json

nano /etc/shadowsocks/shadowsocks-rust.json

И запишем туда такой текст:

{

"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:

nano /etc/systemd/system/ss-xray.service

За­писы­ваем туда сле­дующий текст:

[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. Вклю­чаем сер­вис:

sysctl -p && systemctl enable ss-xray.service

С основной нас­трой­кой мы закон­чили, теперь мож­но нем­ного опти­мизи­ровать сетевой стек. В файл /etc/sysctl.conf дописы­ваем сле­дующее:

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 с каким‑то сай­том, но что переда­ет — узнать не получит­ся, ибо шиф­рование. Дру­гими сло­вами, наб­люда­ется обыч­ная сетевая активность, чего мы и хотели добить­ся.

В качес­тве кли­ентов к сер­ваку мож­но сме­ло юзать:

Как еще мож­но укре­пить наш VPS? Нап­ример, так:

  • сме­нить порт SSH для того, что­бы авто­мати­чес­кие ска­неры не ломились на стан­дар­тный порт;
  • нас­тро­ить Fail2ban, что­бы огра­ничить количес­тво попыток ввес­ти неп­равиль­ный пароль для вхо­да на сер­вер;
  • вмес­то пря­мого обра­щения к DNS-сер­веру мож­но нас­тро­ить локаль­ный сер­вер, который свя­зыва­ется с внеш­ним миром при помощи DoH или DoT, что­бы даже хос­тер VPS не знал, какие DNS-зап­росы ты шлешь;
  • нас­тро­ить учет тра­фика, что­бы не получить вне­зап­ный счет от хос­тера (если тра­фик у него лимити­рован).

Од­ним сло­вом, вклю­чай фан­тазию и обус­тра­ивай свой неп­риступ­ный VPS!

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei