SSH应用简述vim
1、非标准端口启动SSH安全
ssh的默认端口是22这是你们都知道的事情,可是在有些时候Cracker会扫描Internet上面的22号端口,所以有些时候有些ISP厂商会在会在入口处关闭22号端口。服务器
为了提升安全性咱们能够将SSH的端口开放在非标准的端口,这样Cracker就不会扫描到该端口,ISP厂商也不会对该端口进行关闭,它能够和SSH同样正常使用。网络
好比咱们将SSH端口设定为22和23(前提是23端口不能够被占用)两个端口监听的方式,配置以下:ssh
修改SSH配置文件tcp
vim /etc/ssh/sshd_configide
port 22测试
port 33加密
重启SSHD服务service sshdrestarturl
若是开启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端口处于链接状态,由于网络链接是双向的因此即便本身链接本身也能够捕获到两个链接。
2、经过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........
3、详解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 sisca@216.194.70.6
登录前本地主机端口监听状态:
$ 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 sisca@216.194.70.6
登录前本地主机端口监听状态:
$ 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 – 用于与远程主机创建ssh链接
2) LDAP客户端 – 用于与远程主机的LDAP服务程序进行通信
远程主机对应地有两个服务进程:
1) sshd – 监听端口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 sisca@216.194.70.6
登录前本地主机端口监听状态:
$ 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得到帮助。