<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Fwolf's Blog &#187; reverse - Fwolf's Blog</title>
	<atom:link href="http://www.fwolf.com/blog/post/tag/reverse/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fwolf.com/blog</link>
	<description>随心·随意·随缘·努力～</description>
	<lastBuildDate>Wed, 07 Jul 2010 07:07:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>用ssh打通反向隧道，内网也可对外提供服务</title>
		<link>http://www.fwolf.com/blog/post/410</link>
		<comments>http://www.fwolf.com/blog/post/410#comments</comments>
		<pubDate>Thu, 10 Jul 2008 11:38:30 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[allow]]></category>
		<category><![CDATA[denyhosts]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[reverse]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tunnel]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/?p=410</guid>
		<description><![CDATA[一般正规一点的网络环境，大多是这样的：防火墙后分为内网和中立区（DMZ），并且内网和DMZ虽然都能访问外网，互相却是无法直接访问的。内网和DMZ的区别就是，来自外网的访问，都通过防火墙上的规则映射到DMZ里的服务器上，而内网一般是不允许这样的。 现在需要解决的问题就是，在防火墙只能给DMZ开端口，内网和外网不可直接互访的情况下，如果让内网的机器对外提供服务。 ssh是很神奇的，使用它创建的隧道，可以起到代理的作用，数据流的方向是： 本机 -&#62; 隧道 -&#62; 外网 应用到我们的问题中，如果把隧道反过来，就是： 外网 -&#62; DMZ -&#62; 隧道 -&#62; 内网 这就需要用到ssh的反向隧道，它在服务器上打开一个监听端口，这个端口的访问会被隧道传输到本地，结果再通过隧道传到服务器上，从监听端口返回给客户。这样，在我们的应用中，内网机器通过外网访问DMZ服务器，创建ssh反向隧道，就能够对外提供服务了。当然，防火墙上要将相应端口映射到DMZ的服务器上。 比如，在内网登录DMZ服务器： ssh -R 8082:localhost:82 fwolf@svr5.tld -o ControlPath=/tmp/ssh_svr5_reverse_tunnel 这样，访问DMZ服务器svr5的8082端口，就是在访问本机的82端口。之所以带上-o ControlPath，是为了和其它访问svr5的进程使用不同的master模式（如果不是第一次创建这个master，而是使用了原来的连接的sockts，肯定就不会创建隧道了）。 有几个问题还需要注意一下： 如果DMZ上监听端口小于1000的话，就必须用root用户登录DMZ服务器，比如root@svr5.tld。 DMZ服务器上的sshd必须开启GatewayPorts选项，在文件/etc/ssh/sshd_config中加入GatewayPorts yes。 记得不要idle，参考中有在服务端设置的方法。 如果放在其它脚本，比如/etc/rc.local中执行的话，除了配置自动登录，还可以带上-fN参数，放到后台去。 参考 TIP SSH Reverse Tunnel ssh reverse tunneling PuTTY 中文教程 作者：柴锋 2006年11月 Update @ 2008-07-25 注意，由于使用了反向隧道，所以ssh隧道实际作用相当于一个代理，访问的来源也自然就都成了127.0.0.1，如果同时还启用了denyhosts，千万记得要把本机地址127.0.0.1放入白名单/etc/hosts.allow，不然就会成为其他登录失败的牺牲品（失败的登录，其来源也成了loopback的地址）： ssh_exchange_identification: Connection closed by remote host Fatal [...]]]></description>
			<content:encoded><![CDATA[<p>一般正规一点的网络环境，大多是这样的：防火墙后分为内网和中立区（DMZ），并且内网和DMZ虽然都能访问外网，互相却是无法直接访问的。内网和DMZ的区别就是，来自外网的访问，都通过防火墙上的规则映射到DMZ里的服务器上，而内网一般是不允许这样的。</p>

<p>现在需要解决的问题就是，在防火墙只能给DMZ开端口，内网和外网不可直接互访的情况下，如果让内网的机器对外提供服务。</p>

<p>ssh是很神奇的，使用它创建的隧道，可以起到代理的作用，数据流的方向是：</p>

<pre><code>本机 -&gt; 隧道 -&gt; 外网
</code></pre>

<p>应用到我们的问题中，如果把隧道反过来，就是：</p>

<pre><code>外网 -&gt; DMZ -&gt; 隧道 -&gt; 内网
</code></pre>

<p>这就需要用到ssh的反向隧道，它在服务器上打开一个监听端口，这个端口的访问会被隧道传输到本地，结果再通过隧道传到服务器上，从监听端口返回给客户。这样，在我们的应用中，内网机器通过外网访问DMZ服务器，创建ssh反向隧道，就能够对外提供服务了。当然，防火墙上要将相应端口映射到DMZ的服务器上。</p>

<p>比如，在内网登录DMZ服务器：</p>

<pre><code>ssh -R 8082:localhost:82 fwolf@svr5.tld -o ControlPath=/tmp/ssh_svr5_reverse_tunnel
</code></pre>

<p>这样，访问DMZ服务器svr5的8082端口，就是在访问本机的82端口。之所以带上<code>-o ControlPath</code>，是为了和其它访问svr5的进程使用不同的<a href="385">master模式</a>（如果不是第一次创建这个master，而是使用了原来的连接的sockts，肯定就不会创建隧道了）。</p>

<p>有几个问题还需要注意一下：</p>

<ul>
<li>如果DMZ上监听端口小于1000的话，就必须用root用户登录DMZ服务器，比如<code>root@svr5.tld</code>。</li>
<li>DMZ服务器上的sshd必须开启GatewayPorts选项，在文件<code>/etc/ssh/sshd_config</code>中加入<code>GatewayPorts yes</code>。</li>
<li>记得不要idle，参考中有在服务端设置的方法。</li>
<li>如果放在其它脚本，比如<code>/etc/rc.local</code>中执行的话，除了配置<a href="279">自动登录</a>，还可以带上<code>-fN</code>参数，放到后台去。</li>
</ul>

<h4>参考</h4>

<ul>
<li><a href="http://gentoo-wiki.com/TIP_SSH_Reverse_Tunnel">TIP SSH Reverse Tunnel</a></li>
<li><a href="http://linux.byexamples.com/archives/238/ssh-reverse-tunneling/">ssh reverse tunneling</a></li>
<li><a href="http://chaifeng.com/blog/2007/06/putty_200611.html">PuTTY 中文教程 作者：柴锋 2006年11月</a></li>
</ul>

<h4>Update @ 2008-07-25</h4>

<p>注意，由于使用了反向隧道，所以ssh隧道实际作用相当于一个代理，访问的来源也自然就都成了<code>127.0.0.1</code>，如果同时还启用了<a href="http://denyhosts.sourceforge.net/">denyhosts</a>，千万记得要把本机地址<code>127.0.0.1</code>放入白名单<code>/etc/hosts.allow</code>，不然就会成为其他登录失败的牺牲品（失败的登录，其来源也成了loopback的地址）：</p>

<pre><code>ssh_exchange_identification: Connection closed by remote host
Fatal error: Lost connection with the server
</code></pre>

<p>没办法，为了网络通道的畅通，只能牺牲一部分安全性了。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/allow" title="allow" rel="tag">allow</a>, <a href="http://www.fwolf.com/blog/post/tag/denyhosts" title="denyhosts" rel="tag">denyhosts</a>, <a href="http://www.fwolf.com/blog/post/tag/internet" title="Internet" rel="tag">Internet</a>, <a href="http://www.fwolf.com/blog/post/tag/linux" title="Linux" rel="tag">Linux</a>, <a href="http://www.fwolf.com/blog/post/tag/network" title="network" rel="tag">network</a>, <a href="http://www.fwolf.com/blog/post/tag/reverse" title="reverse" rel="tag">reverse</a>, <a href="http://www.fwolf.com/blog/post/tag/ssh" title="ssh" rel="tag">ssh</a>, <a href="http://www.fwolf.com/blog/post/tag/tips" title="tips" rel="tag">tips</a>, <a href="http://www.fwolf.com/blog/post/tag/tunnel" title="tunnel" rel="tag">tunnel</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/279" title="配置ssh的自动登录 (2007-01-05)">配置ssh的自动登录</a> (12)</li>
	<li><a href="http://www.fwolf.com/blog/post/385" title="ssh的连接重用 (2008-03-04)">ssh的连接重用</a> (2)</li>
	<li><a href="http://www.fwolf.com/blog/post/300" title="针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS） (2007-03-18)">针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/443" title="配置安全的共享web服务器（抛砖引玉） (2009-06-09)">配置安全的共享web服务器（抛砖引玉）</a> (4)</li>
	<li><a href="http://www.fwolf.com/blog/post/400" title="选择Eclipse PHP Development Tools(PDT)作为PHP开发工具 (2008-05-03)">选择Eclipse PHP Development Tools(PDT)作为PHP开发工具</a> (8)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/410/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
