一、前言
多台服务器组成的集群并不是每台都配置外网访问,大部分采用的策略是集群彼此通过内网连接。再通过统一的公共机(跳转机)访问外网。本文就是基于这样一种网络结构,写明如何通过xshell的隧道技术连接内网服务器。
二、前提
1、本文假设一下服务器情况,跳转机地址:220.111.111.111,内网服务器两台:192.168.1.11 192.168.1.12。
2、所需软件:Xshell
三、配置Xshell
1、跳转机配置
打开XShell点击文件菜单再点击新建弹出新建会话属性窗口,名称就取为跳转机,端口是22,主机填写前面假设的ip地址。
2、点击用户身份验证,填写登录跳板机的SSH用户名和密码。
3、接下来继续配置连接内网服务器的隧道,点击隧道再点击添加按钮进入隧道添加页面,源主机为本机localhost,侦听端口可以在有效范围内随便填写,本文配置30022作为侦听端口。目标主机就是我们要通过跳板机访问的内网主机,端口是22。同样的操作再配置一个连接192.168.1.12的隧道,端口不能与30022冲突。具体配置如下图:
4、到此跳板机的配置已经完成了,下面来建立通过跳板机登录内网服务器的连接会话,首先还是进入新建会话属性窗口,注意一下这次的配置,主机为localhost,侦听端口为刚才的30022,即这个配置连接之后是访问内网的192.168.1.11服务器,再配置一下用户身份验证,填写内网服务器的账号和密码。这样一台内网服务器的连接配置就完成了,同样的操作再配置192.168.1.12的连接。具体如下图:
5、到此跳板机、隧道及内网的两台服务器连接都配置完成了。下面就该测试连接了,先打开跳转机的连接,再打开两台内网服务器的连接,若正常连接上就配置正确了。特别注意:跳转机一定要先打开,因为内网服务器的连接都是基于跳转机的侦听端口。
四、利用ssh命令进行端口映射
可以将远端服务器一个端口remote_port绑定到本地端口port,其中-C是进行数据压缩,-f是后台操作,只有当提示用户名密码的时候才转向前台。-N是不执行远端命令,在只是端口转发时这条命令很有用处。-g 是允许远端主机连接本地转发端口。-R表明是将远端主机端口映射到本地端口。如果是-L,则是将本地端口映射到远端主机端口。
ssh的三个强大的端口转发命令:
1、转发到远端:ssh -C -f -N -g -L 本地端口:目标IP:目标端口 用户名@目标IP
#例子,目标主机192.168.0.110,目标主机要转发的端口8000,跳转机给提供的端口是8018;
#在跳转机下执行如下命令
ssh -C -f -N -g -L 8018:0.0.0.0:8000 192.168.0.110
2、转发到本地:ssh -C -f -N -g –R 本地端口:目标IP:目标端口 用户名@目标IP
3、动态转发:ssh -C -f -N -g -D listen_port user@Tunnel_Host
-C:压缩数据传输。
-f :后台认证用户/密码,通常和-N连用,不用登录到远程主机。
-N :不执行脚本或命令,通常与-f连用。
-g :在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。
-L 本地端口:目标IP:目标端口
-L port:host:hostport
将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-R port:host:hostport
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-D port
指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS4 协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.
五、iptables实现端口映射
1、首先,必须开启linux的数据转发功能,具体开启步骤如下:
vi /etc/sysctl.conf
###将net.ipv4.ip_forward=0更改为net.ipv4.ip_forward=1
使数据转发功能生效::sysctl -p(这条命令是使数据转发功能生效)
2、现在就可以更改iptables了,使之实现nat映射功能:
例如:你要将外网访问本地IP(192.168.75.5)的80端口转换为访问192.168.75.3的8000端口,你可以用如下命令:
(1)iptables -t nat -A PREROUTING -d 192.168.75.5 -p tcp --dport 80 -j DNAT --to-destination 192.168.75.3:8000
(2)iptables -t nat -A POSTROUTING -d 192.168.75.3 -p tcp --dport 8000 -j SNAT 192.168.75.5
3、可以使用命令:iptables -t nat --list检查nat列表信息:
六、真实场景
有两台服务器A\B,具体信息如下,目的:使用户通过外网10.138.108.103:8001访问内网服务器192.168.1.1:8001
服务器A有两个网卡
内网ip:192.168.1.3
外网ip:10.138.108.103
本地回环:127.0.0.1
服务器B有网卡,8001提供服务
内网ip:192.168.1.1
开启内核ip转发
vi /etc/sysctl.conf
将下项注释去掉
# net.ipv4.ipv4_forward=1
- 使改动生效
sudo sysctl -p
执行脚本:在root用户下执行
#!/bin/bash
pro='tcp'
src_host1='192.168.1.3'
src_host2='10.138.108.103'
src_port=8001
Dst_Host='192.168.1.1'
Dst_Port=8001
# 清空规则
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
# Destination network address translate (dnat)
# 如图2所示
iptables -t nat -A PREROUTING -p $pro -d $src_host1 --dport $src_port -j DNAT --to $Dst_Host:$Dst_Port
iptables -t nat -A PREROUTING -p $pro -d $src_host2 --dport $src_port -j DNAT --to $Dst_Host:$Dst_Port
iptables -A FORWARD -p $pro -d $Dst_Host --dport $Dst_Port -j ACCEPT
# 本地连接不经过prerouting,只经过output链,所以想要在服务器A通过本地ip访问服务器B需要在output 链增加dnat规则
iptables -t nat -A OUTPUT -p $pro -d $src_host1 --dport $src_port -j DNAT --to $Dst_Host:$Dst_Port
iptables -t nat -A OUTPUT -p $pro -d $src_host2 --dport $src_port -j DNAT --to $Dst_Host:$Dst_Port
# source network address translate (snat)
iptables -t nat -A POSTROUTING -p $pro -d $Dst_Host --dport $Dst_Port -j SNAT --to $src_host1
# 显示已有规则
iptables -t nat -L -n --line-number
【参考文章】
参考文章1:https://www.jianshu.com/p/20600c91e656
参考文章2:https://www.cnblogs.com/sky-of-chuanqingchen/p/3343908.html
参考文章3:第五部分:https://blog.csdn.net/light_jiang2016/article/details/79029661
参考文章4:ssh 端口映射内网穿透https://blog.csdn.net/zhaoyangkl2000/article/details/77961356