由于公网IP资源越来越紧张,现在很多运营商给拨号上网的用户只分配内网IP地址,如下图所示:

没有公网IP如何实现内网穿透?_第1张图片

这样的运营商内网IP是外网不可达的(即使用动态域名也不起作用)。而企业由于业务需要,比如虚拟局域网组网、办公OA系统、ERP系统等,都需要有公网IP才可以实现。公网IP的解决,目前主要有三种方案:

  1. 申请固定IP专线。稳定且速度有保障,缺点是费用高。

  2. 云方案。把业务主机都搬到云上,直接通过云主机来访问。费用比较低,缺点是云主机不能本地维护,且搬迁工作量都不小。

  3. 云主机+内网穿透方案。通过云主机做跳板来实现内网穿透,既可以复用现有的业务系统,又解决了公网IP的问题。第三种方案的成本是最低的,但是配置比较复杂。本文将对第三种方案做详细介绍。

在没有公网IP如何实现×××组网?一文中,我们介绍了虚拟局域网组网部分。我们要介绍的方案,分为两个步骤:1). 本地局域网和云主机之间搭建虚拟局域网。2). 在云主机上配置内网穿透的防火墙规则。具体步骤如下:

1. 搭建虚拟局域网

首先要在云主机上安装虚拟局域网软件,配置ca证书等,网络上已经有很多介绍,我就不再赘述了。下图是最终的server端config文件。

没有公网IP如何实现内网穿透?_第2张图片

然后是客户端配置。在WSG的客户端中,配置上云主机的IP和端口、用户名密码等信息。即可成功组网。如图:

没有公网IP如何实现内网穿透?_第3张图片

没有公网IP如何实现内网穿透?_第4张图片

2. 内网穿透的防火墙规则

组建虚拟局域网后,本地局域网就和云主机处于同一个局域网内。我们再通过iptables配置一些防火墙规则,就可以把外网访问重定向到局域网内部;原理和端口映射是一样的。命令如下:

没有公网IP如何实现内网穿透?_第5张图片

每一条内网穿透(端口映射)都由两条iptables命令组成:

  1. DNAT:iptables -t nat -A PREROUTING -p tcp --dport xx -j DNAT --to-dest x.x.x.x

  2. SNAT:iptables -t nat -A POSTROUTING -d x.x.x.x -p tcp --dport xx -j SNAT --to-source y.y.y.y

其中,x.x.x.x是局域网内网主机的IP地址,y.y.y.y是云主机的内网网段IP。


经过上述配置后,直接访问云主机的对应端口就可以穿透到内网。该方案是由iptables做数据包转发,不需要保持连接做反向代理,稳定性和速度都比frp之类的反向代理要好的多。要实现开机自动添加规则的话,只需要把这两条iptables命令添加到/etc/rc.local文件中。