【WireGuard/虚拟局域网/联机/低成本】使用WireGuard组建虚拟局域网联机的低成本可行方案

概述

本方案适用于本地服务器,公网服务器只做流量转发。配置完成后可将异地的朋友组在同一个局域网下,效果和面对面联机是一样的。
价格方面,截至到2024-3-25,腾讯云按量计费,选最便宜的cpu和20G硬盘,16Mbps公网带宽情况下,使用费用一小时0.07元,流量费用0.8元/GB。cpu费用可以在不玩时将服务器关进一步节约成本,需要注意,硬盘费用是需要24h收取的,即使在关机情况下,其费用包含0.07元/h中的0.02元/h,也就是一个月完全关机的固定的14元左右的费用。
该方案为了保证兼容性和简化配置难度,没有使用UDP nat穿透的P2P技术,因为虽然P2P高效延迟低、速率快,但其致命缺陷是只有部分例如完全锥形nat才能穿透,不能保证联机网络一定能实现P2P。于是本方案使用简单粗暴的办法,使用公网服务器对nat下节点进行流量转发的网络架构,可保证国内任何网络环境都能成功组网。
具体配置过程如下:

1.租用服务器

选择腾讯云或其他服务器厂商都可,以腾讯云为例选择 SA2.MEDIUM2规格(标准SA2 2核2G),价格为0.05元/h。由于公网服务器只做流量转发,对性能无要求,服务器越便宜越好。选择ubuntu镜像,选择20G系统盘(由于24h收费,选最小规格)。选择弹性公网ip,带宽根据联机人数调整最好不要低于8Mbps。设置好服务器密码后等待示例创建和开机即可。随后进入控制台,在安全组中添加一条开放Udp端口的规则,以9469端口为例,下面会使用该端口。

2.完成服务端配置

在windows系统下win + R运行cmd,打开命令行,输入ssh <默认用户名>@<服务器公网ip>命令,其中默认用户名按上述镜像为ubuntu,公网ip在腾讯云控制台查看,注意复制公网IP地址(而不是私网ip)。
随后选择信任服务器输入yes,输入上一步设置的服务器密码(默认输入隐藏不显示,输完直接回车即可)
联接上ssh后输入如下命令完成配置:

# 安装
sudo apt update
sudo sudo apt upgrade
sudo apt-get install wireguard openresolv -y
# 设置root密码
sudo passwd root
# 使用su 命令进入root用户模式,输入上述密码
su
# 设置ip转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 创建并进入WireGuard文件夹
mkdir -p /etc/wireguard && chmod 0777 /etc/wireguard
cd /etc/wireguard
umask 077
exit
# 生成服务器端密钥对
wg genkey | tee server_privatekey | wg pubkey > server_publickey
# 生成客户端密钥对,此处有几个人就生成几个
wg genkey | tee client1_privatekey | wg pubkey > client1_publickey
wg genkey | tee client2_privatekey | wg pubkey > client2_publickey
wg genkey | tee client3_privatekey | wg pubkey > client3_publickey
# ....按照序号递增即可

随后设置配置文件,示例如下,按照人数自行递增即可

sudo echo "
[Interface]
PrivateKey = $(cat server_privatekey) # 填写本机的privatekey 内容
Address = 192.168.1.1/24 #该地址即为服务器的局域网地址
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 9469 # 注意该端口是UDP端口,需要在安全组中开放该端口
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = $(cat client1_publickey) # 填写对端的publickey 内容
AllowedIPs = 192.168.1.2/32
[Peer]
PublicKey = $(cat client2_publickey) # 注意这里有几个客户端就写几个peer
AllowedIPs = 192.168.1.3/32 # 记得同时递增该局域网地址,该地址即为虚拟局域网联机时各端的地址。
[Peer]
PublicKey = $(cat client2_publickey) # 填写对端的publickey 内容
AllowedIPs = 192.168.1.4/32" > wg0.conf
# 使用screen 保持后台运行
sudo apt install screen
screen -S wirdGuard
# 下面几条是启动/关闭wireGuard命令
# 启动WireGuard
sudo wg-quick up wg0
# 停止WireGuard
sudo wg-quick down wg0
# 查看状态
sudo wg show wg0

启动wire后,服务器端即配置完毕。
设置开机自启wireGuard:

sudo chmod +x /etc/rc.d/rc.local
echo "sudo wg-quick up wg0" >> /etc/rc.d/rc.local

3.客户端配置

服务器端配置完毕,各终端设备安装对应操作系统的wireGuard客户端,可自行搜索下载安装
下面详解一下客户端的配置文件填写
以下是示例文件:

[Interface]
PrivateKey = client1_PrivateKey # 这里查看服务器生成的客户端私钥,可用sudo cat /etc/wireguard/client1_PrivateKey 查看
Address = 192.168.1.2/24 # 这里的地址要和client1_PrivateKey对于,详情可翻看服务器端配置文件的[peer]内容
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = server_publickey # 这里统一填写服务器端公钥
AllowedIPs = 0.0.0.0/0 # 表示本机所有流量都通过服务器转发,为节约开销,不要在联机服务器的时候下载大文件
Endpoint = 服务器公网ip:9469 # 服务器的公网ip和安全组设置的允许的UDP端口
PersistentKeepalive = 25

由于多人联机,另一个人的填写方式如下,注意不要使配置重复使用,应当一人一个配置文件,同时服务器端设置对应的[peer],

[Interface]
PrivateKey = client2_PrivateKey # 这里查看服务器生成的客户端私钥,可用sudo cat /etc/wireguard/client2_PrivateKey 查看
Address = 192.168.1.3/24 # 这里的地址要和client2_PrivateKey对应,详情可翻看服务器端配置文件的[peer]内容
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = server_publickey # 这里统一填写服务器端公钥
AllowedIPs = 0.0.0.0/0 # 表示本机所有流量都通过服务器转发,为节约开销,不要在联机服务器的时候下载大文件
Endpoint = 服务器公网ip:9469 # 服务器的公网ip和安全组设置的允许的UDP端口
PersistentKeepalive = 25

上述改动了PrivateKey和Address两项,继续添加人依次类推,每次只改动这两项即可。
所有配置完成,此时所有客户端同时连接服务器即可通过192.168.1.X 的地址组成局域网,不使用的时候可以将服务器关机不计费节约成本。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现Minecraft跨局域网联机功能,需要使用P2P技术。在C#中,可以使用Socket类实现P2P通信。 下面是一个简单的示例代码: ``` using System; using System.Net; using System.Net.Sockets; using System.Threading; class P2PClient { static void Main(string[] args) { // 创建Socket对象 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 获取IP地址和端口号 Console.Write("请输入服务器IP地址:"); string ip = Console.ReadLine(); Console.Write("请输入服务器端口号:"); int port = int.Parse(Console.ReadLine()); // 连接服务器 socket.Connect(new IPEndPoint(IPAddress.Parse(ip), port)); Console.WriteLine("已连接服务器"); // 发送数据 string message = "Hello, server!"; byte[] data = System.Text.Encoding.ASCII.GetBytes(message); socket.Send(data); // 接收数据 byte[] buffer = new byte[1024]; int length = socket.Receive(buffer); string response = System.Text.Encoding.ASCII.GetString(buffer, 0, length); Console.WriteLine("服务器回复:" + response); // 关闭连接 socket.Shutdown(SocketShutdown.Both); socket.Close(); } } ``` 在这个示例代码中,客户端通过Socket对象连接服务器,并发送一条消息。服务器接收到消息后,回复一条消息。 如果要实现Minecraft跨局域网联机功能,可以将这个示例代码作为基础,添加Minecraft游戏的数据传输和处理逻辑。具体实现方法需要根据Minecraft游戏的网络协议和数据格式进行设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值