WireGuard Mesh 组网示例

2024-04-17 01:52
文章标签 示例 组网 mesh wireguard

本文主要是介绍WireGuard Mesh 组网示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

WireGuard mesh 组网

为了能够遵循此 WireGuard Mesh VPN 配置教程,必须准备 4 台 Ubuntu 22.04 Linux 服务器,这些服务器具有静态公共 IP 地址并可从 Internet 访问 UDP/51820。我们将为 VPN 节点使用以下名称和 IP 地址:

NamePublic IPAllowed IPsLocal Network
Node1120.11.11.1010.0.1.1192.168.11.0/24
Node2120.11.12.1010.0.2.1192.168.12.0/24
Node3120.11.13.1010.0.3.1192.168.13.0/24
Node4120.11.14.1010.0.4.1192.168.14.0/24

图 WireGuard 网状 VPN 拓扑
在这里插入图片描述

测试环境:

VMware Workstation 新建四个仅主机类型网络 VMnet11~VMnet14,分别分配给4台服务器,作为第二块网卡用于wireguard public ip组网。
在这里插入图片描述
node1节点 vmware workstation 虚拟机示例配置如下:

  • 第一块网卡ens33为NAT模式
  • 第二块网卡ens37为仅主机模式(分配VMnet11~VMnet14)
  • 第三块网卡ens38为LAN区段模式,用于local network

在这里插入图片描述

node1节点网络配置示例:

root@node1:~# cat /etc/netplan/00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:ethernets:ens33:addresses:- 192.168.95.11/24nameservers:addresses:- 223.5.5.5- 223.6.6.6search: []routes:- to: defaultvia: 192.168.95.2metric: 100ens37:addresses:- 120.11.11.10/24routes:- to: defaultvia: 120.11.11.1metric: 200ens38:addresses:- 192.168.11.10/24version: 2

按照以下主要步骤配置 WireGuard Mesh VPN:

  1. 在 Ubuntu 服务器上安装 WireGuard
  2. 手动生成私钥和公钥
  3. VPN节点局域网IP转发
  4. 手动生成 WireGuard 配置文件
  5. 启动 WireGuard 服务器并在引导时启用它
  6. 验证 Mesh VPN 连接

警告:以 root 身份或通过 sudo 命令对 Linux 系统进行特权访问。

下面给出的所有命令都应使用 root 权限执行,可以直接作为 root 用户执行,也可以使用 sudo 命令执行。

1.在Ubuntu服务器上安装WireGuard

Ubuntu 22.04 Linux 服务器将配置为 WireGuard VPN 节点。按照以下步骤轻松在所有 Ubuntu VPN 节点上安装 WireGuard:

1、通过运行以下命令确保 Ubuntu 节点是最新的:

sudo apt update && sudo apt upgrade -y

2、通过运行以下命令来安装 WireGuard 本身及其所有依赖项:

sudo apt install -y wireguard wireguard-tools

安装 WireGuard 后,请按照以下步骤进一步配置服务器。

1. 手动生成私钥和公钥

WireGuard 的主要优点之一是它基于最先进的加密原语。它允许通过使用一对加密密钥加密连接来创建安全的 VPN 隧道。每个对等方都必须拥有自己的私钥和公钥,以确保双向通信的安全。要使用 WireGuard,每个节点必须生成自己的密钥对,然后交换公钥。

请注意,在 WireGuard VPN 上,私钥永远不会离开其节点。其重要性在于,私钥具有在 WireGuard 会话协商期间可能假定该节点身份的唯一能力。因此,只有该特定节点才有能力对源自其自身的数据包进行编码或对发往自身的数据包进行解码。记住这一点至关重要:WireGuard 节点连接遵循零信任网络访问 (ZTNA) 原则,从头到尾进行加密。

可以按照以下步骤为所有Mesh VPN 节点生成私钥和公钥对:

# node1
wg genkey | sudo tee /etc/wireguard/node1_private.key | wg pubkey | sudo tee /etc/wireguard/node1_public.key# node2
wg genkey | sudo tee /etc/wireguard/node2_private.key | wg pubkey | sudo tee /etc/wireguard/node2_public.key# node3
wg genkey | sudo tee /etc/wireguard/node3_private.key | wg pubkey | sudo tee /etc/wireguard/node3_public.key# node4
wg genkey | sudo tee /etc/wireguard/node4_private.key | wg pubkey | sudo tee /etc/wireguard/node4_public.key

这会将私钥和公钥保存到 /etc/wireguard 目录中。

警告:私钥不应与任何人共享,并应始终保持安全。

TIP:请记下以下步骤中将用于更新 WireGuard 配置文件的密钥对。

这里作为演示,在node1生成所有公钥和私钥并分发到所有其他节点。实际配置建议在各个节点单独生成公钥和私钥,然后将本地公钥分发到其他节点。

root@node1:~# ls /etc/wireguard/
node1_private.key  node1_public.key  node2_private.key  node2_public.key  node3_private.key  node3_public.key  node4_private.key  node4_public.keyroot@node1:~# scp /etc/wireguard/* 120.11.12.10:/etc/wireguard
root@node1:~# scp /etc/wireguard/* 120.11.13.10:/etc/wireguard
root@node1:~# scp /etc/wireguard/* 120.11.14.10:/etc/wireguard

2. VPN节点通过其他VPN节点访问局域网

您可能希望通过 WireGuard 为所有 VPN 节点授予对每个站点网络/LAN 的访问权限。为此,您可能需要配置防火墙规则,包括 IP 转发和 NAT。

为了使 VPN 服务器能够在 VPN 节点和 LAN 之间路由数据包,您必须在所有 WireGuard 节点上启用 IP 转发。您可以按照下面列出的说明在所有节点上启用 IP 转发:

执行以下命令:

cat <<EOF | sudo tee /etc/sysctl.d/wireguard.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.proxy_arp = 1
EOF
sudo sysctl --system

3.手动生成WireGuard配置文件

开始配置 WireGuard,方法是在每个节点上的 /etc/wireguard 文件夹中创建一个名为 wg0.conf 的新配置文件。

Node1 生成的 WireGuard VPN 配置文件如下所示:

cat >/etc/wireguard/wg0.conf<<EOF
[Interface]
# Name: NODE1
Address = 10.0.1.1/32
PrivateKey = $(cat /etc/wireguard/node1_private.key)
ListenPort = 51820
PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i %i -j ACCEPT; iptables -I FORWARD -o %i -j ACCEPT; iptables -I INPUT -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens37 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -D INPUT -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens37 -j MASQUERADE[Peer]
# Name: NODE2
PublicKey = $(cat /etc/wireguard/node2_public.key)
Endpoint = 120.11.12.10:51820
AllowedIPs = 10.0.2.1/32,192.168.12.0/24[Peer]
# Name: NODE3
PublicKey = $(cat /etc/wireguard/node3_public.key)
Endpoint = 120.11.13.10:51820
AllowedIPs = 10.0.3.1/32,192.168.13.0/24[Peer]
# Name: NODE4
PublicKey = $(cat /etc/wireguard/node4_public.key)
Endpoint = 120.11.14.10:51820
AllowedIPs = 10.0.4.1/32,192.168.14.0/24
EOF

WireGuard 配置文件中的设置说明如下:

  • PrivateKey :VPN节点的私钥,可以在之前生成的 /etc/wireguard/node#n_private.key 文件中找到。
  • Address :定义 WireGuard 节点的私有 IPv4 和 IPv6 地址。 VPN 网络中的每个对等点都应该有一个唯一的 IP 地址。
  • ListenPort :指定 WireGuard 将用于传入连接的端口。可自由选择高端口范围。如果不指定端口,则默认为 51820/UDP
  • PublicKey :对应VPN对等节点的公钥,可以在之前生成的 /etc/wireguard/node#n_public.key 文件中找到。
  • Endpoint :对应 VPN 对等节点的公共/WAN IP 地址和端口号。
  • AllowedIPs :相应 VPN 对等节点可访问或路由的网络和 IP 地址。您可以在列表中设置 IP 地址范围,以逗号分隔。
  • PersistentKeepalive :每 25 秒向对等方发送一个经过身份验证的空数据包,以保持连接处于活动状态。如果未启用 PersistentKeepalive,VPN 节点可能无法相互 ping 通。

Node2 生成的 WireGuard VPN 配置文件如下所示:

cat >/etc/wireguard/wg0.conf<<EOF
[Interface]
# Name: NODE2
Address = 10.0.2.1/32
PrivateKey = $(cat /etc/wireguard/node2_private.key)
ListenPort = 51820
PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i %i -j ACCEPT; iptables -I FORWARD -o %i -j ACCEPT; iptables -I INPUT -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens37 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -D INPUT -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens37 -j MASQUERADE[Peer]
# Name: NODE1
PublicKey = $(cat /etc/wireguard/node1_public.key)
Endpoint = 120.11.11.10:51820
AllowedIPs = 10.0.1.1/32,192.168.11.0/24[Peer]
# Name: NODE3
PublicKey = $(cat /etc/wireguard/node3_public.key)
Endpoint = 120.11.13.10:51820
AllowedIPs = 10.0.3.1/32,192.168.13.0/24[Peer]
# Name: NODE4
PublicKey = $(cat /etc/wireguard/node4_public.key)
Endpoint = 120.11.14.10:51820
AllowedIPs = 10.0.4.1/32,192.168.14.0/24
EOF

Node3 生成的 WireGuard VPN 配置文件如下所示:

cat >/etc/wireguard/wg0.conf<<EOF
[Interface]
# Name: NODE3
Address = 10.0.3.1/32
PrivateKey = $(cat /etc/wireguard/node3_private.key)
ListenPort = 51820
PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i %i -j ACCEPT; iptables -I FORWARD -o %i -j ACCEPT; iptables -I INPUT -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens37 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -D INPUT -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens37 -j MASQUERADE[Peer]
# Name: NODE1
PublicKey = $(cat /etc/wireguard/node1_public.key)
Endpoint = 120.11.11.10:51820
AllowedIPs = 10.0.1.1/32,192.168.11.0/24[Peer]
# Name: NODE2
PublicKey = $(cat /etc/wireguard/node2_public.key)
Endpoint = 120.11.12.10:51820
AllowedIPs = 10.0.2.1/32,192.168.12.0/24[Peer]
# Name: NODE4
PublicKey = $(cat /etc/wireguard/node4_public.key)
Endpoint = 120.11.14.10:51820
AllowedIPs = 10.0.4.1/32,192.168.14.0/24
EOF

Node4 生成的 WireGuard VPN 配置文件如下所示:

cat >/etc/wireguard/wg0.conf<<EOF
[Interface]
# Name: NODE4
Address = 10.0.4.1/32
PrivateKey = $(cat /etc/wireguard/node4_private.key)
ListenPort = 51820
PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i %i -j ACCEPT; iptables -I FORWARD -o %i -j ACCEPT; iptables -I INPUT -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens37 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -D INPUT -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens37 -j MASQUERADE[Peer]
# Name: NODE1
PublicKey = $(cat /etc/wireguard/node1_public.key)
Endpoint = 120.11.11.10:51820
AllowedIPs = 10.0.1.1/32,192.168.11.0/24[Peer]
# Name: NODE2
PublicKey = $(cat /etc/wireguard/node2_public.key)
Endpoint = 120.11.12.10:51820
AllowedIPs = 10.0.2.1/32,192.168.12.0/24[Peer]
# Name: NODE3
PublicKey = $(cat /etc/wireguard/node3_public.key)
Endpoint = 120.11.13.10:51820
AllowedIPs = 10.0.3.1/32,192.168.13.0/24
EOF

4. 启动 WireGuard Server 并在启动时启用它

现在我们已经完成了配置,准备启动服务器。 WireGuard 有一个名为 wg-quick 的方便包装器,可用于启动新接口,而无需了解配置详细信息。

在所有 VPN 节点上启动 WireGuard 服务。要启动 WireGuard 服务并启动 WireGuard 接口 ( wg0 ),请在服务器上运行以下命令:

sudo wg-quick up wg0

这将加载配置文件 /etc/wireguard/wg0.conf ,成功启动界面后您应该会看到如下所示的输出:

[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.1.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0

要停止 VPN 节点上的 WireGuard 服务,请运行以下命令:

sudo wg-quick down wg0

可以使用 systemd 服务通过运行以下命令来启动 WireGuard:

sudo systemctl start wg-quick@wg0.service

可以使用以下命令检查 WireGuard 状态和配置。其状态应为活动(已退出)。

sudo wg show wg0

应该看到类似于以下内容的输出:

root@node1:~# sudo wg show wg0
interface: wg0public key: 0Aam+o0sc/XpqHO4UevdNrjzSnQDoNMnylIWj1vG+gc=private key: (hidden)listening port: 51820peer: 40fM1eXGLdGlDbYRcnw9f45vFdYHILvJLBzNIzrUl3Y=endpoint: 120.11.14.10:51820allowed ips: 10.0.4.1/32, 192.168.14.0/24latest handshake: 1 hour, 25 minutes, 2 seconds agotransfer: 380 B received, 436 B sentpeer: UFIdkhIZdS+j6H1rJInf1WjNsTDFzH2mUZlRaylZZiE=endpoint: 120.11.13.10:51820allowed ips: 10.0.3.1/32, 192.168.13.0/24latest handshake: 1 hour, 25 minutes, 4 seconds agotransfer: 380 B received, 436 B sentpeer: AWqkGC7Pa2wdgflQjT5+AvAER9ojov5Nj7+NEJNwdAs=endpoint: 120.11.12.10:51820allowed ips: 10.0.2.1/32, 192.168.12.0/24latest handshake: 1 hour, 25 minutes, 18 seconds agotransfer: 980 B received, 860 B sent

要在系统启动时自动启用 WireGuard 接口,请运行以下命令:

sudo systemctl enable wg-quick@wg0

现在 WireGuard 服务器已启动并正在运行,它已准备好接受 VPN 节点连接。

5. 验证 Mesh VPN 连通性

可以在每个 VPN 节点上运行以下命令来验证 WireGuard 接口状态:

ip a show wg0

应该看到类似于以下 Node1 的输出:

root@node1:~# ip a show wg0
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000link/none inet 10.0.1.1/32 scope global wg0valid_lft forever preferred_lft forever

可以尝试通过运行 ping 命令从每个 VPN 节点访问所有其他节点。每个 VPN 对等体都会响应另一个对等体的 ping 命令,表明 VPN 连接处于活动状态。

对于我们的示例,在 Node1 上运行以下命令。然后应该访问所有 VPN 对等点:

访问对等点2

root@node1:~# ping 10.0.2.1 -c 4
PING 10.0.2.1 (10.0.2.1) 56(84) bytes of data.
64 bytes from 10.0.2.1: icmp_seq=1 ttl=64 time=2.12 ms
64 bytes from 10.0.2.1: icmp_seq=2 ttl=64 time=1.23 ms
64 bytes from 10.0.2.1: icmp_seq=3 ttl=64 time=1.50 ms
64 bytes from 10.0.2.1: icmp_seq=4 ttl=64 time=1.25 ms--- 10.0.2.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.234/1.526/2.116/0.356 ms

访问对等点3

root@node1:~# ping 10.0.3.1 -c 4
PING 10.0.3.1 (10.0.3.1) 56(84) bytes of data.
64 bytes from 10.0.3.1: icmp_seq=1 ttl=64 time=1.87 ms
64 bytes from 10.0.3.1: icmp_seq=2 ttl=64 time=2.44 ms
64 bytes from 10.0.3.1: icmp_seq=3 ttl=64 time=2.04 ms
64 bytes from 10.0.3.1: icmp_seq=4 ttl=64 time=0.963 ms--- 10.0.3.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 0.963/1.826/2.439/0.540 ms

访问对等点4

root@node1:~# ping 10.0.4.1 -c 4
PING 10.0.4.1 (10.0.4.1) 56(84) bytes of data.
64 bytes from 10.0.4.1: icmp_seq=1 ttl=64 time=2.21 ms
64 bytes from 10.0.4.1: icmp_seq=2 ttl=64 time=1.15 ms
64 bytes from 10.0.4.1: icmp_seq=3 ttl=64 time=3.68 ms
64 bytes from 10.0.4.1: icmp_seq=4 ttl=64 time=3.92 ms--- 10.0.4.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.145/2.738/3.921/1.130 ms

已使用 WireGuard 成功建立了网状网络,使您的节点能够安全、私密地相互交互。由于没有中央服务器,即使其中一个对等点发生故障,网络也将保持运行。

6. 验证 Mesh VPN 本地转发

从node1访问node2 local network

root@node1:~# ping 192.168.12.10 -c 4
PING 192.168.12.10 (192.168.12.10) 56(84) bytes of data.
64 bytes from 192.168.12.10: icmp_seq=1 ttl=64 time=1.03 ms
64 bytes from 192.168.12.10: icmp_seq=2 ttl=64 time=1.05 ms
64 bytes from 192.168.12.10: icmp_seq=3 ttl=64 time=3.63 ms
64 bytes from 192.168.12.10: icmp_seq=4 ttl=64 time=3.35 ms--- 192.168.12.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.034/2.266/3.630/1.228 ms

从node1访问node3 local network

root@node1:~# ping 192.168.13.10 -c 4
PING 192.168.13.10 (192.168.13.10) 56(84) bytes of data.
64 bytes from 192.168.13.10: icmp_seq=1 ttl=64 time=4.18 ms
64 bytes from 192.168.13.10: icmp_seq=2 ttl=64 time=1.11 ms
64 bytes from 192.168.13.10: icmp_seq=3 ttl=64 time=3.61 ms
64 bytes from 192.168.13.10: icmp_seq=4 ttl=64 time=1.41 ms--- 192.168.13.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.109/2.575/4.176/1.336 ms

从node1访问node4 local network

root@node1:~# ping 192.168.14.10 -c 4
PING 192.168.14.10 (192.168.14.10) 56(84) bytes of data.
64 bytes from 192.168.14.10: icmp_seq=1 ttl=64 time=1.93 ms
64 bytes from 192.168.14.10: icmp_seq=2 ttl=64 time=1.12 ms
64 bytes from 192.168.14.10: icmp_seq=3 ttl=64 time=1.18 ms
64 bytes from 192.168.14.10: icmp_seq=4 ttl=64 time=0.878 ms--- 192.168.14.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 0.878/1.276/1.931/0.394 ms

参考:https://www.zenarmor.com/docs/network-security-tutorials/how-to-configure-wireguard-mesh-vpn

这篇关于WireGuard Mesh 组网示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/910489

相关文章

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

C#中的 StreamReader/StreamWriter 使用示例详解

《C#中的StreamReader/StreamWriter使用示例详解》在C#开发中,StreamReader和StreamWriter是处理文本文件的核心类,属于System.IO命名空间,本... 目录前言一、什么是 StreamReader 和 StreamWriter?1. 定义2. 特点3. 用