使用goproxy实现内网穿透
snail007 edited this page 2019-09-30 09:40:58 +08:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

原理

内网穿透由三部分组成Control端A、bridge&server端B、agent端C。Control与server通过bridge进行桥接。

系统centos7
A内网ip10.9.102.33vpn
B公网ip 123.206.66.166 内网ip10.9.102.28vpn
C内网ip 192.168.228.129无外网ip能访问外网

需求

使A能通过B连接到sshC机器的22端口。

实现

使用工具goproxy 官方地址:https://github.com/snail007/goproxy

部署

安装goproxy

分别在B和C上安装goproxy工具。

自动安装:
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 -C proxy

##建立端口映射
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连接A:22

##远程连接测试
ssh -p 2202 root@123.206.66.166
//-p指定端口默认是22端口

password输入C机器的密码即可

goproxy部署demo

20171209151278519763109.png

首先先安装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服务名称

文章作者

@阿dai
来源:https://my.oschina.net/u/3497124/blog/1578253