系统网络
CURL
curl 是一个非常实用的、用来与服务器之间传输数据的工具,
用法:curl [options] [URL...]
curl -H "Content-Type: application/json" -X POST -d '[]' http://127.0.0.1:8090/hzkg_platform/api/voucher/push/-H添加一个 HTTP 请求头(Content-Type: application/json)-X指定请求类型,不指定默认 GET (POST / GET …)-d代表传输什么数据
网络链路测试
MTR 是一款网络诊断工具,点击链接查看使用 ping 命令丢包或不通时的链路测试方法
安装 mtr
sudo yum install mtr使用 MTR
# mtr 命令格式如下:
mtr [-hvrctglspni46] [-help] [-version] [-report] [-report-cycles=COUNT] [-curses] [-gtk] [-raw] [-split] [-no-dns] [-address interface] [-psize=bytes/-s bytes] [-interval=SECONDS] HOSTNAME [PACKETSIZE]网络测速
speedtest-cli
使用 speedtest-cli 测速
# 方式一:全局安装
# 使用 yum 从 EPEL 仓库安装 speedtest-cli。
yum install speedtest-cli
# 安装完成后,运行 speedtest-cli 命令测试网络速度(耐心等待,一般需要两三分钟)
speedtest-cli
# 方式二:非全局安装(使用 git 拉取源码)
# 安装 git(如已安装忽略该命令)
yum install git
# 克隆 speedtest-cli 仓库到本地
git clone https://github.com/sivel/speedtest-cli.git
# 进入 speedtest-cli 目录
cd speedtest-cli
# 运行 speedtest-cli 脚本进行测试(耐心等待,一般需要两三分钟)
./speedtest.pyiperf3
测试服务端与客户端带宽 iperf3下载地址
参数说明,注意参数区分大小写
iperf3 的主要测量指标
- 带宽 (Bandwidth):
- 最核心的指标,指网络路径上数据传输的速率。
- 单位:iperf3 默认报告bps
- bps (bits per second)
- Kbps (Kilobits per second)
- Mbps (Megabits per second)
- Gbps (Gigabits per second)
- 类型:
- 单向带宽 (Sender to Receiver): 客户端到服务器或服务器到客户端的传输速率(取决于测试模式)。
- 双向带宽 (Bi-directional): 同时测量两个方向的总带宽(使用 -d 或 -w 参数)。
- 报告形式: 发送端带宽 (客户端输出) 和 接收端带宽 (服务器输出)。对于理想 TCP 测试,两者应非常接近。UDP 测试中接收端带宽更关键(反映实际送达的速率)。
- 抖动(Jitter):
- 指连续数据包到达时间间隔的变化程度。对于实时应用(如 VoIP, 视频会议)至关重要。
- 计算方式: iperf3 计算包到达时间间隔与理论间隔的差值。
- 单位: 毫秒 (ms)。值越低越好。
- 丢包率 (Packet Loss):
- 在传输过程中丢失的数据包占总发送包数的百分比。主要出现在 UDP 测试或拥塞严重的 TCP 测试中。TCP 本身会重传丢失包,但重传会显著降低有效带宽。
- 报告形式:对于 UDP 测试,在客户端和服务器报告中有
% Lost的显示。对于 TCP,iperf3 的默认报告不直接显示丢包率,但可以通过重传次数(Retr)间接推断拥塞情况(-i报告间隔显示更直观)。
- 往返时间 (RTT):
- 数据包从发送方发出到收到接收方确认的总时间。
- 在 iperf3 报告中的体现:
- TCP 测试: iperf3 会报告一个加权平均值
RTT(在客户端报告的连接细节部分)。 - UDP 测试: 不会直接报告 RTT。
- TCP 测试: iperf3 会报告一个加权平均值
- 单位: 毫秒 (ms)。
- 缓冲区大小/窗口大小 (Buffer/Window Size):
- 影响 TCP 吞吐量的关键参数。
iperf3客户端会报告测试中使用的Receiver Window Size(由操作系统和可能的手动设置-w决定)。优化窗口大小对于长距离高带宽链路非常重要。
- 影响 TCP 吞吐量的关键参数。
服务端与客户端通用参数
| 参数 | 功能说明 | 示例 |
|---|---|---|
-p | 指定端口号 | -p 5201 |
-f | 设置报告单位(k/K/m/M) | -f K(KBytes) |
-i | 报告间隔时间(秒) | -i 1 |
-t | 测试时长(秒) | -t 10 |
-u | 使用UDP协议 | -u -b 100M |
-b | [K M G]:测试指定目标带宽(UDP必填) | -b 100M、-b 1G |
-P | 多线程,使用并行流 (多个 TCP 连接)。 | -P 4 |
-w | [K M]: 设置 TCP 窗口大小/套接字缓冲区大小 | -w 256K, -w 2M |
-B | 绑定指定网卡 | -B eth0 |
-J | JSON格式输出 | -J > result.json |
服务端专用参数
| 参数 | 功能说明 |
|---|---|
-s | 启动服务端模式 |
-D | 后台守护进程运行 |
-1 | 仅接受1次测试后退出 |
-I | 指定PID文件路径 |
客户端专用参数
| 参数 | 功能说明 | 示例 |
|---|---|---|
-c | 以客户端模式运行,指定服务器IP | -c 192.168.1.1 |
-R | 反转模式。 默认客户端发送数据到服务器。 | 客户端变成接收者,服务器变成发送者。 用于测试反向带宽。 |
-n | 指定传输数据量 | -n 1G |
-l | 设置缓冲区大小 | -l 64K |
-C | 兼容旧版本协议 |
常用测试命令
# 服务端
iperf3 -s -p 5201
# 客户端
iperf3 -c 192.168.1.1 -t 10 -i 1 # 基础TCP带宽测试
iperf3 -u -c 192.168.1.1 -b 200M -t 20 -l 128K # UDP丢包测试
iperf3 -c 192.168.1.1 -P 8 -t 30 -w 1M # 多线程吞吐测试
iperf3 -c 192.168.1.1 -R -t 10 # 反向测试(服务端发送)# TCP 示例
# 客户端发送
[root@iZbp19gu5sf48pg1v9ehcrZ ~]# iperf3 -c 192.168.196.176 -i 1 -t 5 -p 8080 -f M
Connecting to host 192.168.196.176, port 8080
[ 4] local 192.168.196.122 port 34068 connected to 192.168.196.176 port 8080
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 1.90 MBytes 1.90 MBytes/sec 2 118 KBytes
[ 4] 1.00-2.00 sec 2.29 MBytes 2.29 MBytes/sec 0 142 KBytes
[ 4] 2.00-3.00 sec 2.72 MBytes 2.72 MBytes/sec 0 166 KBytes
[ 4] 3.00-4.00 sec 2.26 MBytes 2.26 MBytes/sec 4 107 KBytes
[ 4] 4.00-5.00 sec 2.53 MBytes 2.53 MBytes/sec 0 137 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-5.00 sec 11.7 MBytes 2.34 MBytes/sec 6 sender
[ 4] 0.00-5.00 sec 11.2 MBytes 2.25 MBytes/sec receiver
iperf Done.
# 服务端发送(反向)
[root@iZbp19gu5sf48pg1v9ehcrZ ~]# iperf3 -c 192.168.196.176 -i 1 -t 5 -p 8080 -f M -R
Connecting to host 192.168.196.176, port 8080
Reverse mode, remote host 192.168.196.176 is sending
[ 4] local 192.168.196.122 port 34094 connected to 192.168.196.176 port 8080
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.00 sec 2.03 MBytes 2.03 MBytes/sec
[ 4] 1.00-2.00 sec 2.79 MBytes 2.79 MBytes/sec
[ 4] 2.00-3.00 sec 3.57 MBytes 3.57 MBytes/sec
[ 4] 3.00-4.00 sec 3.24 MBytes 3.24 MBytes/sec
[ 4] 4.00-5.00 sec 3.06 MBytes 3.06 MBytes/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-5.00 sec 14.9 MBytes 2.97 MBytes/sec sender
[ 4] 0.00-5.00 sec 14.9 MBytes 2.97 MBytes/sec receiver
iperf Done.
# 输出解释
ID: 线程标识符,多线程测试时区分不同数据流
Interval: 测试时间范围(1.00-2.00 sec代表1到2秒之间)
Transfer: 时间范围内传输的数据总量(单位GBytes或MBytes) 2.62 MBytes = 2.62 MB (1 MB = 1,048,576 字节)
Bandwidth: 核心性能指标,时间范围的平均带宽(Mbits/sec) 21.9 Mbits/sec ÷ 8 ≈ 2.74 MB/s)
Retr: 关键指标,重传数据包数量;0代表TCP该时段没有重传,网络良好;非零代表可能存在网络阻塞或丢包
Cwnd: TCP拥塞窗口大小;动态调整以优化吞吐量;窗口越大,允许未确认的数据包越多,带宽利用率通常越高(单位通常是 KBytes)
- - - - - - - - - - - - - - - - - - - - - - - - -
sender: 发送者
receiver: 接收者TCP测试总结
- 发送者
Transfer: 发送端在整个测试期间发送的总数据量。Bitrate: 发送端的平均发送速率。Retr: 整个测试期间的总重传次数。这是判断测试过程中是否存在丢包(导致重传)的关键指标。
- 接受者
Transfer: 接收端确认收到的总数据量 (应与发送端的Transfer非常接近)。Bitrate: 接收端的平均接收速率。这是测得的有效网络吞吐量 (Available Bandwidth)。它可能略低于发送端速率(协议开销、接收端处理能力)。
# UDP 示例
# 客户端发送
[root@iZbp19gu5sf48pg1v9ehcrZ ~]# iperf3 -c 192.168.196.176 -i 1 -t 5 -p 8080 -f M -u -b 1M
Connecting to host 192.168.196.176, port 8080
[ 4] local 192.168.196.122 port 37181 connected to 192.168.196.176 port 8080
[ ID] Interval Transfer Bandwidth Total Datagrams
[ 4] 0.00-1.00 sec 110 KBytes 0.11 MBytes/sec 41
[ 4] 1.00-2.00 sec 123 KBytes 0.12 MBytes/sec 46
[ 4] 2.00-3.00 sec 121 KBytes 0.12 MBytes/sec 45
[ 4] 3.00-4.00 sec 123 KBytes 0.12 MBytes/sec 46
[ 4] 4.00-5.00 sec 121 KBytes 0.12 MBytes/sec 45
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.00-5.00 sec 598 KBytes 0.12 MBytes/sec 1.259 ms 1/223 (0.45%)
[ 4] Sent 223 datagrams
iperf Done.
# 服务端发送(反向)
[root@iZbp19gu5sf48pg1v9ehcrZ ~]# iperf3 -c 192.168.196.176 -i 1 -t 5 -p 8080 -f M -u -b 1M -R
Connecting to host 192.168.196.176, port 8080
Reverse mode, remote host 192.168.196.176 is sending
[ 4] local 192.168.196.122 port 59237 connected to 192.168.196.176 port 8080
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.00-1.00 sec 123 KBytes 0.12 MBytes/sec 6026573535.603 ms 0/46 (0%)
[ 4] 1.00-2.00 sec 123 KBytes 0.12 MBytes/sec 309563099.045 ms 0/46 (0%)
[ 4] 2.00-3.00 sec 121 KBytes 0.12 MBytes/sec 16961209.135 ms 0/45 (0%)
[ 4] 3.00-4.00 sec 123 KBytes 0.12 MBytes/sec 871241.936 ms 0/46 (0%)
[ 4] 4.00-5.00 sec 121 KBytes 0.12 MBytes/sec 47740.318 ms 0/45 (0%)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.00-5.00 sec 615 KBytes 0.12 MBytes/sec 44756.851 ms 0/229 (0%)
[ 4] Sent 229 datagrams
iperf Done.
# 输出解释
ID: 线程标识符,多线程测试时区分不同数据流
Interval: 测试时间范围(1.00-2.00 sec代表1到2秒之间)
Transfer: 时间范围内传输的数据总量(单位GBytes或MBytes) 2.62 MBytes = 2.62 MB (1 MB = 1,048,576 字节)
Bandwidth:核心性能指标,时间范围的平均带宽(Mbits/sec) 21.9 Mbits/sec ÷ 8 ≈ 2.74 MB/s)
Jitter: 整个测试期间的平均抖动 (ms)。
Total Datagrams:该间隔内发送的数据包数量。
Lost/Total Datagrams: 总丢失的数据包数量 / 总预期收到的数据包数量 (来自 -b 参数的速率和间隔)。以及丢包百分比 (% Lost)。这是 UDP 测试的核心可靠性指标。UDP测试总结
- 发送端
- 报告发送的总数据量、发送端的平均发送速率 (
Bitrate)、总发送的数据包数量 (Datagrams)。没有抖动和丢包统计 (发送端不知道接收情况)。
- 报告发送的总数据量、发送端的平均发送速率 (
- 接收端(关键)
Transfer: 接收端实际收到的总数据量。Bitrate: 接收端的平均有效接收速率 (实际可用带宽)。Jitter: 整个测试期间的平均抖动 (ms)。Lost/Total Datagrams: 总丢失的数据包数量 / 总预期收到的数据包数量 (来自-b参数的速率和间隔)。以及丢包百分比 (% Lost)。这是 UDP 测试的核心可靠性指标。
常见问题&技巧
- 连接失败 (
Connection refused):- 服务器未运行:检查服务器端
iperf3 -s是否已启动。 - 端口错误:检查
-p参数是否在两端指定且一致。 - 防火墙阻止:最常见原因! 检查服务器端和沿途设备的防火墙规则,确保允许流量通过
iperf3使用的端口 (TCP 5201 或自定义的,UDP 测试也需对应规则)。 - 服务器地址错误。
- 服务器未运行:检查服务器端
- 带宽低于预期 (TCP):
- 重传 (Retr > 0): 排查拥塞(使用 -t 延长测试时间观察)、物理链路问题(光纤/网线/SFP模块)、设备(交换机/防火墙/路由器)性能瓶颈(CPU、队列、ACL)、缓冲区过小(尝试增大 -w 如 -w 2M,尤其是在长距离高带宽链路)。
- 拥塞窗口限制:对于长距离(高延迟)链路,默认 TCP 窗口可能太小(参考 Cwnd 值)。使用 -w 增大窗口大小(需要同时调大操作系统 TCP 缓冲区 net.core.rmem_max/wmem_max)。
- 拥塞控制算法:尝试不同的算法 -C bbr (需内核支持)。
- CPU 瓶颈:检查客户端或服务器端 CPU 是否满载(使用 top, htop 等工具)。
- 路径中间设备限制:防火墙策略、QoS 限速、较低端交换机的背板带宽限制。
- 网卡协商速率:检查 ethtool <接口> 确认协商速率是期望值 (1Gbps/10Gbps)。
- 跨物理设备/交换机测试性能:不同端口速率、交换机交换能力、VLAN 配置都可能有影响。
- 并行流:尝试使用 -P 4 或 -P 8 启动多个并发流。
- 带宽低于预期 (UDP):
- 查看接收端报告的丢包率和带宽。
- 如果丢包率高 (
% Lost),说明网络无法承载-b指定的发送速率。降低-b值。 - 同样排查网络拥塞、设备性能、CPU 瓶颈。
- Windows 防火墙: Windows 防火墙默认阻止入站
iperf3。运行服务器端时需添加入站规则允许iperf3.exe或指定端口。 - 连接重置 (
Connection reset by peer): 服务器或中间设备(如防火墙)提前关闭了连接。尝试使用-t缩短测试时间,检查防火墙超时设置。 - 获取服务器报告: 客户端测试完成后,服务器会输出报告。若想让服务器将报告保存到文件,使用
--logfile <filename>参数启动服务器 (iperf3 -s --logfile ~/iperf.log)。 - 使用 JSON 输出: 使用
-J参数可以让客户端输出 JSON 格式报告,便于其他程序解析和可视化 (iperf3 -c <server> -J > result.json)。 - 可视化工具: iperf3 本身是命令行工具。第三方工具如
jperf(图形前端),gperftools(可配合图形化),Flent(更复杂的网络测试套件,集成 iperf3) 可以帮助可视化结果和运行自动化测试。 - 测试双向带宽: 使用
-d(双向同时) 或-R(先测一个方向,再自动反转测试另一个方向)。 - 避免对生产网络的冲击: iperf3 设计用于压测,会占满带宽。务必在维护窗口或非关键业务网络中进行测试。UDP 测试尤其要注意,无节制的发送可能导致网络拥塞。
科学上网
请下载到
~/.config/mihomo/目录,如果下载到其它目录,请务必移动到~/.config/mihomo/目录。
安装 Mihomo(Clash 内核)
# 创建目录并进入
mkdir -p ~/.config/mihomo/ && cd ~/.config/mihomo/
# 解压 mihomo-linux-amd64-v1.18.7.gz
gunzip mihomo-linux-amd64-v1.18.7.gz
# 重命名(非必需,看个人)
mv mihomo-linux-amd64 clash-linxu
# 授权可执行权限
chomd +x clash-linxu
# 下载 clash 配置文件(更新订阅更新节点), 也要放在~/.config/mihomo/目录
wget -U "Mozilla/6.0" -O ~/.config/mihomo/config.yaml "http://订阅地址"
# 启动 clash
./clash-linux
# 注意,ping 不支持代理,命令行测试外网网址请使用 curl 测试( curl -I http://www.google.com )
# clash 启动已占用的终端窗口无法再输入命令,请新开一个终端窗口执行下列命令。
# 下列命令只对当前终端窗口有效,如果希望永久性的设置代理,可以将以上命令添加到.bashrc 文件中。(root 目录的隐藏文件)
# 在 Linux 命令行中设置代理,可以通过设置环境变量 http_proxy 和 https_proxy 来实现
export http_proxy="http://127.0.0.1:7890" && export https_proxy="http://127.0.0.1:7890"
# 输入 echo $http_proxy 和 echo $ https_proxy 命令查看,以确保代理已经正确设置。
echo $http_proxy && echo $https_proxy
# 如果需要取消代理,可以使用以下命令:
unset http_proxy && unset https_proxy配置 WEB 面板
# 创建目录并把面板文件放到该目录
mkdir /etc/clash/ && cd /etc/clash/
# 解压文件,(下载 Yacd-meta-gh-pages,未编译版本不行)
unzip Yacd-meta-gh-pages.zip
# 改名(非必需)
mv Yacd-meta-gh-pages meta-ui
# ui 文件这样就行,修改 clash 配置文件,修改的是 Clash 的配置文件。
# 一般情况下是没有配置 external-ui 和 secret 这两个配置
# 进入 clash 配置文件目录;
cd ~/.config/mihomo/
#编辑 clash 的配置文件;
vim config.yaml
# 在配置文件中修改或增加以下内容;
external-controller: 127.0.0.1:9090 # 如果你不是从本机访问,需要从其它机器访问这个 UI , 则改为:0.0.0.0:9090
external-ui: /etc/clash/meta-ui # meta-ui 的路径;
secret: 'inkwell' # inkwell 是登录 web 管理界面的密码,请自行设置你自己的, 不要照抄教程中的密码;
# 重启 clash;关于 .bashrc 文件
# .bashrc,属于一种系统隐藏文件,常常可见于 macOS 或者主流的 Linux 发行版。
# 如果你运行一个基于 Unix 或者类 Unix 的操作系统,bash 很有可能是其默认终端,那么.bashrc 就是这个终端里面指令运行的配置脚本。
# 编辑.bashrc
vim ~/.bashrc
# 添加代理
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
# 使文件生效
source ~/.bashrcopenVpn
使用脚本一键安装openvpn 该脚本默认全局转发,多次运行可以添加/删除用户
常用命令
# 重启OpenVPN
systemctl restart openvpn-server@server.service
# 检查状态
systemctl status openvpn-server@server.service
# 查看日志
tail -f /var/log/openvpn/openvpn.log脚本一键安装
# 设置可执行权限
[root@VM-4-8-centos ~]# chmod u+x openvpn-install.sh
# 运行脚本
[root@VM-4-8-centos ~]# ./openvpn-install.sh
Welcome to the OpenVPN installer!
The git repository is available at: https://github.com/angristan/openvpn-install
I need to ask you a few questions before starting the setup.
You can leave the default options and just press enter if you are okay with them.
I need to know the IPv4 address of the network interface you want OpenVPN listening to.
Unless your server is behind NAT, it should be your public IPv4 address.
IP address: 43.155.1xx.xx # 填入服务器公网IP地址
Checking for IPv6 connectivity...
Your host appears to have IPv6 connectivity.
Do you want to enable IPv6 support (NAT)? [y/n]: n # 是否开启IPV6,开不开都行,先不开
What port do you want OpenVPN to listen to?
1) Default: 1194
2) Custom
3) Random [49152-65535]
Port choice [1-3]: 1 # 使用默认端口号
What protocol do you want OpenVPN to use?
UDP is faster. Unless it is not available, you shouldnt use TCP.
1) UDP
2) TCP
Protocol [1-2]: 1 # 使用UDP
What DNS resolvers do you want to use with the VPN?
1) Current system resolvers (from /etc/resolv.conf)
2) Self-hosted DNS Resolver (Unbound)
3) Cloudflare (Anycast: worldwide)
4) Quad9 (Anycast: worldwide)
5) Quad9 uncensored (Anycast: worldwide)
6) FDN (France)
7) DNS.WATCH (Germany)
8) OpenDNS (Anycast: worldwide)
9) Google (Anycast: worldwide)
10) Yandex Basic (Russia)
11) AdGuard DNS (Anycast: worldwide)
12) NextDNS (Anycast: worldwide)
13) Custom
DNS [1-12]: 1 # 选择DNS服务,改成1 或 8
Do you want to use compression? It is not recommended since the VORACLE attack makes use of it.
Enable compression? [y/n]: n # 不使用压缩
Do you want to customize encryption settings?
Unless you know what you re doing, you should stick with the default parameters provided by the script.
Note that whatever you choose, all the choices presented in the script are safe (unlike OpenVPNs defaults).
See https://github.com/angristan/openvpn-install#security-and-encryption to learn more.
Customize encryption settings? [y/n]: n # 自定义加密设置,默认否
Okay, that was all I needed. We are ready to setup your OpenVPN server now.
You will be able to generate a client at the end of the installation.
Press any key to continue... # 按任意键继续
# 开始安装,此处省略很多安装步骤。。。。。
Tell me a name for the client.
The name must consist of alphanumeric character. It may also include an underscore or a dash.
Client name: inkwell # 输入客户端用户脚本名称
Do you want to protect the configuration file with a password?
(e.g. encrypt the private key with a password)
1) Add a passwordless client
2) Use a password for the client
Select an option [1-2]: 1 # 不需要密码安装后无法使用问题排查
服务器是否开启转发
sh# 检查IP转发是否启用 cat /proc/sys/net/ipv4/ip_forward # 应该返回 1,如果是0则需要启用 # 临时启用 echo 1 > /proc/sys/net/ipv4/ip_forward # 永久启用 echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf sysctl -p检查NAT配置
sh# 查看当前的NAT规则,如果没有MASQUERADE规则,需要添加 iptables -t nat -L -n -v快速修复脚本(包含开启转发与NAT规则)
创建并授权执行
chmod +x fix_openvpn_forwarding.sh ./fix_openvpn_forwarding.shsh#!/bin/bash # fix_openvpn_forwarding.sh # 启用IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf # 获取公网网卡名称 PUBLIC_INTERFACE=$(ip route show default | awk '{print $5}' | head -1) echo "检测到公网网卡: $PUBLIC_INTERFACE" # 清除可能冲突的规则(可选) # iptables -t nat -F # iptables -F # 添加NAT规则 - 关键步骤! iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o $PUBLIC_INTERFACE -j MASQUERADE # 允许转发 iptables -A FORWARD -i tun0 -o $PUBLIC_INTERFACE -j ACCEPT iptables -A FORWARD -i $PUBLIC_INTERFACE -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT # 保存规则 if command -v iptables-save >/dev/null 2>&1; then iptables-save > /etc/iptables/rules.v4 echo "iptables规则已保存" fi echo "配置完成!" echo "公网网卡: $PUBLIC_INTERFACE" echo "VPN网段: 10.8.0.0/24"验证配置
sh# 检查NAT规则 iptables -t nat -L -n # 应该看到类似这样的输出: # Chain POSTROUTING (policy ACCEPT) # target prot opt source destination # MASQUERADE all -- 10.8.0.0/24 0.0.0.0/0 # 还不行就重启下openvpn快速验证命令
sh# 1. 检查IP转发 sysctl net.ipv4.ip_forward # 2. 检查NAT规则 iptables -t nat -L POSTROUTING -n -v # 3. 检查转发规则 iptables -L FORWARD -n -v # 4. 测试从服务器B到服务器A的连通性 ping 123.123.14.120 telnet 123.123.14.120 3306 # 5. 检查OpenVPN状态 systemctl status openvpn-server@server.service调整换IP脚本,手动复制命令或新建sh文件
sh#!/bin/bash echo "正在修改 OpenVPN IP 段从 10.8.0.0/24 到 20.8.0.0/24..." # 1. 删除旧规则 echo "删除旧 NAT 规则..." iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE 2>/dev/null # 2. 添加新规则 echo "添加新 NAT 规则..." iptables -t nat -A POSTROUTING -s 20.8.0.0/24 -o eth0 -j MASQUERADE # 3. 修改 OpenVPN 配置 echo "修改 OpenVPN 配置..." sed -i 's/^server 10\.8\.0\.0 255\.255\.255\.0/server 20.8.0.0 255.255.255.0/g' /etc/openvpn/server.conf # 4. 重启 OpenVPN echo "重启 OpenVPN 服务..." systemctl restart openvpn@server # 5. 保存规则 echo "保存 iptables 规则..." if [ -f /etc/sysconfig/iptables ]; then iptables-save > /etc/sysconfig/iptables elif [ -d /etc/iptables ]; then iptables-save > /etc/iptables/rules.v4 fi echo "修改完成!" echo "新的 VPN IP 段: 20.8.0.0/24"关于内网穿透特殊配置
1.客户端互访 (client-to-client): 如果你有两个客户端(比如公司电脑和家里电脑)都连上了这个 VPN,想要它们之间互相 Ping 通(例如 20.8.0.2 访问 20.8.0.3),你必须在服务端配置文件里加上一行,否则默认情况下,客户端只能访问服务器,客户端之间是隔离的。
2.访问服务器背后的局域网: 如果你想通过 VPN 访问服务器所在的真实内网(比如服务器是在公司局域网 192.168.1.x),你需要推送该网段的路由:
push "route 192.168.1.0 255.255.255.0"并在服务器开启 IP Forwarding 和 NAT 设置。如果仅仅是访问 20.8.0.x 网段,则不需要这一步。
代理配置
场景 服务端配置 客户端配置 结果 典型全局代理 push "redirect-gateway def1"(默认,接受所有推送) 所有流量都通过VPN服务器。 典型分流代理 push "route 10.0.0.0 255.0.0.0"(默认,接受所有推送) 只有访问 10.0.0.0/8的流量走VPN,
其他流量走本地。客户端自定义分流 push "redirect-gateway def1"route-nopullroute 192.168.1.0 ...忽略服务端的全局代理指令,
只按客户端自己的路由规则走(只访问特定网络)。客户端强制全局代理 (无特殊推送,或只推了路由) redirect-gateway def1所有流量都通过VPN服务器(客户端强制覆盖)。
配置文件示例,分流模式,
ini# 服务端 port 1194 proto udp dev tun user nobody group nobody persist-key persist-tun keepalive 10 120 topology subnet server 20.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt # 不推送DNS # push "dhcp-option DNS 8.8.8.8" # push "dhcp-option DNS 114.114.114.114" # 不强制推送全局代理配置 # push "redirect-gateway def1 bypass-dhcp" # 分流代理 push "route 20.8.0.0 255.255.255.0" # 客户端互联 client-to-client ... # 客户端 client proto udp explicit-exit-notify remote 118.11.137.51 1194 dev tun resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server verify-x509-name server_d2avdsVG0OkBFrXd name auth SHA256 auth-nocache cipher AES-128-GCM tls-client tls-version-min 1.2 tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256 # 取消掉强制屏蔽本地DNS接收服务器分派DNS # ignore-unknown-option block-outside-dns # setenv opt block-outside-dns # Prevent Windows 10 DNS leak verb 3 ...linux作为客户端连接其他openvpn
shRockyLinux/AlmaLinux/CentOS/RHEL/Fedora sudo yum install openvpn -y sudo mv /root/fdusp.ovpn /etc/openvpn/ sudo openvpn --config fudsp.ovpn --daemon 优麒麟/LinuxMint/Ubuntu/Debian 1)安装openvpn sudo apt-get install openvpn -y 2)修改配置文件权限 sudo chown root:root /etc/openvpn/fdusp.ovpn 3)启动openvpn (1)上海OpenVPN连接 sudo openvpn --daemon --cd /etc/openvpn/ --config fdusp.ovpn --log-append /var/log/fdusp.log 或: sudo openvpn --config /etc/openvpn/new_fdusp.ovpn --daemon 输入自己EIP用户名和密码 (2)苏州OpenVPN连接 sudo openvpn --daemon --cd /etc/openvpn/ --config suzhou.ovpn --log-append /var/log/suzhou.log 输入自己EIP用户名和密码 4)关闭openvpn (1)获取openvpn进程pid sudo ps -ef |grep openvpn (2)关闭openvpn进程 sudo kill -9 “openvpn pid” ArchLinux sudo pacman -S openvpn sudo mv /root/fdusp.ovpn /etc/openvpn/ sudo openvpn --config fdusp.ovpn --daemon
建立SSH隧道
ssh -L 3307:123.123.14.120:3306 username@223.223.14.220 -N
参数解释:
-L 3307:123.123.14.120:3306:设置端口转发。将你本地电脑的3307端口映射到目标服务器A(123.123.14.120)的MySQL端口(3306)。username@223.223.14.220:这是服务器B的SSH登录用户名和公网IP。-N:表示不执行远程命令,仅建立隧道。
执行后,系统会提示你输入服务器B的SSH密码。连接成功后,这个SSH隧道就在后台运行了。
🗄️ 连接MySQL数据库
SSH隧道建立后,你的电脑(192.168.3.1)上连接本机3307端口,SSH隧道就会将请求转发到服务器A的3306端口。
内网穿透
ZeroTier
安装 ZeroTier(方式一)
# 安装
curl -s https://install.zerotier.com | sudo bash
systemctl start zerotier-one #启动
systemctl enable zerotier-one #自启动
systemctl restart zerotier-one #重启
# 加入网络 83048xxx325dxxxx (rog)c1b778a8e4 (pve-centos)6276fce203
zerotier-cli join 83048xxx325dxxxx
# 访问官方授权即可
#其他命令
zerotier-cli status #查看服务状态
zerotier-cli leave <id> #离开网络
zerotier-cli listnetworks #查看网络(验证是否连接)
zerotier-cli listpeers #查看所有网络
源码安装 ZeroTier(方式二)
确保您的系统安装了必要的构建工具和库。对于大多数 Linux 发行版,这意味着安装
git,make,gcc或clang, 以及可能的build-essential包。
上传并解压 ZeroTierOne-1.14.0.tar.gz
tar -zxvf ZeroTierOne-1.14.0.tar.gz
cd ZeroTierOne-1.14.0构建 ZeroTier。
make安装 ZeroTier。
make install启动 ZeroTier 服务。可能会卡 V6,卡 V6 了就直接执行 zerotier-one & 然后 ctrl c 不启动 ipv6
zerotier-one加入 ZeroTier 网络(需要替换成实际的网络 ID)。
zerotier-cli join YOUR_NETWORK_ID
ZeroTier 配置 MOON 服务器,加速握手
# 进入 zerotier 文件夹并生成 moon.json
cd /var/lib/zerotier-one/
# 生成初始化配置文件
zerotier-idtool initmoon identity.public > moon.json
# 编辑 moon.json 文件,填入阿里云服务器自己的公网 ip 格式 ip/端口(默认 9993)
vim moon.json
# "stableEndpoints": [106.14.72.102/9993]
# 并在阿里云后台开启入方向 9993 端口,切记协议类型必须是自定义 udp
# 在/var/lib/zerotier-one 内执行生成命令, 生成一个密钥文件 000 开头
zerotier-idtool genmoon moon.json
# 在/var/lib/zerotier-one 目录下, 新建一个 moons.d 文件夹,并将生成的 000xxxxx.moon 配置文件放到该文件夹
mkdir moons.d
mv 000000bb69fb2c35.moon moons.d/
# 重启 zerotier,如果不行就杀进程手动重启,服务器端配置完成
systemctl restart zerotier-one
客户端配置
# windows: 管理员身份运行 powershell,执行 1
zerotier-cli.bat listpeers
zerotier-cli.bat orbit [服务器节点ID] [服务器节点ID] #windows
# Linux: dca6bbe1e0
zerotier-cli listpeers
zerotier-cli orbit [服务器节点ID] [服务器节点ID] #linux