教 程 一#安装 1、先安装telnet,避免安装ssh出错后无法 yum install telnet-server -y systemctl start telnet.socket netstat -lnt|grep 23 检查telnet端口是否正常打开 如果telnet无法登录 vim /etc/securetty 最后一行添加pts/1 2、确保telnet能够正常登录后,卸载ssh 备份原有ssh配置文件,然后卸载系统预装的ssh cp /etc/ssh/sshd_config{,.bak} yum remove openssh -y 3、源码安装ssh tar zxvf openssh-8.7p1.tar.gz cd openssh-8.7p1/ ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-ssl-dir=/usr --with-pam(pam可选项) 报错miss zlib执行yum install zlib-devel -y make -j 4 && make install 备注: –prefix=当前ssh安装目录 –sysconfdir=配置文件目录 –with-ssl-dir=openssl安装目录 –with-pam 启用pam 4、添加启动文件 cd contrib/redhat/ cp sshd.init /etc/init.d/sshd chkconfig --add sshd chkconfig sshd on 启用pam则将sshd.pam 复制到/etc/pam.d/ 如不能登录则设置 setenforce 0 临时关闭 修改 SELINUX=disabled sed -i 's/^SELINUX=.*$/SELINUX=disabled/’ /etc/selinux/config 尝试登录ssh,一切正常后关闭telnet服务 确认安装完毕后注释/etc/securetty 添加的pts/1 关闭telnet服务 5、安装openssl 部分版本ssh升级需安装高版本的openssl yum remove openssh -y 卸载原有openssl 下载openssl 解压 openssl cd openssl-1.1.1l/ ./config --prefix=/usr/ make -j 4&& make install #常用配置 ssh代理 假设场景,有3台服务器,ABC,C不通外网,B能访问C,可通过ssh代理让A直接访问到C 正向代理 在本地启动端口,把本地端口数据转发到远端(让执行命令的主机将能访问的端口暴露出来) 1、连接在B主机上启动一个端口PortB,将B主机的端口转发到C主机的端口,此时A访问B主机的PortB等于访问C主机的PortC ,远程端口映射到其他机器,访问远程主机等同于访问该主机映射到其他主机的端口 ssh -CfNg -L 0.0.0.0:PortB:HostC:PortC -o ServerAliveInterval=60 user@HostC 2、在A主机上将启动一个端口PortA,通过HostB转发到HostC:PortC上,这时访问HostA:PortA 相当于访问 HostC:PortC(本地端口通过跳板映射到其他机器,让A能访问B能访问的端口) ssh -CfNg -L 0.0.0.0:PortA:HostC:PortC -o ServerAliveInterval=60 user@HostB 反向代理 由远端将自己能访问的端口通过ssh转发出去,并告诉近端准备一个端口监听,访问近端监听端口的所有流量会由远端转发到C主机指定端口(让A能访问到执行命令的主机B能访问到的C端口) 1、B主机执行命令启动一个转发,将A主机的PortA映射到自己能访问的C的PortC, 此时访问A主机PortA等于访问C主机的PortC ssh -CfNg -R HostA:PortA:HostC:PortC -o ServerAliveInterval=60 user@HostA 注:A主机/etc/ssh/sshd_config需添加 GatewayPorts yes 假如本机:只有一个ssh端口对外,另一个webport只能内网访问,可通过本地转发将webport映射出去,此时访问A主机PortA等于访问本机webport ssh -CfNg -R HostA:PortA:127.0.0.1:webport -o ServerAliveInterval=60 user@HostA 参数详解: -C:压缩数据 -f:后台运行 -N:不执行远程命令,需要继续再目标服务器执行命令可不加 -g:允许远端主机连接本地转发端口 ssh登录配置 配置 ~/.ssh/config Host * ServerAliveInterval 60 //自动发送空字符,避免断开 Host myserver HostName 192.168.1.10 Port 22 User root IdentityFile ~/.ssh/对应服务器私钥文件 配置后可通过ssh myserver 直接登录目标服务器 私钥登录 ssh-keygen -t rsa -C “myserver” //创建密钥对 -t 指定协议 -C 添加描述 ssh-copy-id -i '公钥文件’ remote_ip //将本机的公钥文件添加到远程主机的~ 教 程 二ssh反向代理+正向代理用一台能够公网访问的host作为跳板机,转发不同端口到内网目标机的ssh端口,进而实现ssh远程登录。 配置中将会用到的SSH参数: 反向代理 ssh -fCNR 正向代理 ssh -fCNL -g:允许远程主机连接主机(host)的转发端口; -f 后台执行ssh指令 -C 允许压缩数据 -N 不执行远程指令 -R 将远程主机(服务器)的某个端口转发到本地主机指定的端口 -L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口 -p 指定远程主机的端口 准备工作开启ssh的转发功能,以ubuntu server12.04为例,服务器默认是安装了openssh-server的,在/etc/ssh/sshd_config末尾追加一下命令: GatewayPorts yes 重启ssh service ssh restart 正向代理正向代理的典型例子是主机(A)通过一台可以访问的主机(B)访问主机(C)提供的服务。 主机A不能直接访问主机C提供的服务,但是主机A可以访问主机B,主机B可以访问到主机C的服务,那我们可以在主机A上使用以下命令 ssh -CNfL a_port:c_ip:c_port b_user@b_ip 其中CNf都不是必须参数,C是对数据进行压缩,N代表不执行远程命令(尽量带上),f代表后台执行。 ssh -CNfL 6666:c_ip:80 b_user@b_ip 我们可以将问题简化一些,假设主机B的某个端口不对外提供服务,只能够主机B自己访问,那么上述命令中的主机C和主机B将是一样的,命令将变为 ssh -CNfL a_port:b_ip:b_port b_user@b_ipssh -CNfL a_port:localhost:b_port b_user@b_ip 以上两条命令是等价的,因为在第一个端口(a_port)后面的地址(b_ip)与端口(b_port)是相对于命令最末端的主机(b_ip)来说的,如果主机A是要用主机B来代理主机B的某项服务,那么第一个端口后写的主机地址为主机B的ip或者是localhost(127.0.0.1)是没有区别的。 可以看到正向代理是给自己代理提供服务的。 反向代理反向代理与正向代理的原理产不多,都是用过ssh进行数据的传输,只是使用场景不同.反向代理的作用可以认为是把内网中的主机(A)暴露出来,以便于所有的主机都可以访问到主机A的服务。 假定我们使用一台公网可以访问的主机(B)来给主机A做反向代理,那么命令如下 ssh -CNfR b_port:127.0.0.1:a_port b_user@b_ip CNf与正向代理相同,也不是必须的,在主机A上使用以上命令,即可以把主机B的b_port端口映射到主机A的a_port端口。 举个简单的例子,主机A处于内网中,公网不能访问,在主机A上有一个http服务器,现在想让异地的朋友能够看到这个服务器上的内容,那我们就可以使用一下命令: ssh -CNfR b_port:127.0.0.1:80 b_user@b_ip b_port自己定义,不要冲突就行,之后我们通过b_ip:b_port就可以访问到主机A的http服务了。 |
|