一、前言
由于一些开发及使用需求,需要将内网机器端口映射到公网,达到公网访问内网环境的目的
本文主要介绍几种常用的内网穿透方案
- ssh远程端口转发
- 部署简单,无需额外安装软件包
- frp反向代理
- 功能配置丰富,部署相对复杂,需要额外安装软件包
二、ssh远程端口转发
1、说明
整体流程示意如下,内网机器通过ssh隧道与公网机器连接在一起,当用户访问公网机器指定端口时,公网机器把数据通过管道传输到内网机器,从而实现公网访问内网环境的目的
示例在内网机器上建立ssh连接,将公网机器8080端口绑定到内网机器80端口,所有发送给公网机器8080端口的数据,都会通过ssh隧道转发给内网机器80端口进行最终处理
2、配置
2.1、公网机器配置
- 配置sshd,开启GatewayPorts配置,允许端口转发
sed -i "s|#GatewayPorts no|GatewayPorts yes|" /etc/ssh/sshd_config
systemctl restart sshd
- 关闭防火墙或者开放监听端口访问
2.2、内网机器配置
内网机器执行命令,配置ssh端口转发:ssh -NTf -R {remote-ip}:{remote-port}:{local-ip}:{local-port} root@{remote-ip} -p {remote-ssh-port}
- -N:表示只连接远程主机,不打开远程shell
- -T:表示不为这个连接分配TTY
- -f:表示连接成功后,转入后台运行
- -R:表示将端口绑定到远程服务器,反向代理
- -p:默认为22端口,当远程服务器ssh端口非22端口时,需要单独指定
内网机器
[root@node253 ~]# ssh -NTf -R 8080:192.168.122.253:80 root@107.172.217.97 -p 22
[root@node253 ~]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1143 root 7u IPv4 28235 0t0 TCP *:http (LISTEN)
[root@node253 ~]# curl 127.0.0.1:80
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=renderer content=webkit><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title></title><link rel="shortcut icon" href=./favicon.ico><link href=./statics/css/app.46205092776a9bbb475848bede343ea8.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./statics/js/manifest.b09c107ad7fca7006ebf.js></script><script type=text/javascript src=./statics/js/vendor.52b14d12c6e40d435cf2.js></script><script type=text/javascript src=./statics/js/app.9c4b7074a0a0c7993553.js></script></body><script></script></html>公网机器
[root@node78 ~]# lsof -i:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 5070 root 8u IPv4 253167552 0t0 TCP *:multiling-http (LISTEN)
[root@node78 ~]# curl 107.172.217.97:8080
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=renderer content=webkit><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title></title><link rel="shortcut icon" href=./favicon.ico><link href=./statics/css/app.46205092776a9bbb475848bede343ea8.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./statics/js/manifest.b09c107ad7fca7006ebf.js></script><script type=text/javascript src=./statics/js/vendor.52b14d12c6e40d435cf2.js></script><script type=text/javascript src=./statics/js/app.9c4b7074a0a0c7993553.js></script></body><script></script></html>
注:内网机器网络不稳定时,ssh连接可能会被断开,需要再次发起ssh连接操作。如网络恶劣,可改用autossh进行连接(当ssh连接中断时,自动发起重连)
软件安装:
sudo yum install wget gcc make
wget http://www.harding.motd.ca/autossh/autossh-1.4e.tgz
tar -xf autossh-1.4e.tgz
cd autossh-1.4e
./configure
make
sudo make install
三、frp反向代理
1、说明
参考官方文档:gofrp.org
软件包github地址:fatedier/frp
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
节点类型 | 节点IP地址 | 角色 |
---|---|---|
公网机器 | 66.66.67.227 | frps |
内网机器 | 107.172.217.97 | frpc |
2、部署配置
需要将内网机器7480端口映射到公网机器8080端口提供访问
2.1、frps部署
公网机器执行以下操作部署frps
[root@node97 ~]# wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
[root@node97 ~]# tar -zxvf frp_0.38.0_linux_amd64.tar.gz
[root@node97 ~]# cd frp_0.38.0_linux_amd64
[root@node97 frp_0.38.0_linux_amd64]# cat frps.ini
[common]
bind_port = 7000
[root@node97 frp_0.38.0_linux_amd64]# ./frps -c frps.ini
注:如需长时间运行,可搭配screen
一起使用
2.2、frpc部署
内网机器执行以下操作部署frpc
[root@node227 ~]# wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
[root@node227 ~]# tar -zxvf frp_0.38.0_linux_amd64.tar.gz
[root@node227 ~]# cd frp_0.38.0_linux_amd64
[root@node227 frp_0.38.0_linux_amd64]# cat frpc.ini
[common]
server_addr = 107.172.217.95
server_port = 7000[radosgw]
type = tcp
local_ip = 66.66.67.227
local_port = 7480
remote_port = 8080
[root@node227 frp_0.38.0_linux_amd64]# ./frpc -c frpc.ini
- server_addr:frps节点IP地址
- server_port:frps节点通信端口,默认为7000
- type:代理类型,如tcp、udp、http、https等
- local_ip:frpc节点IP地址
- local_port:frpc节点服务端口
- remote_port:frps节点监听端口,当frps节点
remote_port
被访问时,相关流量会被转到到frpc节点local_ip
对应端口local_port