ssh隧道穿透连接内网机器&端口映射

一、前言

     多台服务器组成的集群并不是每台都配置外网访问,大部分采用的策略是集群彼此通过内网连接。再通过统一的公共机(跳转机)访问外网。本文就是基于这样一种网络结构,写明如何通过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

iptables_examples_network_topology

开启内核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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值