SSH应用简述
一、非标准端口启动SSH
ssh的默认端口是22这是大家都知道的事情,但是在有些时候Cracker会扫描Internet上面的22号端口,因此有些时候有些ISP厂商会在会在入口处关闭22号端口。
为了提高安全性我们可以将SSH的端口开放在非标准的端口,这样Cracker就不会扫描到该端口,ISP厂商也不会对该端口进行关闭,它可以和SSH一样正常使用。
比如我们将SSH端口设定为22和23(前提是23端口不可以被占用)两个端口监听的方式,配置如下:
修改SSH配置文件
vim /etc/ssh/sshd_config
port 22
port 33
重启SSHD服务service sshdrestart
如果开启SELinux,可能会出现一个SELinux的错误,因为根据SSH规范仅能启动22号端口,所以我们需要自定义一个SELinux规则进行放行模块才可以。具体流程如下:
根据提示在日志中找出SSH有关的AVC信息,并转为本地模块
cat /var/log/audit/audit.log |grep AVC |grep ssh|audit2allow -m sshlocal >sshlocal.te (后缀一定要是.te)
grep sshd_t /var/log/audit/audit.log |audit2allow -M sshlocal(sshlocal是刚才建立的.te文件名)
semodule -i sshlocal.pp(这条命令是编译为.pp模块,并加入到SELINUX的管理机制中)
service sshd restart(重启SSHD服务)
这样就完成了非标准端口启动ssh的配置过程,最后通过查看端口进行验证就可以了。
netstat -tlunp |grep ssh
如果正常的话会出现22和23两个端口,下面进行连接测试
ssh -p 23 root@localhost
然后在通过端口进行查看
netstat -tnp|grep 23
你可以看到只有23端口处于连接状态,因为网络连接是双向的所以即使自己连接自己也可以捕获到两个连接。
二、通过SSH通道加密本来无加密的服务
大家都知道rsync可以通过ssh通道进行加密以进行镜像传输,那么其他服务也是应该可以通过SSH通道进行加密传输的,下面我先介绍一下做法。
我先以VNC服务为例:
假设在服务端port5901启动了VNC服务,客户端使用VNCview连接到服务端的port5901,在开始之前我们的客户端没有启动任何的VNC端口,我们可以在客户端启动一个port5911,然后通过ssh连接到服务器端的sshd中,而服务器端的SSHD再去连接VNCport5901,整个过程如下:
下面我简单介绍一下命令的格式:
ssh -L 本地端口:127.0.0.1:远程端口 [-N] 远程主机
例如:
ssh -L 5911:127.0.0.1:5911 -N 192.168.100.100(远程主机IP)
连接后在客户端查看你会发现SSH开启了5911的端口
如果想取消这个连接,需要先关闭VNC,然后再按Ctrl+C中断加密通道就可以了。
照此我们可以加密一些没有加密的服务来进行加密传输,如VNC/XDMCP/RDP/FTP........
三、详解SSH端口转发
SSH 端口转发格式[1]
[-L [bind_address:]port:host:hostport]
[-R [bind_address:]port:host:hostport]
[-D [bind_address:]port]
本地端口转发
-L<local_port>:<host>:<host_port> <ssh_server>
这会使本地主机监听端口local_port,一旦与该端口建立连接,经过该端口的数据会被转发到安全通道,同时远程主机会与主机host的端口host_port建立连接。
$ ssh -L 7001:localhost:7070 [email protected]
登陆前本地主机端口监听状态:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd
登陆后本地主机端口监听状态:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp 0 0 127.0.0.1:7001 0.0.0.0:* LISTEN 3475/ssh tcp6 0 0 :::22 :::* LISTEN 927/sshd tcp6 0 0 ::1:7001 :::* LISTEN 3475/ssh
登陆后远程主机端口监听状态:
$ sockstat -4l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS (什么都没有)
小结:我们从中可以看出,本地端口转发的时候确实是本地主机的ssh在监听端口7001
远程端口转发
-R<remote_port>:<host>:<host_port> <ssh_server>
这会使ssh_server(远程端)监听端口remote_port,一旦与该端口建立连接,经过该端口的数据会被转发到安全通道,并且本地主机会与主机host的端口host_port建立连接。
$ ssh -R 7001:localhost:7070 [email protected]
登陆前本地主机端口监听状态:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd
登陆后本地主机端口监听状态:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd
登陆后远程主机端口监听状态:
$ sockstat -4l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS sisca sshd 66196 7 tcp4 127.0.0.1:7001 *:*
小结:很明显,使用远程端口转发时,本地主机的端口监听并没有发生变化,相反远程主机却开始监听我们指定的7001端口
小提示:
这里的remote_port,local_port可以归并为listen_port,因此我们得到这样的助记格式:
ssh [-L|-R] <listen_port>:<host>:<host_port>
本地端口转发应用:[2]
背景:在实验室里有一台 LDAP 服务器(LDAP Server),但是限制了只有本机上部署的应用才能直接连接此 LDAP 服务器。现在我们想临时从本地机器(LDAP Client)直接连接到这个 LDAP 服务器,只需要在LDAP Client上运用本地端口转发:
$ ssh -L 7001:localhost:389 LdapServerHost
图1 本地端口转发
数据流向:
该命令首先使本地主机(LDAP Client)与远程主机(LDAP Server)建立一个SSH安全连接(安全通道)
然后本地主机会监听端口7001(注意是ssh在监听)
一旦本地LDAP客户端程序将数据发送到端口7001(即建立连接),远程主机上的sshd将主动与端口389(LDAP服务的端口)建立连接
从而来自LDAP客户端的请求转发到该端口389上(当然是通过安全通道)
注意:
本地主机有两个客户端:
1) ssh �C 用于与远程主机建立ssh连接
2) LDAP客户端 �C 用于与远程主机的LDAP服务程序进行通讯
远程主机对应地有两个服务进程:
1) sshd �C 监听端口22
2) ldapd -监听端口389
远程端口转发应用:[2]
背景:这次假设由于网络或防火墙的原因我们不能用 SSH 直接从 LDAP Client 连接到 LDAP 服务器(LDAP Server),但是反向连接却是被允许的。那此时我们的选择自然就是远程端口转发了。我们这次在LDAP Server上运用远程端口转发,因此LDAP Client必须安装了sshd
$ ssh -R 7001:localhost:389 LdapClientHost
图2 远程端口转发
数据流向:
该命令首先使LDAP Server与 LDAP Client 建立一个SSH安全连接(安全通道)
然后LDAP Client开始监听端口7001(注意是sshd在监听)
一旦LDAP Client将数据发送到端口7001(即建立连接),LDAP Server上的ssh将主动与端口389(LDAP服务端口)建立连接
从而来自LDAP客户端的请求转发到该端口389上(当然是通过安全通道)
本地转发与远程转发的对比与分析
本地端口转发:ssh客户端发起ssh连接,并且监听指定端口
远程端口转发:ssh客户端发起ssh连接,但是由远程主机上的sshd监听指定端口
多主机转发应用[2]
图3 多主机端口转发
$ ssh -g -L 7001:<B>:389 <D>
注意:我们在命令中指定了“ -g ”参数以保证机器(A)能够使用机器(C)建立的本地端口转发。
动态端口转发
-D <port>
这会使本地主机监听端口port,一旦与该端口建立连接,经过该端口的数据会被转发到安全通道发送到远程主机。远程主机的sshd会根据数据包的应用层协议(如HTTP)自动建立对应的连接。
$ ssh -D 7070 [email protected]
登陆前本地主机端口监听状态:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd
登陆后本地主机端口监听状态:
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp 0 0 127.0.0.1:7070 0.0.0.0:* LISTEN 5205/ssh tcp6 0 0 :::22 :::* LISTEN 927/sshd tcp6 0 0 ::1:7070 :::* LISTEN 5205/ssh
登陆后远程主机端口监听状态:
$ sockstat -4l
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS (什么都没有)
小结:我们发现,动态端口转发的时候确实是本地主机的ssh在监听端口7070的
使用ether-wake实现远程自动开机
前提条件:
被控端需要使用ATX电源,并且网卡和主板需要支持网络唤醒功能,还需要知道被控端的MAC地址
具体配置过程如下:
在一台DHCP服务器(或者任何一台Linux主机)上安装net-tools软件,然后就会产生ether-wake命令,这样我们就可以使用命令远程开机了,命令格式如下:
ether-wake -i eth1 被控端MAC地址
具体帮助信息可以使用命令ether-wake -u获得帮助。