CentOS系统网络配置基础技巧
在CentOS上进行Rust网络编程前,需先掌握系统级网络配置,确保网络环境稳定。以下是常用配置技巧:
CentOS的网络接口配置文件存储在/etc/sysconfig/network-scripts/目录下,文件名格式为ifcfg-<接口名>(如ifcfg-ens33)。编辑该文件可设置静态IP或动态DHCP:
BOOTPROTO设为static,并添加IPADDR(IP地址)、NETMASK(子网掩码)、GATEWAY(网关)、DNS1(首选DNS)等参数。示例如下:DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes # 开机自动启用接口
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
BOOTPROTO设为dhcp,ONBOOT=yes即可。systemctl restart network(CentOS 7及以上版本建议使用systemctl restart network.service)。ifcfg文件,重启网络服务。BOOTPROTO改为dhcp,ONBOOT=yes,重启网络服务。使用以下命令实时查看网络接口状态、路由表及连接信息:
ip link show:显示所有网络接口的MAC地址、状态(UP/DOWN)等信息。ip addr show:显示接口的IP地址、子网掩码等配置。ip route show:显示系统的路由表(目标网络、网关、接口)。netstat -ant:查看TCP连接的详细状态(如LISTEN、ESTABLISHED)。ss -tulnp:更高效的连接状态查看工具(推荐替代netstat)。CentOS默认使用firewalld,但iptables仍广泛用于底层防火墙管理。以下是常用规则:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT。iptables -A INPUT -p tcp --dport 80 -j ACCEPT。iptables -A INPUT -p tcp --dport 443 -j ACCEPT。iptables -A INPUT -j DROP。service iptables save(CentOS 7及以上需使用iptables-save > /etc/sysconfig/iptables)。ping 192.168.1.1)。traceroute google.com)。nslookup example.com)。Rust网络编程在CentOS上的实用技巧
完成系统网络配置后,可使用Rust进行网络编程。以下是关键技巧:
Rust的网络编程依赖异步运行时,tokio是最流行的选择(支持高性能异步I/O)。在Cargo.toml中添加依赖:
[dependencies]
tokio = { version = "1", features = ["full"] } # 启用全部功能(包括TCP/UDP/异步文件IO)
使用#[tokio::main]宏简化异步主函数编写,无需手动管理事件循环。
以下是一个基于tokio的异步TCP服务器,监听127.0.0.1:8080并回显客户端发送的消息:
use tokio::net::{TcpListener, TcpStream};
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 绑定本地地址和端口
let listener = TcpListener::bind("127.0.0.1:8080").await?;
println!("Server is running on 127.0.0.1:8080");
loop {
// 接受新连接(异步)
let (mut socket, addr) = listener.accept().await?;
println!("New connection from {:?}", addr);
// 为每个连接生成一个异步任务
tokio::spawn(async move {
let mut buffer = [0; 1024]; // 缓冲区(1KB)
loop {
// 读取数据(异步)
match socket.read(&mut buffer).await {
Ok(n) if n == 0 => return, // 客户端关闭连接
Ok(n) => {
// 将数据写回客户端(异步)
if let Err(e) = socket.write_all(&buffer[..n]).await {
eprintln!("Failed to write to socket: {:?}", e);
return;
}
}
Err(e) => {
eprintln!("Failed to read from socket: {:?}", e);
return;
}
}
}
});
}
}
运行程序:cargo run,使用telnet 127.0.0.1 8080或nc 127.0.0.1 8080测试(输入文本后按回车,服务器会回显)。
lsof -i :8080查看占用进程,用kill -9 <PID>终止进程。sudo cargo run或配置setcap(如sudo setcap 'cap_net_bind_service=+ep' target/debug/my_server)。iptables -L -n查看规则),或使用telnet <IP> <PORT>测试端口连通性。