1 <html><head><title>По ssh через firewall-ы</title></head>
2 <meta name="description" content="Скрипт для хождения по ssh внутрь
3 локальных сетей, если у вас есть логин на gateway">
7 <h1>По ssh через firewall-ы</h1>
9 Нет ничего сложного в том, чтобы зайти по ssh на машину за файрволл-ом с
10 NAT, если у вас есть логин на сам firewall. Особенно, если на этом
11 firewall-е установлен netcat.
14 У openssh есть полезная опция ProxyCommand, которая может быть использована
15 для этой цели. Например можно написать в свой <tt>.ssh/config</tt>
17 </p><pre> Host *.intranet.mycompany.com
18 ProxyCommand ssh firewall.mycompany.com nc -q 0 %h 22
21 После этого при попытке пойти по ssh на любой хост в домене
22 intranet.mycompany.com будет производиться запуск netcat на машине
23 firewall.mycompany.com, который и будет доставлять информацию от вашего
24 ssh на 22 порт требуемой машины (обратите внимание на опцию -q 0).
27 Проблемы возникают если ваша машина — ноутбук, и находится то в
28 корпоративном интранете, то только снаружи.
30 <p> Нижеприведенный шелловский скрипт эту проблему решает. К нему
31 имеется файл конфигурации, в котором описывается список nat-сетей, в
32 которые хочется ходить по ssh.
34 Предусмотрены две директивы:
36 <dt>add_domain <i>domain</i> <i>host...</i>
37 </dt><dd>Задает список хостов, которые принадлежат некоторой сети. В случае
38 если скрипт вызван с указанием одного из этих хостов без домена,
39 считать, что хост принадлежит указанному домену
40 </dd><dt>proxy <i>proxy_host</i> <i>domain_mask</i>
41 </dt><dd>Указывает на какой машине следует запускать netcat для доступа к
42 хостам указанного домена. <i>domain_mask</i> может содержать звездочки и
43 другие метасимволы, допустимые в команде <b>case</b> shell. С маской
44 сопоставляются имена хостов, дополненные доменными именами в
45 соответствии с командой add_domain.
47 <table border="0"><tbody><tr>
48 <td bgcolor="#000000">
49 <font color="#ffffff"><pre><font color="#8080ff">#!/bin/sh</font>
50 <font color="#00ffff">host</font>=<font color="#ff40ff">$1</font>
51 <font color="#ffff00">shift</font>
52 declare <font color="#ff40ff">-a</font> OPTIONS
53 <font color="#00ffff">myhost</font>=<font color="#ff40ff">`hostname -f`</font>
54 add_domain() <font color="#ff40ff">{</font>
55 <font color="#00ffff">domain</font>=<font color="#ff40ff">$1</font>
56 <font color="#ffff00">shift</font>
57 <font color="#ffff00">for</font> i <font color="#ffff00">do</font>
58 <font color="#ffff00">if</font> <font color="#ffff00">[</font> <font color="#ffff00">"</font><font color="#ff40ff">$i</font><font color="#ffff00">"</font> <font color="#ffff00">=</font> <font color="#ffff00">"</font><font color="#ff40ff">$host</font><font color="#ffff00">"</font> <font color="#ffff00">]</font><font color="#ffff00">;</font> <font color="#ffff00">then</font>
59 <font color="#00ffff">host</font>=<font color="#ff40ff">$host</font>.<font color="#ff40ff">$domain</font>
60 <font color="#ffff00">return</font>
61 <font color="#ffff00">fi</font>
62 <font color="#ffff00">done</font>
63 <font color="#ff40ff">}</font>
64 proxy() <font color="#ff40ff">{</font>
65 <font color="#ffff00">[</font> <font color="#ffff00">-n</font> <font color="#ffff00">"</font><font color="#ff40ff">$OPTIONS</font><font color="#ffff00">"</font> <font color="#ffff00">]</font> <font color="#ffff00">&&</font> <font color="#ffff00">return</font>
66 <font color="#ffff00">case</font> <font color="#ffff00">"</font><font color="#ff40ff">$host</font><font color="#ffff00">"</font> <font color="#ffff00">in</font>
67 <font color="#ff40ff">$2</font><font color="#ffff00">)</font>
68 <font color="#ffff00">case</font> <font color="#ffff00">"</font><font color="#ff40ff">$myhost</font><font color="#ffff00">"</font> <font color="#ffff00">in</font>
69 <font color="#ff40ff">$2</font><font color="#ffff00">)</font>
70 <font color="#00ffff">OPTIONS</font>=<font color="#ffff00">""</font>
71 <font color="#ffff00">;;</font>
72 *<font color="#ffff00">)</font>
73 <font color="#00ffff">OPTIONS</font>=<font color="#ffff00">"</font><font color="#ff6060">-o </font><font color="#ff40ff">\"</font><font color="#ff6060">ProxyCommand /usr/bin/ssh </font><font color="#ff40ff">$1</font><font color="#ff6060"> nc -q 0 %h 22</font><font color="#ff40ff">\"</font><font color="#ffff00">"</font>
74 <font color="#ffff00">;;</font>
75 <font color="#ffff00">esac</font>
76 <font color="#ffff00">;;</font>
77 *<font color="#ffff00">)</font> <font color="#00ffff">OPTIONS</font>=<font color="#ffff00">""</font>
78 <font color="#ffff00">;;</font>
79 <font color="#ffff00">esac</font>
80 <font color="#ff40ff">}</font>
81 source <font color="#ff40ff">${</font><font color="#ff40ff">HOME</font><font color="#ff40ff">}</font>/.rsrc
83 <font color="#ffff00">[</font> <font color="#ffff00">-n</font> <font color="#ffff00">"</font><font color="#ff40ff">$1</font><font color="#ffff00">"</font> <font color="#ffff00">]</font> <font color="#ffff00">||</font> <font color="#ffff00">set </font><font color="#00ffff">exec</font> <font color="#ffff00">'</font><font color="#ff6060">$SHELL</font><font color="#ffff00">'</font> <font color="#00ffff">--login</font>
84 <font color="#ffff00">eval</font> <font color="#ffff00">exec</font> <font color="#ffff00">"</font><font color="#ff6060">/usr/bin/ssh -t </font><font color="#ff40ff">${</font><font color="#ff40ff">OPTIONS</font><font color="#ff40ff">}</font><font color="#ff6060"> </font><font color="#ffff00">"</font><font color="#ff40ff">$host</font><font color="#ffff00">"</font><font color="#ff6060"> LANG=</font><font color="#ff40ff">\$</font><font color="#ff6060">LANG </font><font color="#ff40ff">\"\$</font><font color="#ff6060">@</font><font color="#ff40ff">\"</font><font color="#ffff00">"</font>
86 </td></tr></tbody></table>
88 Файл .rsrc может выглядеть, например, вот так:
90 <table border="0"><tbody><tr>
91 <td bgcolor="#000000">
92 <font color="#ffffff"><pre><font color="#ffff00">add_domain</font> home.ru dragon vasilisk hydra
93 <font color="#ffff00">add_domain</font> kontora.ru elk ibex bear wolf
94 <font color="#ffff00">proxy</font> gw.home.ru *.home.ru
95 <font color="#ffff00">proxy</font> firewall.kontora.ru *.kontora.ru
97 </td></tr></tbody></table>
99 В результате использования такого файла
101 <li> Короткие имена хостов dragon, vasilisk и hydra будут расширятся
102 до dragon.home.ru, vasilisk.home.ru etc, независимо от того, в какой
104 </li><li> Аналогично имена хостов elk, ibex etc будут искаться в домене
106 </li><li> Обращения к хостам домена kontora.ru будет происходить через прокси
107 gw.kontora.ru, если только мы не в локальной сети конторы (и по dhcp нам
108 не отдали доменное имя kontora.ru)
109 </li><li> Обращения к хостам home.ru будут происходить через gw.home.ru, если
110 только мы не в локальной сети home.ru