简介
内网穿透,即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