Як дізнатися, чи успішно створений мій 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 вже запущений. The%h використовує ім'я хоста віддаленого хоста як частину імені файлу.

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


5

Цей тип тунелю не змінює інформацію про вашу ip-адресу. Все, що він робить, - це сказати вашому комп'ютеру відкрити порт 9999 і переслати з'єднання до цього порту на віддалену машину (tim @ сервер) через ваше з'єднання ssh. Найпростіший спосіб перевірити, що з'єднання встановлено, - це телнет до порту, на який було створено переадресацію (у вашому прикладі 9999):

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

Якщо ви отримаєте "Підключено до сервера". повідомлення, це означає, що ваш тунель працює. Якщо замість цього ви отримаєте: "Не вдається підключитися до віддаленого хоста: З'єднання відмовлено", ваш тунель не працює.

Що стосується вашого другого питання, то для вашого браузера ваш браузер не використовуватиме тунель, якщо ви цього не скажете. У мережевих налаштуваннях веб-переглядачів ви можете налаштувати параметри проксі-сервера та вказати localhost: 9999 як проксі-сервер socks5, а потім ваші веб-з'єднання повинні використовувати тунель ssh і, здається, походять з IP-адреси сервера.


+1 Дякую! (1) Коли я друкую на принтері в локальній мережі, як я знаю, щоб перейти до порту 9999, тобто використовувати тунель? Нічого іншого? (2) Чи існують типи тунелів, які змінюють мою ip-адресу?
Тім

@ Імовірно, саме цей принтер був налаштований для друку на певну IP-адресу та порт. Це залежить від налаштування принтера. Зазвичай ви можете вказати обидва, коли визначаєте принтер. Так, є типи тунелів, які матимуть власну IP-інформацію, пов’язану з ними. Зазвичай для цього ви створюєте окремий інтерфейс tun / tap en.wikipedia.org/wiki/TUN/TAP, до якого буде додана власна IP-адреса, і весь трафік, який виходить за цією адресою, буде надходити з іншої мережі .
габе.

Спасибі! У моїх налаштуваннях Firefox, в налаштуваннях розширеного -> з'єднання ->, я вибираю конфігурацію проксі вручну і ввожу "localhost" для HTTP Proxy і "9999" для його порту. Після цього я не можу підключитися до будь-якого веб-сайту Firefox. Цікаво, чому?
Тім

@ Тим, це трохи заплутано ... належна річ встановити: хост SOCKS, а не HTTP-проксі. У мене було те саме питання, коли я вперше спробував це.
габе.

1

У моєму випадку (Google Chrome на Ubuntu 14.10) моя зовнішня адреса змінюється, щонайменше, у межах браузера. Просто google "Яка моя IP-адреса?" з проксі-з'єднанням і без нього.

Крім того, після налаштування проксі, спробуйте знищити тунель і побачити, чи зможете ви все-таки отримати трафік. Коли я це роблю, chrome повертає помилку "Не вдається підключитися до проксі-сервера".

Інший спосіб: після тунелювання до віддаленого хосту створіть новий сеанс ssh та запустіть tcpdump -A dst port 80. Потім перейдіть на якусь сторінку і ви побачите пов’язаний трафік у терміналі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.