`
lvzun
  • 浏览: 56413 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

(转)使用OpenSSH端口转发让工作生活更轻松

阅读更多

 


1、前言

本文版权归作者freshegg所有,任何人转载全文或节选,请注明作者和版本信息,否则视为侵权。
版本:0.1
作者:freshegg

俗话说得好“打洞有风险,动手需谨慎”,您需要仔细鉴别本文所列技术可能带来的安全风险。本着“谁打洞,谁受益,谁承担风险”的原则,对于您执行本文中的操作而导致的任何结果和本人无关。另外,本文中所列人物情节纯属虚构,请勿对号入座,如有雷同,纯属巧合 ;

话说家住广州的本文主角very正在位于中山的公司上班,突然接到上司发来的邮件要求他接手一个广告策划,而这个案子原来是由策划部某主任在做,今天某主任因为工作过分操劳身体不支住院了,要求他必须在明天早上之前不惜一切代价完成,将结果发到上司和boss的公司内部邮箱里。very拿到相关电子资料研究了一下,原来是某公司的情侣衫广告,very脑里浮现出在另外一家公司做运维工作的枕头mm的倩影,不觉心里一荡,觉得虽然今天要加班但应该问题不大,顺手回了一句“保证完成任务”便埋头苦干起来。弹指一挥间,下午5点,very接到一个重要电话,是very苦追很久的枕头mm打来的,未来的从未谋面的岳父、岳母邀请他在傍晚7点去吃个饭见个面。“7点”very转念一想,上司布置的任务还没完成啊!这怎生是好?今天必须要去枕头mm家(广州),去了再回家加班?但是今天又没带移动硬盘,在家里也无法访问公司,虽然自己的电脑上已经安装了vnc server,但因为公司有状态检测防火墙,只允许内网访问外网,而且只能访问21,22,25,80,110这几个端口,外网是无法主动连接内网的。very不禁仰天长叹“鱼与熊掌不可兼得啊”,very没辙的时候打电话给枕头mm诉苦,枕头mm听完,说我给你想个办法让你在家里连到公司继续加班,我在电邮里仔细给你说。

 

2、ssh -i soho_private_key -L 5900:localhost:5900 soho@fresh.egg

 

第一封电邮 写道
为节省本文篇幅,第一封枕头mm发的电邮省略n多字,大概内容如下:

2.1、状态检测防火墙简单的说就是比包过滤防火墙多了一个设施--状态表,当通信双方发起的第一个数据包通过防火墙时,防火墙使用包过滤功能将数据包与防火墙规则进行匹配,当匹配的规则中的动作定义为放行时,防火墙会在状态表中记录下该连接。随后双方的通信中,防火墙将使用状态检测功能,因为状态表中的记录匹配双方之后的通信,所以所有的合法连接和通信将顺利通过。

2.2、very公司的状态检测防火墙的规则只允许当通信双方的第一个数据包通过防火墙时,是从内网访问外网,所以首先very应该从内网向外部发起连接,待到在状态表中生成相应的记录后,再用某种方法从相同的连接访问进来。这种方法枕头mm恰好知道,就是利用OpenSSH的端口转发技术。

2.3、OpenSSH的端口转发技术的一个先决条件就是需要一个ssh server,在本文中假设为fresh.egg,使用FreeBSD7,并且有一个使用远程ssh key方式认证的帐户soho。大部分文档上说的端口转发是ssh -L port:host:hostport user@sshserver这种方法。在windows下可以使用流行的putty来实现,如图1。当执行图1配置的putty时,将在ssh client和ssh server之间建立一个隧道(隧道里面装载的是vnc通信)。在图1中的右边的Source port输入5900,这个表示在ssh client本机虚拟出一个之前未用的服务端口5900,就是隧道的入口;Destination输入localhost:5900表示隧道的出口在ssh server(fresh.egg)上绑定在loopback上的端口5900;下面的单选Local表示隧道的方向--从内向外--vnc client在内而vnc server在外。当在ssh client上用vnc客户端访问ip为127.0.0.1时,请求访问的数据将被putty转移进入隧道,最后数据到达ssh隧道出口处被sshd转发到ssh server的5900。这样,虽然防火墙禁止你访问外部的vnc server,通过OpenSSH您却可以。如果您使用OpenSSH客户端,和图1相对应的命令为:

% ssh -i soho_private_key -L 5900:localhost:5900 soho@fresh.egg

very看到这里心想:看了半天还是不大明白,关键是现在我要从家里访问公司的电脑啊,怎么好像方向不对啊?这时候接到枕头mm第二封电邮。
 

 


图1
sshforwarding-1.JPG

3、ssh -i soho_private_key -R 5900:localhost:5900 soho@fresh.egg


 第二封电邮写道
3.1、既然向外都能突破firewall了,当然也能在另外一个方向实现。如图2进行配置。图2右边的Source port输入5900,这个表示在ssh server(fresh.egg)虚拟出服务端口5900,就是隧道的入口;Destination输入localhost:5900表示隧道的出口在ssh client上的端口5900;下面的单选Remote表示隧道的方向--从外向内--vnc server在内而vnc client在外。选择上面的复选框Remote ports do the same表示在ssh server的端口5900绑定在所有接口而可以被外部主机直接访问。只要执行了这样设置的putty,就会在ssh client和ssh server之间建立一个隧道。如果您使用OpenSSH客户端,和图2相对应的命令为:

% ssh -g -i soho_private_key -R 5900:localhost:5900 soho@fresh.egg

3.2、您回到家里,使用vnc client设置访问地址为fresh.egg,那么您的桌面将瞬间呈现在你面前;p 另外在ssh server上要使sshd起的5900可以被外部主机直接访问,需要在ssh server上执行命令:

% sudo sed -i ".bak" 's/^#\(GatewayPorts \)no/\1yes/' /etc/ssh/sshd_config

% sudo /etc/rc.d/sshd reload

very看到这封邮件大悦,可转头一想:sshd起的5900可以被任意外部主机直接访问的话,可能有很大的安全风险吧?例如其他人有意无意的通过sshd起的5900访问到very公司的电脑,而putty正在运行中(ssh client保持运行是维持隧道连通性的关键),访问者可以轻松拿到private key,那ssh server的安全就成问题了。。。
 

图2
sshforwarding-2.JPG


4、ssh -i soho_private_key -R 5900:localhost:5900 soho@fresh.egg和ssh -i soho_private_key -L 5900:localhost:5900 soho@fresh.egg


第三封电邮 写道
4.1、如果刚才您用了sudo sed -i ".bak" 's/^#\(GatewayPorts \)no/\1yes/' /etc/ssh/sshd_config这个命令,请立即在ssh server上执行:

% sudo mv /etc/ssh/sshd_config.bak /etc/ssh/sshd_config

% sudo /etc/rc.d/sshd reload

4.2、在公司设置putty如图3。图3和图2的唯一区别:不选择上面的复选框Remote ports do the same。然后点Add按钮,最后执行putty。如果您使用OpenSSH客户端,和图3相对应的命令为:

% ssh -i soho_private_key -R 5900:localhost:5900 soho@fresh.egg

4.3、回到家里设置putty如图1。

4.4、使用vnc client设置访问地址为127.0.0.1。您将访问到公司的电脑。

“呕也”very想:看来这个方案消除我上面的疑虑了,但如果我的soho的key一不小心被别人拿到了,别人就会获得一个交互式shell,那fresh.egg是否会有安全风险?另外我怎么才能保持putty和ssh server之间连通性(不因为client长时间不操作而中断连接),very将疑虑告诉了枕头mm,很快收到了第四封邮件。
 

图3
sshforwarding-3.JPG

5、其他设置

第四封电邮 写道
5.1、在ssh server上执行命令(假设soho只有一个key)

% sudo sed -i ".bak" 's/^\(.*\)/no-pty,command="echo forwarding" \1/' \

/home/soho/.ssh/authorized_keys

这个命令执行后,soho下次用该key登录ssh时,就不能得到一个交互式shell,并且非交互式执行命令将仅限于

"echo forwarding"。

5.2、开启ssh server的keepalive机制

% sudo sed -i ".bak" 's/^#\(ClientAliveInterval \)0/\130/' /etc/ssh/sshd_config

% sudo /etc/rc.d/sshd reload

5.3、在putty上开启ssh client的keepalive机制

在putty的Connection的右边窗体的Seconds between keepalives栏输入15

5.4、在putty上关闭交互式shell方式登录

在putty的Connection=》SSH的右边窗体中,选中Don't start a shell or command at all复选框

最后第四封电邮有个附件,用某种方法加密的soho_private_key。
 


6、后记

very按照邮件执行了上面4.2节 5.3节 5.4节的操作,下班,到广州和枕头mm胜利会师,饭桌上胸有成竹、谈笑风生,得到两位老人的肯定。回到家,执行了4.3节 5.3节 5.4节 4.4节的操作,连到公司的电脑,由于自感幸福指数大增,情侣衫广告的字里行间充满郎情妾意。。。第二天早上10点,very获悉他被任命为策划部主任。



注意:第4节和第5节中的操作相对本文中其他部分要安全一些,另外ssh public-key认证方式涉及的server和client的设置请参考其他资料。

参考资料:

man 1 ssh
man 5 sshd_config
FreeBSD使用手册
PuTTY User Manual
《OReilly SSH The Secure Shell The Definitive Guide 2nd》
使用 SSH 建立安全通信信道http://www.ibm.com/developerworks/cn/aix/library/au-tunnelingssh/index.html


最后感谢very和枕头mm对本文提供的技术支持。



 

分享到:
评论

相关推荐

    Linux系统下如何使用OpenSSH配置端口转发

    从自己的电脑上访问公司的CVS服务器需要利用SSH客户端的端口转发功能。在Ubuntu Linux 之下需要使用 OpenSSH配置端口转发来实现。本文举例说明了如何配置OpenSSH的端口转发功能。

    openssh最新rpm包openssh-9.4p1openssh9.4p1

    最新 openssh rpm 包资源,亲测可用 修复关键漏洞:OpenSSH ssh-agent 组件存在远程代码 执行漏洞(CVE-2023-38408) 漏洞影响范围: 5.5 < OpenSSH ≤ 9.3p1 建议升级9.3p2或者9.4p1 openssh-9.4p1-1.el7.x86_64.rpm...

    C语言使用OpenSSH模拟HTTPS协议

    C语言使用OpenSSH模拟HTTPS协议

    OpenSSH 9.3 CentOS7 RPM安装包

    基于centos7编译的openssh9.3的安装包,使用x11-ssh-askpass让openssh不在依赖openssl1.1.1。 更新前:注意备份好/etc/ssh和/etc/pam.d/ ,一般建议开启telnet增加一条备用登陆通道 更新操作:rpm -Uvh openssh-*....

    centos升级openssh脚本,一键修复openssh漏洞(openssh8.6p1)

    升级到openssh8.6p1,openssl-1.1.1g,zlib-1.2.11 上传到centos目录,解压,进入openssh目录 直接bash update_openssh_8_6.sh 完成升级

    openssh离线升级8.8

    openssh离线升级8.8

    openssh8.1升级使用得rpm

    openssh8.1升级使用得rpm,该安装软件包是基于centos6.6,openssh8.1编译的,其他linux版本不保证好用

    openssh-7.4p1.tar.gz

    OpenSSH是SSH协议远程登录的首选连接工具。它加密所有流量以消除窃听,连接劫持和其他攻击。另外,OpenSSH提供了一套安全的隧道功能,多种认证方法和复杂的配置选项。 OpenSSH套件包含以下工具: 远程操作使用...

    openssh-9.3p1.tgz

    openssh 版本9.3p1 适用于centos7 aarch64安装升级使用 二进制rpm包,用于修复安全漏洞,升级更新openssh版本,安全加固 当前最新版本openssh

    openssh8.9的rpm包

    openssh8.9的rpm更新包,适用于centos7方便进行升级 tar -zxvf openssh* rpm -Uvh openssh*.rpm

    OpenSSH基本使用.pdf

    linux Openssh的基本使用 在学习的过程中,自己结核导师所讲做下的笔记把自所学到的有关于Linux 中 OpenSSH这一部分写成笔记的形式记录下来放在CSDN上以便于以后使用

    openssh openssh-client openssh-server

    openssh-4.3p2-82.el5.src.rpm openssh-clients-4.3p2-82.el5.i386.rpm openssh-server-4.3p2-82.el5.i386.rpm xinetd-2.3.14-10.el5.i386.rpm

    openssh7.8p1RPM包

    自制的openssh7.8p1的RPM包,基于CentOS7制作,用于openssh升级,亲测可正常安装使用。

    linux7操作系统 openssh9.0p1 rpm安装包

    linux7操作系统 openssh9.0p1 rpm安装包 rpm -e openssh-clients-7.4p1-16.el7.x86_64 rpm -e openssh-server-7.4p1-16.el7.x86_64 rpm -e openssh-7.4p1-16.el7.x86_64 rpm -ivh openssh-9.0p1-1.el7.x86_64.rpm ...

    基于麒麟V10SP1制作的最新版openssh ARM版 openssh-9.5p1-1 所有RPM文件

    如果是升级麒麟V10sp1服务器的openssh,只需要其中的三个文件即可 tar -xf openssh-9.5p1-1.tgz cd aarch64/ rm -rf openssh-askpass* rm -rf openssh-debug* rpm -Uvh *.rpm cp /etc/ssh/sshd_config /etc/ssh/sshd...

    升级openssh到8.3

    升级openssh到8.3

    openssh的离线安装包.rar

    此资源为openssh 7.2的离线安装包,包含有详细的安装步骤,超级好用。 安装的详细步骤命令如下: sudo dpkg -i openssh-client_7.2p2-4_amd64.deb sudo dpkg -i openssh-sftp-server_7.2p2-4_amd64.deb sudo dpkg...

    OpenEuler22.03 LTS 升级openssh9.6p1解决openssh中高危漏洞(亲测有效)

    OpenEuler22.03 LTS 升级openssh9.6p1解决openssh中高危漏洞(亲测有效)

    OpenSSH图形编辑器Config::Model::OpenSsh.zip

    Config::Model::OpenSsh 是 ...开发者可以选择使用 Perl API 来修改或者验证 OpenSSH 配置,这些程序是基于 Config:Model 的。 更新日志:http://cpansearch.perl.org/src/DDUMONT/Config-Model-OpenSsh-1.232/Changes

    openssh9.4p1 for el8

    openssh-9.4p1-1.el8.x86_64.rpm openssh-clients-9.4p1-1.el8.x86_64.rpm openssh-server-9.4p1-1.el8.x86_64.rpm openssh-debugsource-9.4p1-1.el8.x86_64.rpm openssh-debuginfo-9.4p1-1.el8.x86_64.rpm openssh-...

Global site tag (gtag.js) - Google Analytics