<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; Построение защищенных туннелей (ssh)]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=223&amp;type=atom" />
	<updated>2010-02-23T17:37:59Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=223</id>
		<entry>
			<title type="html"><![CDATA[Построение защищенных туннелей (ssh)]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=2326#p2326" />
			<content type="html"><![CDATA[<p>Автор: Кузнецов Константин</p><p>[size=7]Построение защищенных туннелей (ssh)[/size]</p><p>План:<br />1. Введение<br />2. Локальный зашифрованный туннель<br />3. Удаленный зашифрованный туннель<br />4. Динамический туннель (socks-proxy)<br />5. Используемая и рекомендуемая литература.</p><p>------------------------------------------------------------------------------------</p><p>[size=6]1. Введение[/size]</p><p>Представим, что нам нужно подключиться к компьютеру, имеющему серый ip-адрес. Чисто логически, как это можно реализовать? По-любому, между сервером (у которого серый адрес) и клиентом (у которого все равно какой адрес) должен быть какой-то промежуточный хост с внешним адресом, который будет ловить соединения от клиента и перебрасывать каким-либо образом серверу. Можно это реализовать с помощью iptables (DNAT), а можно другим интересным способом, имеющим некоторые принципиальные отличия.<br />Во-первых, в случае использования защищенного туннеля ssh соединение будет зашифровано так, как будто используется зашифрованный VPN-канал. Кстати, некоторые администраторы преподносят этот способ именно как замена vpn.<br />Во-вторых, DNAT способен соединить нас с &quot;серым&quot; сервером только в том случае, когда у компьютера, на котором настроен этот самый DNAT имеется маршрут до &quot;серого&quot; сервера (например, они в одной подсети). А при использовании данного метода это обстоятельство совсем не обязательно. Так же, мы сможем решить проблему соединения с серым сервером в том случае, когда он находится за шлюзом, доступ к которому мы получить не можем.</p><p>Итак, что мы должны иметь для решения задачи доступа к &quot;серому&quot; серверу:<br />1) Серый сервер - сервер с запущеными на нем службами и с серым ip-адресом. В этой роли может выступать, например, linux-компьютер или любая клиентская windows-машина c vnc или radmin в качестве сервиса.<br />2) Белый сервер - управляемый нами linux-сервер с внешним ip-адресом. Он может быть как в одной подсети с Серым сервером, так и в разных. Управляемый - это значит, что у нас есть определенные права доступа к данному серверу по протоколу ssh.<br />3) Клиент -компьютер, с которого подразумевается соединение к Серому серверу. Он должен иметь удаленный доступ к Белому серверу, что вполне очевидно.</p><p>Имеются два варианта решения задачи подключения Клиента к Серому серверу, различающиеся положением Белого сервера в цепочке подключений. </p><p>------------------------------------------------------------------------------------</p><p>[size=6]2. Локальный зашифрованный туннель[/size]</p><p>Сначала рассмотрим тот случай, когда Серый сервер и Белый сервер находятся в разных подсетях и Белый не имеет маршрута до Серого.<br /><span class="postimg"><img src="http://s53.radikal.ru/i141/1001/fc/1c3b50659e41.jpg" alt="http://s53.radikal.ru/i141/1001/fc/1c3b50659e41.jpg" /></span><br />Такая задача является самой распространенной и её не решить с помощью DNAT. В данном случае необходимо инициировать тунель от Серого сервера к Белому серверу, в результате которого Белый сервер будет слушать соединения на каком-то из заранее свободных портов и передавать их Серому, т.е. запускать соединения в зашифрованный тунель, выход из которого ведет к Серому серверу. Кстати, выход из этого тунеля на стороне Серого сервера еще не подразумевает конец пути: можно настроить так, что Серый сервер будет перенаправлять вышедшие из тунеля соединения далее к компьютерам, к которым он имеет маршруты.</p><p>В случае использования на Сером сервере операционной системы linux (или bsd, разница между которыми в данном случае не принципиальна), это соединение (тунель) устанавливается путем подключения Серого к Белому по протоколу ssh с некоторыми определенными опциями. Опции, которые нам понадобятся, таковы:<br />а) &quot; -N &quot; Не выполнять никаких команд на Белом сервере после инициализации соединения (т.е. просто повиснуть и все, как раз разработана для установки тунелей). В противном случае у нас будет возможность управлять Белым сервером, но это лишнее, так что отключаем.<br />б) &quot; -R port:host:hostport &quot; Установить тунель, вход в который будет на Белом сервере, т.е. Белый сервер будет слушать соединения на порте &quot;port&quot;, передавать их по зашифрованному тунелю Серому серверу, который в свою очередь будет их при выходе из тунеля перенаправлять в расшифрованном виде на компьютер host на порт hostport, например localhost.<br />в) &quot; -g &quot; По-умолчанию, инициированный тунель принимает соединения только от того компьютера, на котором располагается вход в этот тунель. Это сделано в целях безопасности. Данный ключ отменяет это ограничение.</p><p>Итак, ближе к делу. На Сером сервере выполняем:</p><div class="codebox"><pre><code>ssh -N -g -R 6003:localhost:22 user@whiteip</code></pre></div><p>Если демон ssh висит на Белом сервере на другом порте (например 2345), то комманда будет выглядеть так:</p><div class="codebox"><pre><code>ssh -N -g -p 2345 -R 6003:localhost:22 user@whiteip</code></pre></div><p>whiteip - адрес (ip или полное интернет-имя) Белого сервера. Нам понадобится пароль пользователя user на Белом сервере, а в случае инициации тунеля скриптом, который не сможет ввести пароль, необходимо использовать беспарольную авторизацию по ключам. Далее, из любого места мы можем соединиться с Белым сервером на порт 6003 и в итоге получим подключение к Серому серверу на порт 22. Если бы мы вписали вместо &lt;&lt; 6003:localhost:22 &gt;&gt; нечто такое &lt;&lt; 6003:192.168.0.2:22 &gt;&gt;, то мы получили бы соединение не с Серым сервером, а с компьютером, находящимся с Серым сервером в одной подсети и имеющим адрес 192.168.0.2.</p><p>------------------------------------------------------------------------------------</p><p>[size=6]3. Удаленный зашифрованный туннель[/size]</p><p>Теперь рассмотрим тот случай, когда Серый сервер и Белый сервер находятся в одной подсети.<br /><span class="postimg"><img src="http://s53.radikal.ru/i140/1001/80/03abda42e602.jpg" alt="http://s53.radikal.ru/i140/1001/80/03abda42e602.jpg" /></span><br />Лично я в таком случае предпочитаю использовать DNAT на Белом сервере, но для полноты картины опишем и эту возможность тунелирования. В данном случае трафик, проходящий через интернет, шифруется. На Клиентском компьютере инициируется тунель, ведущий к Белому серверу, при выходе из которого трафик заворачивается на Серый сервер. При этом в тунель может попасть трафик и от соседних для Клиента компьютеров.</p><div class="codebox"><pre><code>ssh -N -g -L 3389:192.168.0.2:3389 user@whiteip</code></pre></div><p>------------------------------------------------------------------------------------</p><p>[size=6]4. Динамический туннель (socks-proxy)[/size]</p><p>У ssh есть еще одна интересная возможность - организовывать socks-proxy-server. Для этого необходимо выполнить команду</p><div class="codebox"><pre><code>ssh -D ip:port user@server</code></pre></div><ul><li><p>server - компьютер, на котором хотим повесить socks-proxy<br />user - пользователь на компьютере server<br />ip - адрес компьютера server, на котором будет висеть socks-proxy<br />port - порт, на котором будет висеть socks-proxy</p></li></ul><p>В самом простом случае команда будет выглядеть так:</p><div class="codebox"><pre><code>ssh -D 62.5.246.190:8080 user@localhost</code></pre></div><p>После чего мы можем запустить любое сетевое приложение, поддерживающее соединение через socks-proxy (у меня под рукой оказалось таких два: openvpn-client-gui и аська qip). В настройках которых я прописал ip-адрес 62.5.246.190 и порт 8080 (без аутентификации).</p><p>------------------------------------------------------------------------------------</p><p>[size=6]5. Используемая и рекомендуемая литература.[/size]</p><p><a href="http://www.opennet.ru/base/sec/ssh_tunnel.txt.html">Перенаправление портов в SSH</a><br /><a href="http://my-ubuntu-land.blogspot.com/2009/06/howto-perform-udp-tunneling-through-ssh.html">Howto perform UDP tunneling through SSH connection</a><br /><a href="http://www.opennet.ru/tips/info/2157.shtml">Поддержание SSH-туннеля в активном состоянии при помощи Auto</a></p>]]></content>
			<author>
				<name><![CDATA[forkostya]]></name>
				<uri>https://linuxforum.ru/profile.php?id=340</uri>
			</author>
			<updated>2010-02-23T17:37:59Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=2326#p2326</id>
		</entry>
</feed>
