# 科学的公司内网连接技术选型

## 简介

这篇文章主要介绍如何在家、或者在外出差的时候能够连回办公室的内网办公，享受福报。 本文是一个简介性质的文章，具体技术细节网上有很多博客，况且最近还兴起了用Docker搭建的风潮，不能更方便了。 请不要把本文的技术用于其他用途哦，否则后果自负～（手动狗头）

本文中的技术我们主要评价两个方面：

1. 第一个是方便易用，不能为了连接一个内网弄的很麻烦，这会降低享受福报的效率。
2. 第二个是安全隐蔽，假设有坏人在你公司的外面拦截了你的通信，进行中间人攻击（比如，据我所知各大运营商都会对HTTP协议做一定的中间人攻击来注入广告），时不时还根据且听的流量给你断断网或者做重放攻击什么的。我们的连接方式要经得起考验，安全可靠而且隐蔽。

（按说没有那么多狗黑客的，可有的时候就是瘸子的屁股——斜了门了……不知道咋回事，这连接就不能稳定，所以第二项也是非常重要的考量因素。）

## 内网连接方法介绍

首先假设你在公司有一台Linux服务器，可以搭建各种服务。 这里的Linux也可以是Docker或者WSL系统，但是要设置好宿主机的网络设置。

### SSH 隧道

这个是最常用的临时方案，SSH隧道建立方便，可以反向代理映射固定的端口，也可以建立socks代理进行访问。

这里姑且假设你在公司有一台Linux服务器，并且你能以SSH登陆（一般是22端口），那这个时候你可以开通一个隧道，只需要在本机执行命令： `ssh -qTNf -D 127.0.0.1:1080 <User name>@<Public IP>`

这样就构建了一个端口是1080的socks代理。 参数就不作过多的说明了，网上有很多博客有详细的解说。

如果你在用浏览器，可以尝试安装插件：[SwitchyOmega](https://github.com/FelisCatus/SwitchyOmega)，一般火狐或者Chrome都可以下载。 在配置中使用这个端口连接，就可以达到连接公司内网的目的，这个时候你就可以打开只有在公司内网才能打开的网页。

同时，SSH还可以作为跳板机连接其他内网机器，一般在ssh config里面设置 `ProxyCommand ssh -o Compression=no <跳板机> nc %h %p` 来做，这里暂时按下不表。

安全性上，SSH采用非对称加密，黑客无法获取通信内容。 缺点是流量特征明显，容易被人刺探到这是个SSH端口（然后经常会收到弱口令攻击），所以密码一定要设置复杂一些。 同时，推荐使用公私钥登陆，而不是密码。

### HTTPS 代理

HTTP代理很容易实现，也很容易使用，历史悠久，这里就不赘述了。 但是HTTP代理也存在一个问题：流量透明，别人很轻松就知道你在搞代理，还能知道你在干什么。

所以我们加一层TLS，比如利用Nginx，就可以把一个HTTP的服务转化为HTTPS服务，甚至可以挂在到某个网站的特定的路径下。 如果公司有HTTPS的官网或者博客的话，可以尝试使用这个方法挂载HTTPS代理，记得加上Authentication。这一套都是Nginx反向代理的标准操作了。

并不推荐根路径直接连接作为代理的路径，容易被黑客刺探到这个域名就是做代理的，然后被攻击。

同样，HTTPS代理也可以被SwitchyOmega使用。

### PPTP/L2TP/OpenVPN/AnyConnect

这是非常标准的VPN，设计之初也就是为了安全的连接公司内网而设计的，Windows/Linux也有比较好的系统级别的支援。其中L2TP使用的的UDP端口，使用需注意。

唯一的问题在于，如果你的公司或者子公司在海外，因为某种原因（大概是离得太远没信号吧，嗯，一定是），你的PPTP/L2TP/OpenVPN服务会非常不稳定，可以说基本不可用。

如果你有海外公司，但是又一定要享受便利，推荐你配合内网穿透一起使用。

这里的例外是AnyConnect，虽然大家（含SSH）流量特征都很明显，但是由于AnyConnect被大公司使用，海外连接的时候不易出现PPTP那样的不稳定现象。

安全性上基本都没有问题（PPTP除外），只是容易被且听到你在使用的技术。

### 其他方式

1. [v2ray](https://www.v2ray.com/)

理论上说V-Project只是一套协议规范，核心是[V-Mess协议](https://www.v2ray.com/developer/protocols/vmess.html)。 但是v2ray作为代理工具的确是功能强大，不仅仅是单纯的代理，甚至可以做到规则路由。可以创建诸如A网站使用X代理，B网站不使用，C网站使用Y代理等等复杂规则。 配置过程略痛苦，JSON文件编辑很头疼，经常一写就很长，但是配置好以后使用非常方便。是我强力推荐的工具。 V2Ray在安全上是我见过做的最好的，支持混淆，防止刺探，防止重放攻击。某些黑客基本就是**狗**拿刺猬——无从下口了。

1. Shadowsocks

Shadowsocks也只是一个协议，有很多的实现。 不过作者喝茶了，加上v2ray也支持ss协议，这里不赘述了。 这里对作者说一句Respect，感谢每一个无私开源的人。

需要说一句的是，ShadowsocksR很火，但是并不推荐使用。

1. GoProxy

GoProxy可以设置一些基础的代理，但是这个工具更大的作用是创建内网穿透，下文会介绍。

## 内网穿透

大多数的时候，你可能没有公网IP，或者你没有权限使用公网IP，或者因为某种原因你连接不上这个IP（比如你所在的地区屏蔽了这个IP）。

这个时候就需要内网穿透了，说到内网穿透，比较有名的是花生壳。但是花生壳的收费也并不便宜。 当然你也可以自建，自建内网穿透的前提是：

> 你有一台服务器，并且这台服务器有公网IP。

最简单的方式就是买了，比如百度腾讯阿里美团各种云，缺点是价格贵，公网带宽价格**异常的贵**，还不如用花生壳。

最好的方法是，尝试在办宽带的时候要求有公网IP（可能会多收钱），如果是静态的IP那就可以直接用IP，如果是动态的IP，那就买个域名做个DDNS。这是我写的阿里云的DDNS方案：[TsingJyujing/aliyun-ddns-client](https://github.com/TsingJyujing/aliyun-ddns-client)，欢迎Fork。

和之前一样，这里的服务器可以用个人电脑代替（可以在家里建立机房，想想就兴奋）。

有了服务器，内网穿透的方案大致有（花生壳以外）：

* Ngrok
* GoProxy

Ngrok的教程网上一搜一大把，GoProxy的资料少一点，参考[官方文档中内网穿透一章](https://snail.gitee.io/proxy/manual/zh/#/?id=_4%e5%86%85%e7%bd%91%e7%a9%bf%e9%80%8f)。

这里我需要评价GoProxy几句：

1. 这是个开源软件，但是源代码并不是及时更新的，总是晚于二进制包慢一点更新，而且似乎也并不全，所以并不是真正开源。
2. 曾经在7.8版本的时候我遇到过：
   * GoProxy要自动检查更新
   * 但是GoProxy的更新网址设置了反爬虫的CDN
   * 这个反爬虫CDN会导致自动更新失败
   * 自动更新失败导致整个程序无法使用

我认为这个是很好的工具，堪称代理界瑞士军刀，不输netcat，但是软件稳定性及开源精神方面有待加强。

穿透内网以后，就可以使用上面介绍的内网连接方法了，只要把端口映射出来就好。

内网穿透还有一个好处，比如你直接搭建PPTP服务器，如果你的公司或者子公司在境外的话，服务会非常不稳定，可以说基本不可用，但是如果是通过内网穿透来做，稳定性就会好很多。

## 结尾

以上就是连接公司内网享受福报的全部方法了，难免有错漏之处，也可能有些新技术没有来得及更新。 不过有机会的话，还请动手尝试一下。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blog.tsingjyujing.com/tech/network/intranet.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
