通过服务器反向代理进行内网穿透的解决方案-实现在家里访问公司内网gitlab

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/icemaker88/article/details/96158252

场景:

假设在主机 A(比如家里电脑) 中有一个网站(应用),这台主机没有公网 IP,无法在公网上直接访问。

另有一台主机 B(云服务器),它可以由公网访问。

现在我们需要把 B 作为入口,把流量从 B 转发到 A。

从而实现从任何公网主机C(比如手机,公司),直接访问A上的服务

 

1,准备工作:

主机A:运行WINDOWS或者linux,能正常上网

主机B:运行WINDOWS或者linux,能正常上网,并且有固定公网IP

任意应用,本例使用gitlab 部署到主机A docker 安装 端口映射8888:80

v2ray 分别安装在A和B上

 

2,安装v2ray

 
        一建安装脚本:

bash <(curl -L -s https://install.direct/go.sh)


        
      V2Ray 提供了一个在 Linux 中的自动化安装脚本。这个脚本会自动检测有没有安装过 V2Ray,如果没有,则进行完整的安装和配置;如果之前安装过 V2Ray,则只更新 V2Ray 二进制程序而不更新配置。

        以下指令假设已在 su 环境下,如果不是,请先运行 sudo su。
        
        运行下面的指令下载并安装 V2Ray。当 yum 或 apt-get 可用的情况下,此脚本会自动安装 unzip 和 daemon。这两个组件是安装 V2Ray 的必要组件。如果你使用的系统不支持 yum 或 apt-get,请自行安装 unzip 和 daemon
        
        bash <(curl -L -s https://install.direct/go.sh)
        此脚本会自动安装以下文件:
        
        /usr/bin/v2ray/v2ray:V2Ray 程序;
        /usr/bin/v2ray/v2ctl:V2Ray 工具;
        /etc/v2ray/config.json:配置文件;
        /usr/bin/v2ray/geoip.dat:IP 数据文件
        /usr/bin/v2ray/geosite.dat:域名数据文件
        此脚本会配置自动运行脚本。自动运行脚本会在系统重启之后,自动运行 V2Ray。目前自动运行脚本只支持带有 Systemd 的系统,以及 Debian / Ubuntu 全系列。
        
        运行脚本位于系统的以下位置:
        
        /etc/systemd/system/v2ray.service: Systemd
        /etc/init.d/v2ray: SysV
        脚本运行完成后,你需要:
        
        编辑 /etc/v2ray/config.json 文件来配置你需要的代理方式;

        (配置方式见下方第3节)

       

 vi /etc/v2ray/config.json


        运行 service v2ray start 来启动 V2Ray 进程;

service v2ray start


        之后可以使用 service v2ray start|stop|status|reload|restart|force-reload 控制 V2Ray 的运行。
        
3 配置 (为了方便解释加上注释,实际配置请删除注释)
    3.1 内网机A:

config.json

{  
  "reverse":{ 
    // 这是 A 的反向代理设置,必须有下面的 bridges 对象
    "bridges":[  
      {  
        "tag":"bridge", // 关于 A 的反向代理标签,在路由中会用到
        "domain":"private.cloud.com" // A 和 B 反向代理通信的域名,可以自己取一个,可以不是自己购买的域名,但必须跟下面 B 中的 reverse 配置的域名一致
      }
    ]
  },
  "outbounds": [
    {  
      //A连接B的outbound  
      "tag":"tunnel", // A 连接 B 的 outbound 的标签,在路由中会用到
      "protocol":"vmess",
      "settings":{  
        "vnext":[  
          {  
            "address":"serveraddr.com", // B 地址,IP 或 实际的域名
            "port":3333,//端口AB要统一
            "users":[  
              {  
                "id":"b831381d-6324-4d53-ad4f-8cda48b30811", //AB要统一
                "alterId":64 //AB要统一
              }
            ]
          }
        ]
      }
    },
    // 另一个 outbound,最终连接私有服务    
    {  
      "protocol":"freedom",
      "settings":{  
      },
      "tag":"out"
    }    
  ],
  "routing":{   
    "rules":[  
      {  
        // 配置 A 主动连接 B 的路由规则
        "type":"field",
        "inboundTag":[  
          "bridge"
        ],
        "domain":[  
          "full:private.cloud.com" //AB要统一
        ],
        "outboundTag":"tunnel"
      },
      {  
        // 反向连接访问私有服务的规则
        "type":"field",
        "inboundTag":[  
          "bridge"
        ],
        "outboundTag":"out"
      }
    ]
  }
}


3.2 外网机B
  config.json

{  
  "reverse":{  //这是 B 的反向代理设置,必须有下面的 portals 对象
    "portals":[  
      {  
        "tag":"portal",
        "domain":"private.cloud.com"        // 必须和上面 A 设定的域名一样
      }
    ]
  },
  "inbounds": [
    {  
      // 接受 C 的inbound
      "tag":"external", // 标签,路由中用到
      "port":8888,
      // 开放 8888端口,用于接收外部的 HTTP 访问 
      "protocol":"dokodemo-door",
        "settings":{  
          "address":"127.0.0.1",//私有服务的内网地址
          "port":8888, //假设监听的端口为 8888
          "network":"tcp"
        }
    },
    // 另一个 inbound,接受 A 主动发起的请求  
    {  
      "tag": "tunnel",// 标签,路由中用到
      "port":3333,//AB端口要统一
      "protocol":"vmess",
      "settings":{  
        "clients":[  
          {  
            "id":"b831381d-6324-4d53-ad4f-8cda48b30811", //AB要统一
            "alterId":64 //AB要统一
          }
        ]
      }
    }
  ],
  "routing":{  
    "rules":[  
      {  //路由规则,接收 C 请求后发给 A
        "type":"field",
        "inboundTag":[  
          "external"
        ],
        "outboundTag":"portal"
      },
      {  //路由规则,让 B 能够识别这是 A 主动发起的反向代理连接
        "type":"field",
        "inboundTag":[  
          "tunnel"
        ],
        "domain":[  
          "full:private.cloud.com" //AB要统一
        ],
        "outboundTag":"portal"
      }
    ]
  }
}

4修改gitlab为相对路径:

4.1.  修改文件: 

vim /etc/gitlab/gitlab.rb

找到 external_url

external_url "https://192.168.0.111/gitlab"

4.2.  重新配置GitLab,以使更改生效:

gitlab-ctl reconfigure

4.3. 重启gitlab服务:

gitlab-ctl restart

 5,登录成功:

 

展开阅读全文

没有更多推荐了,返回首页