]> www.wagner.pp.ru Git - sites/home_page.git/blob - hints/ssh.html
Added cover and link to pdf for jasmina
[sites/home_page.git] / hints / ssh.html
1 <html><head><title>По ssh через firewall-ы</title></head>
2 <meta name="description" content="Скрипт для хождения по ssh внутрь
3 локальных сетей, если у вас есть логин на gateway">
4 <body>
5
6
7 <h1>По ssh через firewall-ы</h1>
8 <p>
9 Нет ничего сложного в том, чтобы зайти по ssh на машину за файрволл-ом с
10 NAT, если у вас есть логин на сам firewall. Особенно, если на этом
11 firewall-е установлен netcat.
12 </p>
13 <p>
14 У openssh есть полезная опция ProxyCommand, которая может быть использована
15 для этой цели. Например можно написать в свой <tt>.ssh/config</tt>
16
17 </p><pre> Host *.intranet.mycompany.com
18  ProxyCommand ssh firewall.mycompany.com nc -q 0 %h 22
19 </pre>
20 <p>
21 После этого при попытке пойти по ssh на любой хост в домене
22 intranet.mycompany.com будет производиться запуск netcat на машине
23 firewall.mycompany.com, который и будет доставлять информацию от вашего
24 ssh на 22 порт требуемой машины (обратите внимание на опцию -q 0).
25 </p>
26 <p>
27 Проблемы возникают если ваша машина &#8212; ноутбук, и находится то в
28 корпоративном интранете, то только снаружи.
29 </p>
30 <p> Нижеприведенный шелловский скрипт эту проблему решает. К нему
31 имеется файл конфигурации, в котором описывается список nat-сетей, в
32 которые хочется ходить по ssh. 
33 </p><p>
34 Предусмотрены две директивы:
35 </p><dl>
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.
46 </dd>
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">&amp;&amp;</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
82
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>
85 </pre></font>
86 </td></tr></tbody></table>
87
88 Файл .rsrc может выглядеть, например, вот так:
89
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
96 </pre></font>
97 </td></tr></tbody></table>
98
99 В результате использования такого файла
100 <ol>
101 <li> Короткие имена хостов  dragon, vasilisk и hydra будут расширятся
102 до dragon.home.ru, vasilisk.home.ru etc, независимо от того, в какой
103 сети сейчас машина.
104 </li><li> Аналогично имена хостов elk, ibex etc будут искаться в домене
105 kontora.ru
106 </li><li> Обращения к хостам домена kontora.ru будет происходить через прокси
107 gw.kontora.ru, если только мы не в локальной сети конторы (и по dhcp нам
108 не отдали доменное имя kontora.ru)
109 </li><li> Обращения к хостам home.ru будут происходить через gw.home.ru, если
110 только мы не в локальной сети home.ru
111 </li></ol>
112
113 </dl></body></html>