mirror of
https://github.com/snail007/goproxy.git
synced 2026-04-02 02:38:18 +00:00
Page:
使用goproxy实现内网穿透
Clone
Table of Contents
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.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工具。
自动安装:
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
首先先安装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(服务名称)
