Как узнать, успешно ли создан мой ssh-туннель?

21

Я полагаюсь на следующий скрипт, tunnel.shнаписанный другими, чтобы поддерживать ssh-туннель живым:

#!/bin/bash
export SSH_HOST=tim@server 

if [ ! -f /tmp/.tunnel ] 
then
echo "Creat SSH tunnel"
ssh -f -D 9999 $SSH_HOST "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done" & 
touch /tmp/.tunnel 
else
echo "Close SSH tunnel"
ssh $SSH_HOST "touch ~/.tunnel" 
rm /tmp/.tunnel 
fi
exit

Чтобы создать постоянный туннель SSH, я просто выпускаю tunnel.sh. Туннель не будет закрыт, пока я не выдам tunnel.shснова.

Мне было интересно, как я могу проверить, действительно ли туннель SSH успешно создан?

Мое основное использование туннеля - это печать документов на некоторые принтеры в той же локальной сети, что и сервер, и доступ к принтерам возможен только из локальной сети. После создания туннеля теперь печать не сообщает о каких-либо проблемах, но, поскольку я не нахожусь там физически, я не могу проверить, действительно ли документы были напечатаны.

Я думал, так как я теперь в локальной сети благодаря туннелю, мой внешний IP-адрес должен быть таким же, как у сервера. Но на самом деле они не одинаковы (я узнал их wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'). Интересно, почему? Когда я подключаюсь к какому-либо веб-сайту в Интернете с живым туннелем, разве сервер не является средней точкой между мной и интернет-сайтом в соединении из-за туннеля между мной и сервером?

Тим
источник

Ответы:

25

Это намного сложнее, чем нужно :-)

Запустите туннель:

ssh -f -N -D 9999 -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"

Остановите туннель:

ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST

,

Это все, что вам нужно сделать. Если вы хотите узнать подробности, пропустите ниже.

Для вашего второго вопроса, IP один. Нет, ваш IP не меняется. Все, что вы сделали, это создали прокси SOCKS через удаленный хост. Ваша система не использует этот прокси-сервер автоматически, если вы не сообщите об этом.

Объяснение SSH
Аргументы для запуска туннеля
-f:: Скажите ssh самому фону. Он будет фоновым только в случае успешного запуска (работает с -oаргументом ниже).
-o ExitOnForwardFailure=yes: Это говорит ssh о выходе, если он не может установить прокси SOCKS.
-N: Не выполнять команду. Мы просто хотим туннелировать, а не делать что-либо на удаленном хосте.
-D 9999: Ваш SOCKS прокси.
-M: Это необходимо, чтобы аргумент -S работал здесь.
-S /tmp/ssh_tunnel_%h.sock: Это говорит ему использовать /tmp/ssh_tunnel_HOSTNAME.sock для своего управляющего сокета. -MВариант рассказывает , что потребности SSH установить этот сокет и не отдавайте команды к другой SSH уже прослушивает сокет. Вы можете использовать этот сокет для установки дополнительных туннелей после того, как ssh уже запущен. %h использует имя удаленного хоста как часть имени файла.

Аргументы за остановку туннеля
-S /tmp/ssh_tunnel_%h.sock: Это должно быть очевидно. Однако, поскольку мы не выдавали -M, это означает, что ssh должен подключиться к уже существующему сокету и сказать ему, что делать, а не делать что-либо самому.
-O exitЭто часть -S. Мы говорим ssh, слушающему сокет, выйти.
Это $SSH_HOSTвсе еще требуется здесь. Даже если бы вы указали абсолютный путь к сокету, не используя %hв имени файла, ssh все равно хотел бы указать удаленный хост. Вот почему я положил %hв аргументы. Можно также использовать его, если ssh будет запрашивать хост, и он будет организован.

Патрик
источник
5

Этот тип туннеля не меняет информацию о вашем IP-адресе. Все, что он делает, это говорит компьютеру открыть порт 9999 и перенаправляет соединения на этот порт на удаленный компьютер (tim @ server) через ваше соединение ssh. Самый простой способ проверить, что соединение установлено, - это подключиться к порту, на котором была создана переадресация (в вашем примере 9999):

$ telnet localhost 9999
Пробует сервер ...
Подключен к серверу.
Escape-символ '^]'.

Если вы получили «Подключен к серверу». сообщение, это означает, что ваш туннель работает. Если вместо этого вы получаете: «Невозможно подключиться к удаленному хосту: соединение отказано», ваш туннель не работает.

Что касается вашего второго вопроса, то для вашего браузера ваш браузер не будет использовать туннель, если вы не скажете это. В сетевых настройках браузера вы можете настроить параметры прокси-сервера и указать localhost: 9999 в качестве прокси-сервера socks5, а затем ваши веб-соединения должны использовать туннель ssh и, по-видимому, исходить от IP-адреса сервера.

Гейб.
источник
+1 Спасибо! (1) Когда я печатаю на принтере в локальной сети, как он узнает, чтобы перейти к порту 9999, то есть использовать туннель? Больше ничего? (2) Существуют ли типы туннелей, которые изменяют информацию о моем IP-адресе?
Тим
@ Скорее всего, этот конкретный принтер был настроен на печать с определенным IP-адресом и портом. Это зависит от того, как настроен ваш принтер. Как правило, вы можете указать оба, когда вы определяете принтер. Да, есть типы туннелей, которые будут иметь свою собственную информацию IP, связанную с ними. Обычно для этого вы создаете отдельный интерфейс tun / tap en.wikipedia.org/wiki/TUN/TAP, к которому будет привязан собственный IP-адрес, и весь трафик, исходящий из этого адреса, будет поступать из другой сети. ,
таращиться
Благодарность! В настройках моего Firefox, в разделе «Дополнительно» -> «Подключение» -> «Настройки», я выбираю ручную настройку прокси-сервера и набираю «localhost» для HTTP-прокси и «9999» для его порта. После этого я не могу подключиться к любому веб-сайту в Firefox. Интересно, почему?
Тим
@ Это немного сбивает с толку ... правильная настройка: хост SOCKS, а не HTTP-прокси. У меня была такая же проблема, когда я впервые попробовал это.
таращиться
1

В моем случае (Google Chrome на Ubuntu 14.10) мой внешний адрес меняется, по крайней мере, в браузере. Просто Google "Какой мой IP-адрес?" с прокси-соединением и без него.

Кроме того, после того, как вы настроите прокси-сервер, попробуйте уничтожить туннель и посмотреть, сможете ли вы по-прежнему получать трафик. Когда я делаю это, Chrome возвращает ошибку «Невозможно подключиться к прокси-серверу».

Другой способ: после туннелирования на удаленный хост создайте новый сеанс ssh и запустите tcpdump -A dst port 80. Затем перейдите на некоторую страницу, и вы должны увидеть связанный трафик в терминале.

onlyanegg
источник