对于 Secure Shell (SSH) 这样的网络协议来说,其主要职责就是在终端模式下访问一个远程系统。因为 SSH 协议对传输数据进行了加密,所以通过它在远端系统执行命令是安全的。此外,我们还可以在这种加密后的连接上通过创建隧道(端口转发)的方式,来实现两个不同终端间的互联。凭借这种方式,只要我们能通过 SSH 创建连接,就可以绕开防火墙或者端口禁用的限制。
这个话题在网络领域有大量的应用和讨论:
我们在接下来的内容中并不讨论端口转发的细节,而是准备介绍一个如何使用 OpenSSH 来完成 TCP 端口转发的速查表,其中包含了八种常见的场景。有些 SSH 客户端,比如 PuTTY,也允许通过界面配置的方式来实现端口转发。而我们着重关注的是通过 OpenSSH 来实现的的方式。
在下面的例子当中,我们假设环境中的网络划分为外部网络(network1)和内部网络(network2)两部分,并且这两个网络之间,只能在 externo1 与 interno1 之间通过 SSH 连接的方式来互相访问。外部网络的节点之间和内部网络的节点之间是完全联通的。
场景 1
在 externo1 节点访问由 interno1 节点提供的 TCP 服务(本地端口转发 / 绑定地址 = localhost / 主机 = localhost )
externo1 节点可以通过 OpenSSH 连接到 interno1 节点,之后我们想通过其访问运行在 5900 端口上的 VNC 服务。
我们可以通过下面的命令来实现:
externo1 $ ssh -L 7900:localhost:5900 user@interno1
现在,我们可以在 externo1 节点上确认下 7900 端口是否处于监听状态中:
externo1 $ netstat -ltnActive Internet connections(only servers)Proto Recv-QSend-QLocal Address Foreign Address State...Tcp00127.0.0.1:79000.0.0.0:*LISTEN...
我们只需要在 externo1 节点上执行如下命令即可访问 internal 节点的 VNC 服务:
externo1 $ vncviewer localhost::7900
注意:在 vncviewer 的 man 手册中并未提及这种修改端口号的方式。在 About VNCViewer configuration of the output TCP port 中可以看到。这也是 the TightVNC vncviewer 所介绍的的。
场景 2
在 externo2 节点上访问由 interno1 节点提供的 TCP 服务(本地端口转发 / 绑定地址 = 0.0.0.0 / 主机 = localhost)
这次的场景跟方案 1 的场景的类似,但是我们这次想从 externo2 节点来连接到 interno1 上的 VNC 服务:
正确的命令如下:
externo1 $ ssh -L 0.0.0.0:7900:localhost:5900 user@interno1
看起来跟方案 1 中的命令类似,但是让我们看看命令的输出上的区别。7900 端口被绑定到了本地(),所以只有本地进程可以访问。这次我们将端口关联到了,所以系统允许任何 IP 地址的机器访问 7900 这个端口。
externo1 $ netstat -ltnActive Internet connections(only servers)Proto Recv-QSend-QLocal Address Foreign Address State...Tcp000.0.0.0:79000.0.0.0:*LISTEN...
所以现在在 externo2 节点上,我们可以执行:
externo2 $ vncviewer externo1::7900
来连接到 interno1 节点上的 VNC 服务。
除了将 IP 指定为之外,我们还可以使用参数(允许远程机器使用本地端口转发),完整命令如下:
externo1 $ ssh -g -L 7900:localhost:5900 user@interno1
这条命令与前面的命令能实现相同效果:
externo1 $ ssh -L 0.0.0.0:7900:localhost:5900 user@interno1
换句话说,如果我们想限制只能连接到系统上的某个 IP,可以像下面这样定义:
externo1 $ ssh -L 192.168.24.80:7900:localhost:5900 user@interno1externo1 $ netstat -ltnActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State...Tcp 0 0 192.168.24.80:7900 0.0.0.0:* LISTEN...
场景 3
在 interno1 上访问由 externo1 提供的 TCP 服务(远程端口转发 / 绑定地址 = localhost / 主机 = localhost)
在场景 1 中 SSH 服务器 与 TCP 服务(VNC)提供者在同一个节点上。现在我们想在 SSH 客户端所在的节点上,提供一个 TCP 服务(VNC)供 SSH 服务端来访问:
将方案 1 中的命令参数由替换为。
完整命令如下:
externo1 $ ssh -R 7900:localhost:5900 user@interno1
然后我们就能看到 interno1 节点上对 7900 端口正在监听:
interno1 $ netstat -lntActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State...Tcp 0 0 127.0.0.1:7900 0.0.0.0:* LISTEN...
现在在 interno1 节点上,我们可以使用如下命令来访问 externo1 上的 VNC 服务:
interno1 $ vncviewer localhost::7900
场景 4
interno2 使用 externo1 上提供的 TCP 服务(远端端口转发 / 绑定地址 = 0.0.0.0 / 主机 = localhost)
与场景 3 类似,但是现在我们尝试指定允许访问转发端口的 IP(就像场景 2 中做的一样)为,这样其他节点也可以访问 VNC 服务:
正确的命令是:
externo1 $ ssh -R 0.0.0.0:7900:localhost:5900 user@interno1
但是这里有个重点需要了解,出于安全的原因,如果我们直接执行该命令的话可能不会生效,因为我们需要修改 SSH 服务端的一个参数值
GatewayPorts
,它的默认值是:。
GatewayPorts
该参数指定了远程主机是否允许客户端访问转发端口。默认情况下,sshd(8) 只允许本机进程访问转发端口。这是为了阻止其他主机连接到该转发端口。GatewayPorts 参数可用于让 sshd 允许远程转发端口绑定到非回环地址上,从而可以让远程主机访问。当参数值设置为 “no” 的时候只有本机可以访问转发端口;“yes” 则表示允许远程转发端口绑定到通配地址上;或者设置为 “clientspecified” 则表示由客户端来选择哪些主机地址允许访问转发端口。默认值是 “no”。
如果我们没有修改服务器配置的权限,我们将不能使用该方案来进行端口转发。这是因为如果没有其他的限制,用户可以开启一个端口(> 1024)来监听来自外部的请求并转发到
localhost:7900
。
参照这个案例:netcat(Debian # 310431: sshd_config should warn about the GatewayPorts workaround.)
所以我们修改
/etc/ssh/sshd_config
,添加如下内容:
GatewayPorts clientspecified
然后,我们使用如下命令来重载修改后的配置文件(在 Debian 和 Ubuntu 上)。
sudo/etc/init.d/ssh reload
我们确认一下现在 interno1 节点上存在 7900 端口的监听程序,监听来自不同 IP 的请求:
interno1 $ netstat -ltnActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State...Tcp 0 0 0.0.0.0:7900 0.0.0.0:* LISTEN...
然后我们就可以在 interno2 节点上使用 VNC 服务了:
interno2 $ internal vncviewer1::7900
场景 5
在 externo1 上使用由 interno2 提供的 TCP 服务(本地端口转发 / 绑定地址 localhost / 主机 = interno2 )
在这种场景下我们使用如下命令:
externo1 $ ssh -L 7900:interno2:5900 user@interno1
然后我们就能在 externo1 节点上,通过执行如下命令来使用 VNC 服务了:
externo1 $ vncviewer localhost::7900
场景 6
在 interno1 上使用由 externo2 提供的 TCP 服务(远程端口转发 / 绑定地址 = localhost / host = externo2)
在这种场景下,我们使用如下命令:
externo1 $ ssh -R 7900:externo2:5900 user@interno1
然后我们可以在 interno1 上通过执行如下命令来访问 VNC 服务:
interno1 $ vncviewer localhost::7900
场景 7
在 externo2 上使用由 interno2 提供的 TCP 服务(本地端口转发 / 绑定地址 = 0.0.0.0 / 主机 = interno2)
本场景下,我们使用如下命令:
externo1 $ ssh -L 0.0.0.0:7900:interno2:5900 user@interno1
或者:
externo1 $ ssh -g -L 7900:interno2:5900 user@interno1
然后我们就可以在 externo2 上执行如下命令来访问 vnc 服务:
externo2 $ vncviewer externo1::7900
场景 8
在 interno2 上使用由 externo2 提供的 TCP 服务(远程端口转发 / 绑定地址 = 0.0.0.0 / 主机 = externo2)
本场景下我们使用如下命令:
externo1 $ ssh -R 0.0.0.0:7900:externo2:5900 user@interno1
SSH 服务器需要配置为:
GatewayPorts clientspecified
就像我们在场景 4 中讲过的那样。
然后我们可以在 interno2 节点上执行如下命令来访问 VNC 服务:
interno2 $ internal vncviewer1::7900
如果我们需要一次性的创建多个隧道,使用配置文件的方式替代一个可能很长的命令是一个更好的选择。假设我们只能通过 SSH 的方式访问某个特定网络,同时又需要创建多个隧道来访问该网络内不同服务器上的服务,比如 VNC 或者 远程桌面。此时只需要创建一个如下的配置文件
$HOME/redirects
即可(在 SOCKS 服务器 上)。
# SOCKS serverDynamicForward 1080# SSH redirectsLocalForward 2221 serverlinux1: 22LocalForward 2222 serverlinux2: 22LocalForward 2223 172.16.23.45:22LocalForward 2224 172.16.23.48:22# RDP redirects for Windows systemsLocalForward 3391 serverwindows1: 3389LocalForward 3392 serverwindows2: 3389# VNC redirects for systems with "vncserver"LocalForward 5902 serverlinux1: 5901LocalForward 5903 172.16.23.45:5901
然后我们只需要执行如下命令:
externo1 $ ssh -F $HOME/redirects user@interno1
报考RHCE需要哪些准备?
准备这个阶段,您必须了解:(1)系统开机的完整流程。 (2)各种常用服务的错误讯息。 Choice(1小时)准备这个阶段,您必须了解:(1)各种服务的相关名称。 (2)Linux对软硬体的限制。 (3)专业用语英文字汇。 3. A Server Install and Network Services Configuartion Lab(2.5小时)准备这个阶段,您必须了解:(1)apache,samba,squid,ext3FS quote,vsftpd,tcp_wrappers,sendmail,ssh,soft RAID等等。 (2)请以一家中小型企业的需求来设定您的linux伺服器。 (3)了解各种服务阻绝的差异性。 大概是上述的问题,解如您连小弟上述所提都无法了解,可能您还没准备好来面对RHCE的考试,大家加油~题外话:一些小心得与大家分享,Linux的世界极为宽广,没有任何一个工程师敢说精通所有linux service,在考到RHCE之後相信您会发现,这只是一个开始,不是结束,与大家共勉之。 实力的终极挑战:RHCE认证难点剖析其实RHCE并不是想象之中那么困难,尤其是 Troubleshooting部份,因为在过往的考试试题中得知,来来去去都是在系统背后改动了某些Config File,才导致你无法正常开机,根据资料搜集,这里大约有六至八个不同的Hang机情况出现,如果你能够一一掌握,或者略知一二,要通过这部份考试 确实易如反掌。 继续讲RHCE第二部份的考试,吃完午饭后,已经是下午二时左右,主考官让所有考生回来之后便会正式开始第二部份 的考试,这就是多项选择题(Multiple Choice)。 考试完全在考生自己所坐的计算机内进行,这部份共有50条题目,考生需在一小时内完成所有试题,并且要取得80%或以上的分数才算合格。 如果你在Troubleshooting部份只有75%的分数,你便需要在这部份取得85%或以上的分数,才可以拉平你的平均合格分数。 (还记得RHCE 三个部份考试的总平均分是80%吗?)这些MC题目不算太困难,所有问题全部一句起两句止,而且非常简单直接,加上每条问题只须 选择一个答案,并不会出现令人讨厌的“Select All the Best Answers”的选择,所以要在这部份取得合格并不困难,完成后分数并不会实时显示出来,因为分数会直接传送到主考官的Server上,如果你真的想知 这你所获得的分数,你可以在这部份考试完全终结时,尝试向主考官询问你所得到的分数,在大部份的情况下,他们都愿意告诉你,好让你有个心理准备,应付最后 一关的考试。 到最后一部份,便是Installation,这时考官会派一份试卷在你的桌面上,并要求未得到他的批准下不可打开试 卷。 到正式开始的时候,你才可以翻阅试卷上的内容,这份试卷大约有三,四页纸,里面列明了一系列安装一个Linux Server系统的要求,整份试卷大约有15至18项指定工作,你必须在两个半小时完成所有工序,而且要做到它所指定的要求和结果,才可以获得分数。 开始的时候,你有两个方法安装这部Linux Server,分别是利用你手中的Redhat Linux CD-ROM,或者从主考官的Server下载档案安装都可以,无论用那一个方法都没有太大分别,重要的是你可以做到试卷上所指定的工作和要求。 开始的第一项工作,便是分割Partition,试卷上会列明每个File System的大小,你必须按照它所指定的大小去分割,不可太大,也不可太细,否则便会扣分。 这个过程的难度不是分割Partition,而是在指定的 Partition Size内安装一些有用Packages才是技考。 由于在分割Partition时要跟从它指定的大小,但是它所指定的Partition Size又不足以执行Full Installation,所以你唯有要用Custom Install选择一些有用的Packages才可达到安装上的要求,所以在这里要分外留神,不可以装太没有用的Packages。
用Python进行web开发需要学习什么?
HTML(超文本标记语言)是网页的核心,学好HTML是成为Web开发人员的基本条件。 HTML很容易学习的,但也很容易误用,要学精还得费点功夫。 随着HTML5的发展和普及,了解HTML5也将成为Web开发人员的必修课。 涉及到网页外观时,就需要学习CSS了,它可以帮你把网页做得更美观。 利用HTML和CSS模拟一些你所见过的网站的排版和布局(色彩,图片,文字样式等等)。 第二步:学习javascript,了解DOMJavaScript是一种能让你的网页更加生动活泼的程序语言。 学习JavaScript的基本语法,学会用javascript操作网页中dom元素。 接着学习使用一些javascript库,比如jquery是大部分WEB开发人员都喜欢用的,通过Jquery可以有效的提高JavaScript的开发效率。 第三步:了解Web服务器你不必在这上面花太多精力,但对IIS、Apache基本配置要掌握,这方面的知识学起来也相对容易,不会花多长时间。 学习一点Unix和Linux的基本知识,因为大部分Web服务器都运行在Unix和Linux平台上。 第四步: 学好一门服务器端脚本语言服务器端脚本编程(后台开发)也是Web开发人员的基本功之一,你只需挑选一个服务器端脚本语言,然后学好它。 目前流行的服务器脚本语言有:php、、jsp、ruby、python、等。 第五步:学习数据库及SQL语法要构建动态页面通常会使用到数据库,常用的数据库有SQLServer、Oracle、MySQL 等,它们都会遵循标准的SQL原则。 通常 程序使用SqlServer数据库,PHP、java使用Oracle、MySQL数据库。 第六步:综合实战选一个你喜欢的后台编程语言,结合之前学到的html,css,javascript 前端技术,实现一个简单的留言本、论坛程序、进而实现一个简单的CMS(内容管理系统)第七步:学习使用Web框架当你掌握了HTML,CSS,JavaScript和服务器端脚本语言后,就应该找一个Web框架加快你的Web开发速度,使用框架可以节约你很多时间。 比如的MVC,JAVA 的SSH,php的cakephp、CodeIgniter、zend,ruby的ROR,python的dijango等等,其实里面都有一些相通之处。 整个开发过程你还可能会学习到一些工具的使用:Visio,Dreamweaver,Vistual Studio、elipse、(Vim, EditPlus, Notpad++)、sqlserver、phpmyadmin,各种浏览器以及FireBug的插件,IE下的WebDevelopmentHelper、IETester等。 如果你足够用心,你还发掘出很多不错的资源,例如MSDN,W3cSchool,一些前辈的博客,一些技术论坛等等,这都是你未来前进道路上的财富。 如还想深入研究,学学http协议,理解什么是无状态,不然你永远做不好WEB开发,研究web程序服务端运行原理,还有tcp/ip,udp协议等。 从最简单的HTML到Web框架,内容还是不少,要想精通这里的每一样技术,都得下苦功夫才行。 半年的时间,足够你对web开发产生一个有效的认识,这个时候,再思考你进一步学习的方向
路由宝开通SSH后,不能远程Telnet和SSH,要哪里设置吗
config ruleoption name Allow-wan-sshoption src wanoption proto tcpoption dest_port 22option target ACCEPT首先编辑防火墙配置vi /etc/输入如下内容:iptables -I INPUT -p tcp --dport 22 -j ACCEPT保存退出,重启防火墙,输入如下命令:/etc/init.d/firewall restart
发表评论