端口复用

DeeLMind2025年5月25日大约 1 分钟

端口复用

端口复用是指多个应用或服务共享一个网络端口的机制。常用于负载均衡、协议复用或安全研究(如旁路检测、防火墙绕过等)。

风险类型描述
安全攻击端口复用可能被用于 IDS/防火墙绕过、数据隐藏通道、端口欺骗等攻击场景。
调试困难多个进程或线程绑定相同端口,可能导致日志和连接追踪复杂,排查问题困难。
配置易误未正确设置 SO_REUSEPORTSO_REUSEADDR,可能导致绑定失败或冲突行为。
跨平台差异不同操作系统(如 Windows、Linux、macOS)对端口复用的支持和行为存在差异。
性能影响大量复用监听 socket 时,系统需做额外的调度判断,可能引入开销。

Socket


use socket2::{Domain, Protocol, Socket, Type};
use std::net::{SocketAddr, TcpListener};
use std::thread;

fn main() -> std::io::Result<()> {
    let addr: SocketAddr = "127.0.0.1:9000".parse().unwrap();

    for i in 0..2 {
        let addr = addr.clone();
        thread::spawn(move || {
            // 创建 socket
            let socket = Socket::new(Domain::IPV4, Type::STREAM, Some(Protocol::TCP)).unwrap();

            // 设置 SO_REUSEADDR
            socket.set_reuse_address(true).unwrap();

            // 绑定地址
            socket.bind(&addr.into()).unwrap();

            // 开始监听
            socket.listen(128).unwrap();

            // 转为 std::net::TcpListener
            let listener: TcpListener = socket.into();

            println!("Listener {} started on {}", i, addr);
            for stream in listener.incoming() {
                match stream {
                    Ok(_) => println!("Connection on listener {}", i),
                    Err(e) => eprintln!("Error: {}", e),
                }
            }
        });
    }

    // 保持主线程存活
    loop {
        std::thread::park();
    }
}

EBPF

  • sudo apt install clang llvm bpftool
  • clang -O2 -g -target bpf -I/usr/include/$(uname -m)-linux-gnu -c ./ebpf.c -o reuse.o


上次编辑于: 2025/5/24 23:18:16
贡献者: DeeLMind
重要公告(核心基础)