Shadowsocks на CentOS 7

В продолжение статьи по настройке SOCKS 5 прокси-сервера "Socks5 proxy на CentOS 7" настроим ещё один прокси-сервер - Shadowsocks. Тот прокси SOСKS 5 с авторизацией нельзя применить, например, в браузере Firefox, зато отлично можно применить, например, в Telegram. Этот же прокси можно будет применить для любого приложения, поддерживающего прокси. Но тут есть минус, чтобы это заработало, на клиентской машине нужно устанавливать ещё одну программу, которая выступает промежуточным звеном цепочки проксирования.
Основные моменты этой статьи почерпнуты из статьи "Create a SOCKS5 Proxy Server with Shadowsocks on Ubuntu and CentOS 7". Но попутно пришлось столкнуться с некоторыми трудностями.
Поясню для начала вот какой момент, а то сам я не сразу понял, что к чему. Есть несколько реализаций алгоритма прокси сервера Shadowsocks. Наиболее часто мне в сети попадались инструкции по настройке Python реализации, например, статья "Set up Your Own Shadowsocks Server On Debian, Ubuntu, CentOS". Так вот эта реализация, на сколько я понял, заброшена и постепенно устаревает. Есть более живая реализация на языке C - shadowsocks-libev. Эта статья про второй, более живой проект.

Установка сервера Shadowsocks

Готовых пакетов для CentOS на момент написания статьи (сентябрь 2018) не было. По-этому будет опсание компиляции из исходников.
sudo yum install epel-release -y
sudo yum install -y gcc gettext autoconf libtool automake make pcre-devel asciidoc xmlto udns-devel libev-devel libsodium-devel mbedtls-devel git m2crypto c-ares-devel
Переходим в каталог /opt выкачиваем исходные коды проекта:
cd /opt
git clone https://github.com/shadowsocks/shadowsocks-libev.git
cd shadowsocks-libev
git submodule update --init --recursive
По-хорошему, эти команды надо запускать от обычного пользователя. Но я делал от root (т.е. предварительно запустил команду su) .
Тут можно было бы приступить к компиляции, но на момент написания статьи в ветке master был код, который отказывался компилироваться. Я проверил и нашёл соответствующее обсуждение проблемы на github'е. Я там тоже отписался, подтвердив проблему на CentOS. Не долго думая, я нашёл последний релиз, переключил git на его коммит и скомпилировал его.
git checkout 8c98bde
Позже (декабрь 2018) я пробовал компилировать из ветки master и всё работало нормально. Так что такой обходной трюк в статье оставлю на всякий случай.
Компиляция (т.к. я проект развернул от root пользователя, то и все остальные команды тоже выполнял от root; хотя правильно только последнюю запускать от root):
./autogen.sh
./configure
make
make install
Если всё пройдёт нормально, то будут сообщения вида:
Libraries have been installed in:
   /usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
 /bin/mkdir -p '/usr/local/bin'
  /bin/sh ../libtool   --mode=install /bin/install -c ss-local ss-tunnel ss-server ss-manager ss-redir '/usr/local/bin'
libtool: install: /bin/install -c ss-local /usr/local/bin/ss-local
libtool: install: /bin/install -c ss-tunnel /usr/local/bin/ss-tunnel
libtool: install: /bin/install -c ss-server /usr/local/bin/ss-server
libtool: install: /bin/install -c ss-manager /usr/local/bin/ss-manager
libtool: install: /bin/install -c ss-redir /usr/local/bin/ss-redir
 /bin/mkdir -p '/usr/local/bin'
 /bin/install -c ss-nat '/usr/local/bin'
 /bin/mkdir -p '/usr/local/include'
 /bin/install -c -m 644 shadowsocks.h '/usr/local/include'
make[2]: Выход из каталога `/opt/shadowsocks-libev/src'
make[1]: Выход из каталога `/opt/shadowsocks-libev/src'
Making install in doc
make[1]: Вход в каталог `/opt/shadowsocks-libev/doc'
make[2]: Вход в каталог `/opt/shadowsocks-libev/doc'
make[2]: Цель `install-exec-am' не требует выполнения команд.
 /bin/mkdir -p '/usr/local/share/doc/shadowsocks-libev'
 /bin/install -c -m 644 shadowsocks-libev.html ss-local.html ss-manager.html ss-nat.html ss-redir.html ss-server.html ss-tunnel.html '/usr/local/share/doc/shadowsocks-libev'
 /bin/mkdir -p '/usr/local/share/man/man1'
 /bin/install -c -m 644 ss-local.1 ss-manager.1 ss-nat.1 ss-redir.1 ss-server.1 ss-tunnel.1 '/usr/local/share/man/man1'
 /bin/mkdir -p '/usr/local/share/man/man8'
 /bin/install -c -m 644 shadowsocks-libev.8 '/usr/local/share/man/man8'
make[2]: Выход из каталога `/opt/shadowsocks-libev/doc'
make[1]: Выход из каталога `/opt/shadowsocks-libev/doc'
make[1]: Вход в каталог `/opt/shadowsocks-libev'
make[2]: Вход в каталог `/opt/shadowsocks-libev'
make[2]: Цель `install-exec-am' не требует выполнения команд.
 /bin/mkdir -p '/usr/local/lib/pkgconfig'
 /bin/install -c -m 644 shadowsocks-libev.pc '/usr/local/lib/pkgconfig'
make[2]: Выход из каталога `/opt/shadowsocks-libev'
make[1]: Выход из каталога `/opt/shadowsocks-libev'

Конфиг сервера

После установки сервер, необходимо создать конфиг:
sudo nano /etc/shadowsocks.json
У меня получился такого вида:
{
"server":"your_server_ip",
"server_port":8388,
"password":"your_passwd",
"timeout":600,
"method":"aes-256-cfb"
}
Также сделал рекомендуемые в статье "Create a SOCKS5 Proxy Server with Shadowsocks on Ubuntu and CentOS 7" настойки самой операционной системы:
sudo nano /etc/sysctl.d/local.conf
# max open files
fs.file-max = 51200
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# default read buffer
net.core.rmem_default = 65536
# default write buffer
net.core.wmem_default = 65536
# max processor input queue
net.core.netdev_max_backlog = 4096
# max backlog
net.core.somaxconn = 4096
# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 1
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1
# for high-latency network
net.ipv4.tcp_congestion_control = hybla
# for low-latency network, use cubic instead
net.ipv4.tcp_congestion_control = cubic
Применить эти настройки:
sudo sysctl --system
Ещё я добавил правило фаервола (рекомендация из readme):
sudo iptables -A INPUT -p tcp --syn --dport 8388 -m connlimit --connlimit-above 32 -j REJECT --reject-with tcp-reset
Добавляем в систему пользователя, от которого будет запущен shadowsocks сервер:
sudo adduser --system --no-create-home -s /bin/false shadowsocks
Создаём systemd сервис для удобного запуска/остановки прокси:

sudo nano /etc/systemd/system/shadowsocks.service

Содержимое такое:

[Unit]
Description=Shadowsocks proxy server

[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/ss-server -c /etc/shadowsocks.json -a shadowsocks -v start
ExecStop=/usr/local/bin/ss-server -c /etc/shadowsocks.json -a shadowsocks -v stop

[Install]
WantedBy=multi-user.target

Запуск и постановка на автоматический запуск:

sudo systemctl daemon-reload

sudo systemctl enable shadowsocks

sudo systemctl start shadowsocks

Добавляем правило в Firewalld:

sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" port protocol="tcp" port="8388" accept'

sudo firewall-cmd --reload

Установка клиентской части

Серверную часть настроили. Теперь нужно подключиться к собственному прокси-серверу с другого места. Например, из настольной операционной системы Ubuntu.
Первым делом устанавливаем специальную клиентскую утилиту Shadowsocks-qt5:
sudo add-apt-repository ppa:hzwhuang/ss-qt5
sudo apt-get update
sudo apt-get install shadowsocks-qt5
После установки добавляем соединение и вбиваем наши настройки для соединения. Указываем IP адрес нашего сервера. Server port из настроек сервера - в нашем случае - 8388. Локальный порт выбираем не занятый на локальном компьютере, например, 1080. Выбираем тот же тип шифрования, что и в настройках сервера - AES-256-CFB.
Проверим, всё ли работает, как надо. Для этого откроем в консоли наш удалённый сервер (через SSH) и запустим там просмотр всех событий системы:
sudo journalctl -f
Теперь на клиентском приложении выделяем созданное подключение, нажимаем кнопку Connect, а затем Test Latency. Если всё хорошо, то в клиентском приложении появится сообщение со скоростью времени отклика, а в консоли сервера будут только сообщения об успехе:
Если всё успешно, то можно настраивать использование собственного прокси-сервера. Для использования нужно прописывать параметры прокси:
адрес: 127.0.0.1 (т.е. локальный адрес, а не наш удалённый сервер)
порт: 1080 (т.е. локальный порт, который мы назначили в настройках соединения).
Например, я это сделал в расширении браузера Firefox - FoxyProxy:
Теперь в любой момент, когда нужно зайти на какой-то сайт через прокси, можно выбрать свой прокси из списка расширения:
Можно в онлайн-сервисе (типа https://www.myip.com/) проверить свой IP - должен определиться как адрес вашего прокси.
Аналогично можно настроить на практически любой другой операционной системе. Список официальных клиентов ищите на официальном сайте Shadowsocks. Например, можно настроить себе прокси на Android:
1. Скачиваем официальное приложение Shadowsocks из официального Google Play Market
2. Настраиваем подключение к собственному серверу:
3. Подключаем соединение кнопкой с иконкой самолётика (при этому в статусной строке должен появиться ключик):
Теперь можно меньше переживать об угоне данных, когда через Wi-Fi кафе работаете с конфиденциальной информацией (например, онлайн-оплата на сайтах).


Комментарии

Популярные сообщения из этого блога

Пропорциональное распределение суммы

Битрикс: своя геолокация

Bitrix24 API - разбор демо приложения третьего типа