云服务器+wireguard,为家宽附加固定公网ip
之前逛小黄鱼的时候,系统自动推荐了个“给家庭宽带附加固定公网ip”,一个月还要大几百,后面看了下描述,多半是利用各类隧道服务,把公网服务器和内网设备连接到一起,这个类似于内网穿透,但是比内网穿透更加底层。
常规的内网穿透是需要配置端口信息,例如frp这种,没有原生管理界面,每次改端口都需要手搓配置文件,而且无法穿透icmp(ping)这种协议,而通过隧道的形式就可以避免以上问题(至于什么是隧道,各位自行了解),配置好隧道后直接在路由器端口映射需要的端口就可以了。这里我就用云服务器+wierguard,把云服务器上的ip附加到内网设备上,实现访问云服务器就可以打开内网服务,用起来就和本地宽带有个公网ip没区别,还能把云服务器作为流量出口。
一、特别说明
本教程只是个人兴趣爱好,仅用来实现“内网穿透”功能,至于其他用途,本人一概不知,也不要来问,问也是不知道。
二、所需设备
1.一个带有公网ip的云服务器作为服务端,一般云服务器都是固定公网ip,当然,如果是非固定公网的服务器也可以,只要是带公网能被访问到就行。这里我就以华为云的云服务器作为例子(为什么是它,因为是我白嫖的,拿来做教程刚刚好),云服务器系统是Debian11,不用12是因为这个服务器它不支持.......
2.一个内网设备作为客户端,支持linux系统就行,这里我用的是openwrt,因为有个图形化的界面,不用手搓客户端配置信息,配置端口映射也方便,如果使用爱快等系统都一样,反正能用wierguard就行,或者就干脆发行版的linux系统。
三、服务端&客户端安装
先放行云服务器的安全组,一般云服务器厂商都是带有防火墙,即系统内部防火墙和控制台防火墙,需要先把控制台防火墙放行。先到云服务器控制台,把全部端口都放行,这里放行入站流量,出站流量默认都是放行的不用管。
然后登录服务器的ssh,依次输入以下命令:
sudo apt update
#更新软件源
sudo apt install wireguard
#安装wireguard
umask 0777 && wg genkey | tee server_private_key | wg pubkey > server_public_key && wg genpsk > server_preshared_key
#生成服务端公钥、私钥以及共享密钥文件,我在根目录下执行的就会保存在root目录里
这时候就已经安装好wireguard(以下简称wg,不想打那么多字)服务端。
然后登录内网设备,这里我用openwrt(immortalwrt)就可以一键安装wg,在软件里面搜索wireguard,把框里面的三个安装上都安装上。
安装完成后一定要重启,一定要重启,不然新建不了接口。重启openwrt后客户端也安装完成。
四、配置服务端&客户端
先进入内网openwrt,新建一个接口,协议选wg。
然后在详细设置哪里,点击生成新的密钥对miyaodui,就会生成客户端的私钥和公钥,监听端口就填写想要的wg端口,ip地址可以填写任意内网地址,注意要和等下服务端的地址地址对应上。注意这里ip地址是指wg内部的ip地址,子网掩码是/24。
然后先不保存,回到云服务器上,输入以下命令新建wg配置文件:
sudo touch /etc/wireguard/wg0.conf
然后通过winscp等等软件打开这个wg0.conf配置文件,做修改,(为什么不在终端里面直接编写,因为不方便)。参照以下配置文件自行修改:
[Interface]
PrivateKey = <服务端私钥>
#最初生成的server_private_key这个文件里面就是私钥
Address = 10.0.0.1/24
#服务端wg ip,需要和客户端在同一ip段
ListenPort = 6666
#wg端口,需要和客户端的一致
[Peer]
PublicKey = <客户端公钥>
#刚刚在客户端生成的公钥,复制到这
AllowedIPs = 10.0.0.2/32
#客户端wg ip,需要与客户端一致,这里子网掩码需要是/32而非/24
PresharedKey = <共享密钥>
#最初生成的server_preshared_key这个文件里面就是
保存上面的配置文件,然后运行以下命令启动wg,并让其开机自动启动:
sudo wg-quick up wg0
#启动wg
sudo systemctl enable wg-quick@wg0
#添加到开机自启
之后再回到客户端,继续配置客户端。先分配防火墙,这里我图省事,直接用了wan口的防火墙,也可以自己新建一个防火墙。
然后添加一个对端,这里公钥就填最初生成的公钥,就是生成的<server_public_key>文件;共享密钥就是和服务端那个共享密钥一样;允许的ip我这里也偷懒了,直接0.0.0.0/0,意思是全部ip,建议只允许内网ip以及wg的ip;端点主机就是云服务器的ip,端点端口就是wg的端口,其他的默认就行,然后保存。
此时就完成了服务端和客户端的配置。
五、配置服务端转发&防火墙
配置完wg后还不能直接使用,还需要配置服务端的系统。回到服务端ssh,输入以下命令并编辑文本开启ip转发:
sudo nano /etc/sysctl.conf
#编辑内核配置,如果不熟悉nano语法,自行百度
net.ipv4.ip_forward = 1
#把这个加到/etc/sysctl.conf文本最后一行
sudo sysctl -p
#重启内核
之后查询网卡名称:
ip a
例如我这里网卡名称是eth0,这里ip是内网ip很正常,国内云服务器厂商都是这样,网卡绑定的不是公网ip而是内网ip。
然后输入以下命令配置防火墙:
sudo iptables -A FORWARD -i wg0 -j ACCEPT
#允许wg0网卡流量通过,这里wg0不用修改,启用wg后就是这个网卡
sudo iptables -A INPUT -j ACCEPT
#允许所有的入站流量
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#经过eth0网卡的流量进行nat,注意把eth0替换成实际网卡型号
sudo iptables -t nat -A PREROUTING -i eth0 -p udp --dport 6666 -j RETURN
#不转发udp 6666端口,这里6666端口是即将配置的wg端口,自行修改
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j RETURN
#不转发tcp 22端口,22端口用作ssh,转发了就连不上ssh
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -j DNAT --to-destination 10.0.0.2
#转发全部tcp端口到10.0.0.2,这个ip就是wg客户端的ip,自行修改
sudo iptables -t nat -A PREROUTING -i eth0 -p udp -j DNAT --to-destination 10.0.0.2
#和上一条一样,只是这个是转发udp
注意系统需要启用iptables,一般系统都是带有此防火墙,如果不知道是否启用,自行百度系统名称+iptables搜索相关文章,需要注意的是,有些系统已经不使用iptables,这个建议换回iptables,无他,其他防火墙我没用过,不知道会发生啥。
iptables重启后规则会自动清除,还需要固定规则,输入以下命令安装iptables-persistent,在弹出的界面会提示是否保存现有规则,选择确定即可:
sudo apt install iptables-persistent
之后重启云服务器系统,等待客户端重连,或者手动重连下就可以。然后在客户端尝试ping下wg服务端的ip(10.0.0.1),如果可以ping通,说明wg链接现在是正常的。
六、配置端口映射
这个没啥好说的,和常规端口映射一样,就在openwrt-防火墙-端口转发里面添加配置就行,不懂的就看图。
然后访问云服务器公网ip+端口,例如我图上设置了映射884端口,直接访问云服务器公网ip:8848,就可以打开内网服务,就和平常家宽做端口映射一致。如果想要80/443端口也可以自行设置,如果打不开可能是openwrt防火墙配置问题,参考我的配置。
七、其他问题
1.这种隧道受限于云服务器带宽,不过常规内网穿透也一样会,只是这个用起来更简单点,只需要在对应系统/路由上配置端口映射就行。国内云服务器带宽小,用海外的也可以。
2.把域名解析到云服务器公网ip上就可以实现用域名访问,但是注意国内用域名访问80/443端口需要备案。
3.还可以把云服务器作为流量出口,大家都知道这是干啥的不?反正我不知道,啥都不知道。
4.需要注意,这里22和<6666>端口不能做端口映射,因为这两个端口一个是云服务器ssh,一个是wg端口,不会做转发,剩下的端口只要云服务器厂商不限制都可以用。