一.前言

大家好啊,我是Wake on Lan。看到这个标题是不是很诱人,众所周知啊,家宽加公网ip,在部分地区可以免费申请,部分地区收费(不便宜),而移动则是没有。但无论如何中国家宽ip是动态的而且不可能开80 443 25

某一天我在逛一个VPS商家的时候,看到他们还卖这个东西

我一看我去这可不得了,那么多VPS提供商,就他一个有这种服务,而当我点进去一看,发现了一些端倪

不是你怎么还开80 443呢???而且他还告诉我不一定要选和自己宽带同一个运营商的。这???(关于这个商家更多猫腻这里不再放出)

啊那我瞬间明白了,这个所谓的ip根本就不是家庭住宅ip,而是机房商业ip。

那他是怎么绑到你的设备呢?这就需要VPN了,别急这里的VPN是指虚拟局域网,比如我在北京的服务器和我自己电脑之间架了一个VPN,那么我可以从北京服务器通过一个内网IP连上我内网电脑。但这只是连上了,输入公网ip+端口时,怎么转发到我内网电脑的端口,这倒是很简单,只需要在公网服务器上配置一下iptables转发一下流量就好了,比如访问我公网ip的流量,除了ssh和wireguard的通讯端口,其他全部转发到虚拟内网的ip同端口上。

简单来说就是拿一台公网服务器和你的内网之间架起来VPN,并且在公网服务器上设置好转发流量。

我画了一个图,大致如图所示

当然这就是“内网穿透”,不过他是类似于nofrp的全端口映射,而且是连ping都转发了,延迟翻倍(不精确)

frp的劣势是一个一个端口映射很麻烦,而wireguard这种更接近于底层,绑在路由器上,绑在内网linux上或者windows都没有问题。我个人绑到了软路由istoreos(openwrt)上,这样配置端口转发就能公网访问了。

比如我在路由器配置了端口转发,直接就可以公网ip+端口访问。而且80也是可以用的,当然我的域名没有备案,直接ip在浏览器访问(默认80)端口就可以打开路由器后台了,当然这对于很多人来说有点危险,因此后面会教大家如何禁止公网80访问路由器

二.准备工作

工欲善其事,必先利其器。了解了原理后,我们就可以开始准备了。

首先是一台内网设备,最好是linux,我为了方便内网设备用软路由,也就是把公网ip绑软路由上,因为有图形界面,看的比较舒服,而且配置端口转发啥的很方便,我的软路由系统是istoreos,内核是openwrt。爱快也可以用。

然后就是一台公网服务器作为服务端,这里注意下,wireguard中实际上没有“服务端“”客户端“之分,因为都在这个虚拟大内网里,只不过我们在本次使用场景中,公网服务器转发流量,姑且称之为”服务端“。这台公网服务器优先使用国内的最好,第一点是延迟更好,其次是用国外机搭wireguard 过几天可能会墙端口,如果你换了wireguard的通讯端口,还有可能进而导致ip被墙,那就得不偿失了。本次教程我采用的是akile的日本IIJ,那既然我都说了不要用为什么还用呢,因为我现在正在用的是上一篇文章测试过的阿里云上海机,不想重装折腾一遍了,,,所以大家不要学我,我只是为了出教程所以拿这个闲置的来演示,还是要用国内机!!!!公网服务器的系统方面我们选择安装debian11或者12都可以其实,我这里安装11

三.安装步骤

配置两端wireguard

首先确保安全组全部放开,这个akile没有外面的安全组,少一步

登录公网服务器的ssh,先来更新下软件源

apt update

然后来安装wireguard -y是默认回车

apt install wireguard -y

现在我们要生成一下几个文件,分别是 服务端私钥、公钥以及共享密钥

文件会保存在你执行这条命令的目录下,比如我这里就会保存到/root里

umask 0777 && wg genkey | tee server_private_key | wg pubkey > server_public_key && wg genpsk > server_preshared_key

此时如果我们用xshell等软件,可以很方便的打开文件管理

这时候我们回到软路由:

安装以下包,红色框是必装

安装后,一定要按重启!!!重启后接口那里才有wireguard VPN可以选择

重启后我们还是回到软路由,打开接口,点击方框内的添加新接口

名称可以随便填,关键是协议要选wireguard VPN。我名称有过一个wg了,这里填wg_iij

点击创建。

创建后继续配置,来到常规配置,点击生成新的秘钥对

可以看到自动生成了

往下滑,这里需要注意的是添加你即将搭起来的虚拟内网中,此设备的iP地址,最好是10.开头,我这里设置成10.0.1.2,子网掩码是/24 ,那么这里填10.0.1.2/24

其实你设置成别的比如10.0.0.2/24也行。由于我已经配置过一个wireguard内网ip是10.0.0.2了,我不知道这第二个也配置成10.0.0.2会不会出岔子。但总之,必须和下面公网服务器端的虚拟ip在同一个网段

这时候不要着急退出,我们回到公网服务器的ssh。接着创建wg0.conf配置文件

touch /etc/wireguard/wg0.conf

由于配置文件我认为不适合在ssh的vim里面慢慢敲,所以我们直接打开xshell工具的xfrp,连上去打开此文件。注意路径是/etc/wireguard/ 里面只有一个文件那就是我们刚才生成的wg0.conf

这里是一个模板,先复制粘贴后自己修改:

[Interface]
PrivateKey = <服务端私钥>
Address = 10.0.0.1/24
ListenPort = 6666

[Peer]
PublicKey = <客户端公钥>
AllowedIPs = 10.0.0.2/32
PresharedKey = <共享密钥>

然后听我慢慢分解:

首先注意所有字符串与=之间都有空格 例如"ListenPort = 6666"中t和=,=和6之间都有空格。

第二行PrivateKey服务器私钥,请换成前面我们在服务器上生成的server_private_key中的内容

第三行Address 后面的ip需要和上一步我们在openwrt路由上设置的ip地址在同一网段,比如我前面是10.0.1.2,这里就设置成10.0.1.1/24 注意一下/24是子网掩码这里不要改。

第四行监听端口使用不常用的端口,我这里设置成了6666。建议不要太小

publickey这里 填写客户端的公钥,我们回到openwrt把这个复制一下

AllowedIPs 这里填写路由器设置的虚拟内网ip地址也就是10.0.1.2,子网掩码注意是/32 !!!!

PresharedKey填写的是共享秘钥,复制粘贴前面服务器生成的server_preshared_key里面的内容

最后应该如图所示,没有问题就可以保存了

接着还在公网服务器的ssh里,启动wireguard 配置文件为wg0.conf

wg-quick up wg0

还可以执行wg show查看状态,这里因为客户端没有开呢所以是hidden。不过wg0已经启动成功了

然后最好把它添加到开启自启动

systemctl enable wg-quick@wg0

回到openwrt,防火墙设置我们可以直接设置到WAN口上,也可以新建一个防火墙但是我懒得配

接着配置对端

描述随便填

公钥填公网服务器中server_public_key的内容

预共享秘钥填公网服务器中server_preshared_key的内容

允许ip可以设置允许全部ip 也就是0.0.0.0/0

私钥不要填

往下滑,端点主机填公网服务器的公网ip

端口填你前面wg0.conf配置文件中的监听端口

然后保存

这时候我们在路由器或者路由器下的电脑里,直接ping 10.0.1.1(你们那可能不一样)能ping通就行。国外机如果ping不通可能是被墙了,前面提醒过不要用国外机

可以输入wg show查看对端是否连接,当然你能ping通虚拟内网中对端ip 这个不验证也没事

(图是另外一台机器的截图,内网ip是10.0.0.1)

配置流量转发

这部分是在公网服务端配置。确保我们公网服务器和内网已经架起来了VPN,然后我们只需要转发流量,访问公网ip时全部转发到内网10.0.1.2就好了。

第一步我们要先配置下内核。

vim或者nano打开这个文件,这里使用nano

nano /etc/sysctl.conf

来到最后一行,添加一行

net.ipv4.ip_forward = 1

ctrl+s 保存

然后ctrl+x 退出编辑

重启一下内核

sysctl -p

现在我们需要进行流量转发

设置部分端口不转发

首先要确保你的操作系统支持iptables 可以通过命令行中直接输入iptables来查询。

如果没有可以安装iptables或者安装其他操作系统

先允许wireguard监听端口udp 6666通过,你总不能把这个wireguard监听的端口也转发对吧。。。

iptables -t nat -I PREROUTING -p udp --dport 6666 -j ACCEPT

这个6666是和你前面设置的listenport一样的。

然后不转发22!!!要不然你上不去服务器ssh,协议是tcp

iptables -t nat -I PREROUTING -p tcp --dport 22 -j RETURN

可选操作:不转发80

这是因为我绑定到路由器。如果80也转发,那么可以在浏览器中直接http://<ip>访问软路由后台,对于很多人来说可能有点危险,但是不转发80后,如果想公网访问路由器,其实直接在路由上配置端口转发一个端口到127.0.0.1:80就可以解决了

iptables -t nat -I PREROUTING -p tcp --dport 80 -j RETURN

自定义不转发端口:

如果你还想发挥别的用途,比如安装一个宝塔,1panel,亦或者像我这种安装了一个x-ui,挂社交平台有个上海ip()

那么这时候你除了 6666 22 80 其他端口都被转发,那我们直接再像上面一样不转发一个端口就好了。

iptables -t nat -I PREROUTING -p tcp --dport <port> -j RETURN

<port>换成你不需要转发的端口即可。

这是tcp协议,如果不转发udp协议,那么把上面的tcp改成udp即可

即:

iptables -t nat -I PREROUTING -p udp --dport <port> -j RETURN

转发其他端口:

现在我们要来看一下服务器网卡绑定的ip

一定要注意下!!现在有有很多大厂的服务器,使用ip a命令查询到的网卡绑定IP与实际公网IP不同,是一个内网ip这里一定要使用 网卡实际绑定的ip 而不是公网IP

比如我这台阿里云上海机, 网卡绑定的ip是172.24.38.245.

而不是实际公网访问的8.xxx.200.xxx

也有些机器网卡绑定的就是公网ip 比如这个日本VPS

但无论如何,一定要填网卡绑定的ip

现在我们需要执行两条命令;

iptables -t nat -A PREROUTING -d <网卡绑定IP> -j DNAT --to-destination 10.1.0.2
iptables -t nat -A POSTROUTING -j MASQUERADE

把<网卡绑定ip>修改一下。

现在需要设置下,这些规则重启后依然有效

apt install iptables-persistent
netfilter-persistent save

都点yes

这时候ping一下服务器ip 你就会发现,延迟直接翻倍,那就说明端口都转发了。

当你在以后如果还需要设置不转发某个端口的话,还可以按照前文设置不转发某个端口一样操作,不过操作后别忘了设置保存后为了重启后依然有效需要执行netfilter-persistent save。

现在如果你前面没有设置不转发80端口,你就已经可以在浏览器中输入ip来访问路由器了,这时候你已经完成几乎所有操作了。

路由器端口转发

关于这部分内容大家肯定都会用到,不过也很简单,都来看这篇文章了不至于这个不会弄,但为了文章完整性还是写完吧

一般路由器都在【防火墙】【端口转发】这里配置,从外网某个端口访问时,转发到内网ip某个端口

看图

当然比如我在这里配置了一个外网12200转发到内网192.168.100.2的5666

那么直接浏览器中输入公网ip:12200就能打开我的飞牛(内网5666端口的服务)

至此安装配置步骤已经结束,操作下来相当于给你的宽带绑了一条静态公网ip哈哈

总结

我也是看了开头那个商家宣传的“家宽ip购买"才开始了解vpn,而发现了wireguard配合iptables端口转发可以实现近乎绑定公网ip的效果。注意wireguard还有其他用途比如作为出站,这样就可以用国外机翻墙,但是完全没这个必要了,会被检测到而且配置麻烦,远不如xui方便快捷。

对于wireguard配置起来肯定比frp和NPS要麻烦,但是效果上我认为是很不错的,毕竟frp,nps只能映射部分端口,(其实我还试过frp映射全部端口结果服务器直接宕机了)。而速度和延迟上却无明显差别。当然如果你没有国内机只有国外机那没法玩wireguard只能玩frp.

再次提醒建议不转发80端口,以防别人爆破你的路由。鬼知道别人要干什么。

说到这里我又想聊聊开头那个商家啊,进过不少云服务器群的朋友应该都看到过群友分享的诸如聊天记录等来说这家售后垃圾,容易跑路不稳定等问题的,那确实这个商家还有个问题就是喜欢玩文字游戏,例如wireguard+iptables流量转发他硬是给你说成是家宽ip购买还标注一个45块钱一个月,。超开几乎是所有云服务商都存在的一个现象,这里不再吐槽了。

如果这篇文章对你有帮助,可以转发给身边同样喜欢折腾云服务器的朋友。