简介

内网穿透,即NAT穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽能正确路由到内网主机,当计算机处于局域网内时,外网与内网的计算机节点需要连接通信通过映射端口,这样才能让外网的电脑找到处于内网的电脑 网络地址转换(Network Address Translation,NAT)机制的问题在于,NAT设备会自动屏蔽非内网主机主动发起的连接,也就是说,从外网发往内网的数据包将被NAT设备丢弃,这使得位于不同NAT设备之后的主机之间无法直接交换信息,这样做虽然保护了内网主机免于来自外部网络的,但是也为P2P通信带来了一定困难 工作方式 端口映射,其实就是常说的网络地址转换(Network Address Translation,NAT)地址转换的一种,其功能就是把在公网的地址转翻译成私有地址, 采用路由方式的ADSL宽带路由器拥有一个动态或固定的公网IP,ADSL直接接在HUB或交换机上,所有的电脑共享上网。在局域网内部的任一PC或服务器上运行到内网穿透客户端,此时域名解析到的IP地址是局域网网关出口处的公网IP地址,再在网关处做端口映射指向监控设备即可 在NAT网关上会有一张映射表,表上记录了内网向公网哪个IP和端口发起了请求,然后如果内网有主机向公网设备发起了请求,内网主机的请求数据包传输到了NAT网关上,那么NAT网关会修改该数据包的源IP地址和源端口为NAT网关自身的IP地址和任意一个不冲突的自身未使用的端口,并且把这个修改记录到那张映射表上。最后把修改之后的数据包发送到请求的目标主机,等目标主机发回了响应包之后,再根据响应包里面的目的IP地址和目的端口去映射表里面找到该转发给哪个内网主机。这样就实现了内网主机在没有公网IP的情况下,通过NAPT技术借助路由器的一个公网IP来访问公网设备。

前期准备

准备三台Centos7虚拟机,配置IP地址和hostname,关闭防火墙和selinux,同步系统时间,配置IP地址和Hostname映射

hostname ip
server 192.168.29.143
client1 192.168.29.144
client2 192.168.29.142

server作为frp服务器(实际生产环境中应使用具有公网IP地址的服务器),client1和client2作为frp客户端(生产环境中为局域网内提供各种服务的后台服务器)

server端部署frp

上传压缩包并解压

[root@server ~]# tar -zxvf frp_0.33.0_linux_amd64.tar.gz -C /usr/local/frp

配置frp配置文件 为client1提供内网穿透服务

[root@server ~]# vi /usr/local/frp/frps.ini 
[common]
#绑定提供frp服务的端口
bind_port = 7000
#绑定提供后台服务器http服务的本机端口
vhost_http_port= 8080

为client2提供内网穿透服务

[root@server ~]# vi /usr/local/frp/frps_1.ini 
[common]
#绑定提供frp服务的端口
bind_port = 7100
#绑定提供后台服务器http服务的本机端口
vhost_http_port= 8088
#启动client1的内网穿透服务
[root@server ~]# nohup /usr/local/frp/frps -c /usr/local/frp/frps.ini >/dev/null  2>&1
#查看服务启动情况
[root@server ~]# netstat -tnlp |grep 7000
tcp6       0      0 :::7000                 :::*                    LISTEN      2664/./frps   

#启动client2的内网穿透服务
[root@server ~]# nohup /usr/local/frp/frps -c /usr/local/frp/frps_1.ini >/dev/null  2>&1
#查看服务启动情况
[root@server ~]#netstat -tnlp |grep 7100
tcp6       0      0 :::7100                 :::*                    LISTEN      2678/./frps      

client1部署frp

上传压缩包并解压

[root@client1 ~]# tar -zxvf frp_0.33.0_linux_amd64.tar.gz -C /usr/local/frp

配置frp配置文件

[root@client1 ~]# vi /usr/local/frp/frpc.ini 
[common]
#填写frp服务server端IP地址
server_addr = 192.168.29.143
#填写frp服务server端端口号
server_port = 7000
#配置ssh服务
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
#填写frp连接本地ssh的端口
remote_port = 6000
#配置web服务
[web]
type= http
#填写本地web服务端口
local_port= 80
#自定义域名
custom_domains= www.yourdomain1.com

#启动服务
[root@client1 ~]# /usr/local/frp/frpc -c /usr/local/frp/frpc.ini 
#启动结果
[control.go:179] [da1b4bbca0c62ea8] [ssh] start proxy success
[control.go:179] [da1b4bbca0c62ea8] [web] start proxy success

client2部署frp

上传压缩包并解压

[root@client2 ~]# tar -zxvf frp_0.33.0_linux_amd64.tar.gz -C /usr/local/frp

配置frp配置文件

[root@client2 ~]# vi /usr/local/frp/frpc.ini 
[common]
#填写frp服务server端IP地址
server_addr = 192.168.29.143
#填写frp服务server端端口号
server_port = 7100
#配置ssh服务
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
#填写frp连接本地ssh的端口
remote_port = 6100
#配置web服务
[web]
type= http
#填写本地web服务端口
local_port= 80
#自定义域名
custom_domains= www.yourdomain1.com

#启动服务
[root@client2 ~]# /usr/local/frp/frpc -c /usr/local/frp/frpc.ini 
#启动情况
[control.go:179] [5689a7618b620415] [ssh] start proxy success
[control.go:179] [5689a7618b620415] [web] start proxy success

client1和client2启动服务后,查看server端对ssh服务的监听状态

[root@server ~]# netstat -tnlp |grep 6000
tcp6       0      0 :::6000                 :::*                    LISTEN      2664/./frps         
[root@server ~]# netstat -tnlp |grep 6100
tcp6       0      0 :::6100                 :::*                    LISTEN      2678/./frps         

测试验证ssh服务

宿主机尝试通过server对client1和client2进行ssh连接

#连接client1
>ssh -oPort=6000 root@192.168.29.143
[root@client1 ~]# ip a
    inet 192.168.29.144/24 brd 192.168.29.255 scope global noprefixroute ens33

#连接client2
>ssh -oPort=6100 root@192.168.29.143
[root@client2 ~]# ip a
    inet 192.168.29.142/24 brd 192.168.29.255 scope global noprefixroute ens33

测试验证web服务

编辑宿主机的hosts文件进行域名解析

192.168.29.143	www.yourdomain1.com

测试client1 浏览器访问http://www.yourdomain1.com:8080 在这里插入图片描述 测试client2 浏览器访问http://www.yourdomain1.com:8088 在这里插入图片描述