原理

内网穿透由三部分组成: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

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
office0122021192.168.2.251
office0222022192.168.2.252
office0322023192.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(服务名称)