ccruiの博客

ccruiの博客

通过VPN将云服务器IP绑定到本地服务器或OpenWrt

167
2024-06-14

通过VPN将云服务器IP绑定到本地服务器或OpenWrt

之前看到有 https://aqinco.com/ 这家云服务器有售卖家庭宽带IP购买的服务,宣称是可以给家庭宽带增加一条静态IP,出于好奇,我购买了一个月进行尝试。
666c45f05f4a9
在客服使用SSH连接将IP链接到我本地的Linux服务器后,我通过查询系统进程和网络接口的方式发现,其实所谓增加静态IP不过是使用WireGuard将公网IP绑定到设备上,于是我产生了一个大胆奇妙的想法,能不能将自己手边吃灰的云服务器IP绑定到本地,甚至绑定到OpenWrt上,经过一番摸索和与GPT的深入交流,成功将云服务器IP绑定到了本地服务器,这种绑定和frp有所不同,所有访问到云服务器IP的请求,都将转发到本地服务器,甚至包括Ping请求。

666c47b4ad185.png
正如上图所示,我使用的是腾讯云北京的服务器,正常在北京节点对其ip进行ping命令,得到的延迟应该在5ms以内,但是现在ping的延迟增加了从腾讯云北京到我家里的时间。并且现在通过这台服务器的IP可以直接访问到我家里的设备。

下面是详细的部署流程。

公网服务器部署WireGuard

安装WireGuard

sudo apt update
sudo apt install wireguard

生成秘钥对

# 生成公网服务器的密钥对
wg genkey | tee server_privatekey | wg pubkey > server_publickey

# 生成无公网服务器的密钥对
wg genkey | tee client_privatekey | wg pubkey > client_publickey

密钥对文件保存在当前命令行路径下的 server_privatekey server_publickey 文件和 client_privatekey client_publickey,其中server_privatekey server_publickey为公网服务器的私钥与公钥,client_privatekey client_publickey为无公网服务器的私钥与公钥,这两对秘钥需要在妥善保存后删除。

下文中将以以下代称称呼

代称秘钥文件名称
<公网服务器的私钥>server_privatekey
<公网服务器的公钥>server_publickey
<无公网服务器的私钥>client_privatekey
<无公网服务器的公钥>client_publickey

配置WireGuard

创建并编辑配置文件 /etc/wireguard/wg0.conf

sudo vi /etc/wireguard/wg0.conf

添加以下内容

[Interface]
Address = 10.1.0.1/24
PrivateKey = <公网服务器的私钥>
ListenPort = 51820

[Peer]
PublicKey = <无公网服务器的公钥>
AllowedIPs = 10.1.0.2/32

<公网服务器的私钥> 替换为你生成的 privatekey,将 <无公网服务器的公钥> 替换为无公网服务器生成的 publickey

启动WireGuard

sudo wg-quick up wg0

无公网服务器部署 WireGuard

这里先以普通Ubuntu服务器为例,如果想在OpenWrt上部署,本节主要查看配置WireGuard小节即可。

配置WireGuard

创建并编辑配置文件 /etc/wireguard/wg0.conf

sudo vi /etc/wireguard/wg0.conf

添加以下内容

[Interface]
Address = 10.1.0.2/24
PrivateKey = <无公网服务器的私钥>

[Peer]
PublicKey = <公网服务器的公钥>
Endpoint = <公网服务器的IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

或者填写

[Interface]
Address = 10.1.0.2/24
PrivateKey = <无公网服务器的私钥>

[Peer]
PublicKey = <公网服务器的公钥>
Endpoint = <公网服务器的IP>:51820
AllowedIPs = 10.1.0.1/32
PersistentKeepalive = 25

启动 WireGuard

sudo wg-quick up wg0

配置端口转发

本节内所有操作均在公网服务器上执行,并建议彻底关闭云服务器上的网络防火墙。

配置IP转发

在公网服务器上启用 IP 转发

sudo sysctl -w net.ipv4.ip_forward=1

如果需要永久生效,需编辑 /etc/sysctl.conf并取消 net.ipv4.ip_forward=1 的注释或添加 net.ipv4.ip_forward=1

配置防火墙规则

在公网服务器上使用 iptables 将流量转发到无公网服务器

sudo iptables -t nat -I PREROUTING -p udp --dport 51820 -j ACCEPT
sudo iptables -t nat -A PREROUTING -d <公网服务器的IP> -j DNAT --to-destination 10.1.0.2
sudo iptables -t nat -A POSTROUTING -j MASQUERADE

注意!!! 这里<云服务器的IP>有很多大厂的服务器,使用ip addr命令查询到的网卡绑定IP与实际公网IP不同,这里一定要使用 网卡实际绑定的ip 而不是公网IP

为了确保规则在重启后仍然有效,保存规则

sudo apt install iptables-persistent
sudo netfilter-persistent save

验证配置

  1. 确认 WireGuard 隧道连接已建立

    sudo wg show
    
  2. 通过公网 IP 测试连接,确保请求能够转发到无公网服务器。

注意
确保公网服务器和无公网服务器的防火墙配置正确,允许必要的端口和协议通过。

OpenWrt部署WireGuard

  1. 首先确保OpenWrt上安装以下插件

    666c4f9395617.png

  2. 插件安装完成后,必须重启路由器,否则无法再接口处查看到WireGuard接口。

  3. 网络-> 接口-> 添加新接口 输入名称wg0和选择WireGuard VPN协议
    666c50037775f.png

  4. 编辑接口-> 导入配置,粘贴无公网服务器部署 WireGuard一节中配置WireGuard中的配置文件即可。
    666c505382c8b.png

  5. 将新建接口加入到 wan 防火墙区域

  6. 完成后即可把服务器IP当做OpenWrt的一个wan口接入使用,相当于给你的宽带绑定了一条公网IP

如果遇到绑定OpenWrt后无效的情况,将AllowedIPs从0.0.0.0/0修改为公网服务器ip即可,例如:
10.1.0.1/32