原理
内网穿透由三部分组成:Control端(A)、bridge&server端(B)、agent端(C)。Control与server通过bridge进行桥接。
系统:centos7
A:内网ip10.9.102.33(vpn)
B:公网ip 123.206.66.166 内网ip10.9.102.28(vpn)
C:内网ip 192.168.228.129(无外网ip,能访问外网)
需求
使A能通过B连接到(ssh)C机器的22端口。
实现
使用工具:goproxy 官方地址:https://github.com/snail007/goproxy
部署
安装goproxy
分别在B和C上安装goproxy工具。
百度云下载地址:链接: https://pan.baidu.com/s/1c56eYi 密码: zk4u
自动安装:
curl -L https://raw.githubusercontent.com/snail007/goproxy/master/install_auto.sh | bash
手动安装(安装前自己创建部署目录):
mkdir /home/proxy
cd /home/proxy
##下载守护进程monexec
wget https://github.com/reddec/monexec/releases/download/v0.1.1/monexec_0.1.1_linux_amd64.tar.gz
##下载proxy
wget https://github.com/snail007/goproxy/releases/download/v3.7/proxy-linux-amd64.tar.gz
##下载自动安装脚本:
wget https://raw.githubusercontent.com/snail007/goproxy/master/install.sh
##安装
/bin/bash install.sh
配置内网穿透
B机器
##创建proxy的公钥和私钥文件
proxy keygen
##建立端口映射
proxy tbridge -p ":33080" -C proxy.crt -K proxy.key --daemon
proxy tserver -r ":2202@:22" -P "127.0.0.1:33080" -C proxy.crt -K proxy.key --daemon
//参数的详细解释看官方文档
完成!
C机器
##拷贝B机器的公钥和秘钥文件:
scp 123.206.66.166:/usr/local/src/goproxy/proxy.key /home/proxy/
##建立映射
proxy tclient -P "123.206.66.166:33080" -C proxy.crt -K proxy.key
Done!
连接
A机器 通过B连接C:22:
##远程连接测试
ssh -p 2202 root@123.206.66.166
//-p:指定端口(默认是22端口)
password:输入C机器的密码即可!
goproxy部署demo
首先先安装proxy,在bridge端生成公钥proxy.crt和proxy.key,并拷贝到agent机器上;同时将控制机Control的公钥放入agent机器的“.ssh/authorized_keys”文件,为后续ssh密钥登陆做准备。
bridge&server部署
开启bridge服务:
proxy tbridge -p ":33080" -C proxy.crt -K proxy.key
开启server服务:
proxy server -r ":port@[HOSTNAME]:22” -P "127.0.0.1:33080" -C proxy.crt -K proxy.key --daemon
agent部署
主机名 | 开放端口 | 内网ip |
---|---|---|
office01 | 22021 | 192.168.2.251 |
office02 | 22022 | 192.168.2.252 |
office03 | 22023 | 192.168.2.253 |
proxy client —k HOSTNAME -P "123.59.66.166:33080" -C proxy.crt -K proxy.key --daemon
依次在agent机器执行该命令(注意更换HOSTNAME)。
配置control机器ssh端口转发
普通转发:
[root@control ~]$ vi /root/.ssh/config
Host office03
IdentityFile ~/.ssh/id_rsa
HostName 123.59.66.166
Port 22023
配置完成后登陆方式:
[root@control ~]$ ssh user@office03
使用proxycommand实现转发:
Host dxx.sxx-bastion //代理主机
Hostname 123.59.66.166 //代理主机ip
Port 22023 //代理端口
Host office03 //被代理主机
HostName 192.168.3.253 //被代理主机内网ip
ProxyCommand ssh dxx.sxx-bastion -W %h:%p //代理命令
IdentityFile ~/.ssh/id_rsa //远程control机器的私钥
##注:使用proxycommand的目的是使内网ip暴露出来,使其能被加以利用。
配置完成后的连接方式:
ssh user@office03
该部分可优化!!!
加入systemctl管理
因为proxy没有自带的进程管理脚本,为了方便使用将其加入systemctl服务管理。
- bridge&server服务器
#goproxy_bridge
[root@bridge ~]# cat /usr/lib/systemd/system/goproxy_bridge.service
[Unit]
Description=Goproxy Bridge Service
After=syslog.target
After=network.target
[Service]
User=root
Group=root
ExecStart=/usr/bin/proxy bridge -p ":33080" -C /home/proxy/proxy.crt -K /home/proxy/proxy.key
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
#goproxy_server
#启动脚本
[root@bridge ~]# vi /home/proxy/goproxy_server.sh
#!/bin/bash
#Written 2017-12-06
#Using for starting server of goproxy
/usr/bin/proxy server -r ":22023@[office03]:22" -r ":22022@[office02]:22" -r ":22021@[office01]:22" -P "127.0.0.1:33080" -C /home/proxy/proxy.crt -K /home/proxy/proxy.key
[root@bridge ~]# chmod 755 /home/proxy/goproxy_server.sh
[root@bridge ~]# cat /usr/lib/systemd/system/goproxy_server.service
[Unit]
Description=Goproxy Server Service
After=syslog.target
After=network.target
[Service]
User=root
Group=root
ExecStart=/home/proxy/goproxy_server.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
//使用脚本的目的是避免启动程序的参数在status暴露
- agent机器
#启动脚本
[root@office03 ~]# cat /home/proxy/goproxy_client.sh
#!/bin/bash
#Written 2017-12-06
#Using for starting proxy
/usr/bin/proxy client --k $HOSTNAME -P "123.59.66.166:33080" -C /home/proxy/proxy.crt -K /home/proxy/proxy.key
#加入systemctl
[root@office03 ~]# cat /usr/lib/systemd/system/goproxy_client.service
[Unit]
Description=Goproxy Client Service
After=syslog.target
After=network.target
[Service]
User=root
Group=root
ExecStart=/home/proxy/goproxy_client.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
- 管理命令:
systemctl start/status/stop unit(服务名称)