背景介绍

ssh工具对于大部分程序猿是最常使用的工具了。但跨网络使用ssh可能会产生种种问题,以下是我们的场景:

有一个服务器集群,内部由局域网连接,同时只指定了一个公网IP给网关机。我们在局域网内,使用指定网关的方式,可以很简单的使用外网,但如果想要从公网上使用ssh连接到指定服务器,却需要额外配置。

通常使用的方法包括:

  1. NAT穿透
  2. 正向代理

我们主要介绍第二种方式。通过正向代理,我们可以通过唯一确定的代理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,则跳过当前步骤。

  1. 查看iptables是否安装
1
$ systemctl status iptables
  1. 如果未安装,安装iptables
1
$ yum -y install iptables-services
  1. 关闭selinux与firewalld

  关闭selinux,不关闭时,iptables不读取配置文件   

  centos7中默认的防火墙是firewalld,使用iptables需要先关闭firewalld防火墙

首先关闭selinux

1
2
$ setenforce 0     #关闭selinux
$ 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
  1. 配置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
  1. 开启iptables服务
1
2
$ systemctl start iptables    #启动
$ systemctl enable iptables #设置开机自启

安装tinyproxy

  1. 安装epel源,能够安装额外的软件包(包括tinyproxy)
1
$ yum install -y epel-release
  1. 安装tinyproxy
1
$ yum -y install tinyproxy
  1. 配置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

  1. 启动tinyproxy
1
$ systemctl start tinyproxy

效果

完成上述配置后,我们可以使用代理ip+内网ip的方式访问内网服务器。