Stunnel как Socks сервер

Thank you for reading this post, don't forget to subscribe!

Неболь­шая ути­ли­та stunnel поз­во­ля­ет обес­пе­чить ssl шиф­ро­ва­ние для тра­фи­ка, кото­рый изна­чаль­но не обла­да­ет такой защи­той. Одна­ко, исполь­зо­ва­ние дан­ной про­грам­мы не огра­ни­чи­ва­ет­ся обо­зна­чен­ной зада­чей. Недав­но наткнул­ся на один инте­рес­ный спо­соб исполь­зо­ва­ния дан­ной ути­ли­ты. С помо­щью толь­ко stunnel мож­но орга­ни­зо­вать Socks прок­си без исполь­зо­ва­ния допол­ни­тель­но­го ПО. При этом это будет про­стей­ший вари­ант для част­но­го при­ме­не­ния. Под­клю­чать сто­рон­них поль­зо­ва­те­лей будет крайне не разум­но при таком вари­ан­те. Как это настро­ить и запу­стить поста­ра­юсь пока­зать в оной ста­тье. В этом про­цес­се так­же важ­но пони­мать, что stunnel уста­нав­ли­ва­ет­ся и настра­и­ва­ет­ся как со сто­ро­ны сер­вер­ной части, так и с кли­ент­ской. То есть, если вы реши­ли исполь­зо­вать эту ути­ли­ту, при­дет­ся замо­ра­чи­вать­ся на кон­фи­гу­ра­цию так­же и кли­ент­ской стороны.

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

Для кон­фи­гу­ра­ции сер­ве­ра нам необ­хо­ди­мо ска­чать и уста­но­вить ути­ли­ту stunnel на хост. Так в Ubuntu это мож­но сде­лать с помо­щью сле­ду­ю­щей коман­ды (сра­зу ого­во­рюсь, что в Ubuntu 18.04 пакет stunnel из обще­го репо­зи­та­рия име­ет баг, поэто­му необ­хо­ди­мо вос­поль­зо­вать­ся уста­нов­кой из исходников):

# sudo apt-get update
# sudo apt install stunnel4

Для аутен­ти­фи­ка­ции при рабо­те тун­не­ля мы будем исполь­зо­вать сер­ти­фи­ка­ты x.509. Для это­го перей­дем в пап­ку /etc/stunnel и созда­дим необ­хо­ди­мые фай­лы с помо­щью ути­ли­ты openssl.

# cd /etc/stunnel
# sudo openssl genrsa -out key.pem 2048
# sudo openssl req -new -x509 -key key.pem -out cert.pem -days 3650
# cat key.pem cert.pem >> stunnel.pem

Теперь необ­хо­ди­мо создать файл кон­фи­гу­ра­ции /etc/stunnel/stunnel.conf, в кото­ром будет ука­за­но как stunnel будет рабо­тать на сер­ве­ре. В част­но­сти, в нашем теку­щем при­ме­ре мы настро­им гло­баль­ные пере­мен­ные, такие как рабо­чая дирек­то­рия, поль­зо­ва­тель и груп­па, от кото­рых будет запус­кать­ся stunnel. Кро­ме это­го в кон­фи­гу­ра­ци­он­ном фай­ле ука­зы­ва­ет­ся серв­сис socks, кото­рый будет исполь­зо­вать­ся нами в дан­ном при­ме­ре. Так соеди­не­ния на сер­вер будут при­ни­мать­ся на TCP порт 23456 на всех интерфейсах.

Для того, что­бы сер­вис stunnel стар­то­вал авто­ма­ти­че­ски нам необ­хо­ди­мо отре­дак­ти­ро­вать файл /etc/default/stunnel4. Стро­ка с пара­мет­ром ENABLED долж­на выгля­деть сле­ду­ю­щим образом.

ENABLED=1
После редак­ти­ро­ва­ния фай­ла необ­хо­ди­мо сохра­нить его.

Теперь пере­за­пу­стим служ­бу stunnel в опе­ра­ци­он­ной систе­ме с помо­щью сле­ду­ю­щей коман­ды и сер­вис дол­жен пол­но­цен­но зара­бо­тать и начать при­ни­мать вхо­дя­щие соединения.

# sudo /etc/init.d/stunnel4 restart
После настрой­ки и запус­ка stunnel в рабо­ту, в слу­чае исполь­зо­ва­ния фаер­во­ла на сер­ве­ре, нуж­но будет скон­фи­гу­ри­ро­вать соот­вет­ству­ю­щие пра­ви­ла для при­е­ма вхо­дя­щих соеди­не­ний. Как это сде­лать, остав­лю за рам­ка­ми дан­ной статьи.

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

Для того, что­бы тун­нель зара­бо­тал, нам необ­хо­ди­мо уста­но­вить и настро­ить stunnel на кли­ент­ской сто­роне. Это мож­но сде­лать на опе­ра­ци­он­ной систе­ме MS Windows, раз­лич­ных дис­три­бу­ти­вах Linux или Mac OS. К при­мер, для тех­ни­ки Apple уста­нов­ка stunnel про­из­во­дит­ся через мене­джер паке­тов Homebrew сле­ду­ю­щим обра­зом в консоли.

# brew install stunnel
После того, как пакет будет уста­нов­лен на Mac OS, созда­дим дирек­то­рию, где будут нахо­дить­ся кон­фи­гу­ра­ци­он­ные фай­лы. Перей­дем в нее и ско­пи­ру­ем с помо­щью коман­ды scp файл stunnel.pem с сер­ве­ра. Так­же созда­дим в этой дирек­то­рии кон­фи­гу­ра­ци­он­ный файл stunnel.conf, со сле­ду­ю­щим содержимым.

В дан­ном фай­ле мы ука­зы­ва­ем stunnel рабо­тать в каче­стве кли­ен­та. При этом обо­зна­ча­ет­ся сер­вис socks, кото­рый будет при­ни­мать под­клю­че­ния на интер­фей­се localhost TCP:1178 пор­ту кли­ент­ско­го ком­пью­те­ра и пере­на­прав­лять их на уда­лен­ный сер­вер на TCP:23456 порт.

Что­бы кли­ент­ская часть зара­бо­та­ла, запу­стим сер­вис сле­ду­ю­щим образом.

# sudo stunnel ./stunnel.conf
Теперь доста­точ­но ука­зать в настрой­ках бра­у­зе­ра на кли­ент­ском ком­пью­те­ре SOCKS прок­си сер­вер — localhost:1178 и вуа­ля тра­фик пой­дет через скон­фи­гу­ри­ро­ван­ный ssl туннель.

Напо­сле­док ниже пока­жу коман­ду, с помо­щью кото­рой мож­но оста­но­вить stunnel на кли­ент­ском ком­пью­те­ре в слу­чае необходимости.

# sudo pkill stunnel