背景介绍 ssh工具对于大部分程序猿是最常使用的工具了。但跨网络使用ssh可能会产生种种问题,以下是我们的场景:
有一个服务器集群,内部由局域网连接 ,同时只指定了一个公网IP给网关机 。我们在局域网内,使用指定网关的方式,可以很简单的使用外网,但如果想要从公网上 使用ssh连接到指定服务器 ,却需要额外配置。
通常使用的方法包括:
NAT穿透
正向代理
我们主要介绍第二种方式。通过正向代理,我们可以通过唯一确定的代理IP(即网关机Ip)和局域网内服务器IP进行ssh连接。同时配置代理后,集群数量可以动态调节,不需要对代理服务器进行多余配置。
代理服务器(网关机)公网IP为:222.222.22.2(我胡编的一个IP),内网IP为192.168.1.1/24
希望连接的服务器内网IP:192.168.1.32/24
步骤 安装iptables 因为代理服务器系统为centos7,需要安装iptables进行精细的访问控制。如果系统为centos6,则跳过当前步骤。
查看iptables是否安装
1 $ systemctl status iptables
如果未安装,安装iptables
1 $ yum -y install iptables-services
关闭selinux与firewalld
关闭selinux,不关闭时,iptables不读取配置文件
centos7中默认的防火墙是firewalld,使用iptables需要先关闭firewalld防火墙
首先关闭selinux
1 2 $ setenforce 0 $ vim /etc/selinux/config
1 2 3 4 5 6 7 8 9 10 11 12 # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled #设为disabled # SELINUXTYPE= can take one of three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. # SELINUXTYPE=targeted
其次关闭防火墙
1 2 3 4 # 关闭防火墙 $ systemctl stop firewalld # 关闭开机自启 $ systemctl disable firewalld
配置iptables
1 2 # 打开iptables文件 $ vim /etc/sysconfig/iptables
完成的iptables配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # Generated by iptables-save v1.4.7 on Tue Nov 17 17:11:57 2020 # 配置nat, *nat :PREROUTING ACCEPT [639:204921] :POSTROUTING ACCEPT [10:682] :OUTPUT ACCEPT [13:854] -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 222.222.22.2 COMMIT # Completed on Tue Nov 17 17:11:57 2020 # Generated by iptables-save v1.4.7 on Tue Nov 17 17:11:57 2020 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [12404:4566425] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT # 开启22端口,允许ssh访问本机 -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT # 开启9001端口,允许本机作为tinyproxy的代理服务器 -A INPUT -p tcp -m state --state NEW -m tcp --dport 9001 -j ACCEPT # 开启5001端口,允许使用本机作为iperf测试服务器 -A INPUT -p tcp -m state --state NEW -m tcp --dport 5001 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited # 允许外网流量进入192.168.1.0网段内的机器,即局域网 -A FORWARD -d 192.168.1.0/24 -j ACCEPT -A FORWARD -s 192.168.1.0/24 -j ACCEPT -A INPUT -p icmp -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Tue Nov 17 17:11:57 2020
开启iptables服务
1 2 $ systemctl start iptables $ systemctl enable iptables
安装tinyproxy
安装epel源,能够安装额外的软件包(包括tinyproxy)
1 $ yum install -y epel-release
安装tinyproxy
1 $ yum -y install tinyproxy
配置tinyproxy。首先打开配置文件
1 $ vim /etc/tinyproxy/tinyproxy.conf
我们需要修改的参数包括:
1 2 3 4 5 6 7 8 9 10 11 #配置代理端口 Port 9001 #配置最大连接数 MaxClients 100000 # 添加允许代理的端口。我们需要代理ssh服务,因而添加22和443端口。 ConnectPort 443 ConnectPort 563 ConnectPort 22
启动tinyproxy
1 $ systemctl start tinyproxy
效果 完成上述配置后,我们可以使用代理ip+内网ip的方式访问内网服务器。