努力向上的学渣 2025-02-07 10:11 采纳率: 0%
浏览 7

linux tun 数据到用户空间的socket

linux tun设备实验,创建UDP socket在tun设备上完成数据的发送和接收

实验中共创建4个线程
线程1. 周期性调用 socket sendto 函数发送数据
线程2. 调用 socket recvfrom 函数接收数据
线程3. 调用 read 函数读取 tun 设备的IP数据包
线程4. 周期性调用 write 函数将IP数据包写入 tun 设备

实验结果
socket sendto -> IP stack -> read tun 可以获得IP数据包
write tun -> IP stack -> socket recvfrom 接收失败

进行了一些调查,在某AI获得的信息是如果数据包的目的IP为tun设备IP,则内核会直接处理,不会转发到用户空间的socket
不太确定这个结论是否正确

img

问题:在不编译内核的情况下,是否可以通过某些设置让内核将数据发送到用户空间的socket?

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2025-02-07 10:12
    关注

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    在LINUX中,使用TCP/IP协议来实现TUN(TUNNELING UNICAST NETWORK)功能需要考虑多个方面,包括网络环境、系统资源以及应用程序性能等。以下是一个基本的示例,展示如何使用TUN技术将数据从一个服务器发送到另一个服务器:

    LINUX系统配置

    首先,我们需要确保有两台服务器运行TUN服务。一台作为服务器,另一台作为客户端。这可以通过运行SUDO SYSTEMCTL ENABLE TUN命令来设置这两个服务器为监听端口,并且启动它们。

    创建TUN设备并安装软件包

    1. 创建TUN设备

      • SUDO APT-GET UPDATE && SUDO APT-GET INSTALL TUNLIB
      • 这将安装TUN设备所需的库,例如LIBTUN-5.3.SO
    2. 安装TUN软件包

      • SUDO APT-GET INSTALL TUNLIB-TOOLS

    确保程序安全

    为了确保程序的安全性,我们可以在服务器上添加一些必要的安全措施,例如设置日志记录器以记录所有活动,或者使用密码认证机制防止非授权访问。

    TCP/IP配置

    在服务器上,我们需要配置TUN服务。首先,打开终端,然后输入以下命令来检查是否已成功设置了TUN服务:

    SUDO TUN LIBTUN -A
    

    如果一切正常,你将在终端中看到一条消息,表示TUN服务已经成功配置。

    发送数据到客户端

    接下来,我们可以编写一个简单的脚本来向客户端发送数据。这个脚本将包含两个主要部分:发送数据到服务器端和接收客户端的数据。

    #!/BIN/BASH
    # THIS SCRIPT SENDS DATA TO A CLIENT AND RECEIVES IT BACK FROM THE SERVER.
    #
    # USAGE: ./SEND_DATA.SH [SERVER_IP] [SERVER_PORT] [CLIENT_IP] [CLIENT_PORT]
    #
    # EXAMPLE USAGE:
    # ./SEND_DATA.SH 192.168.1.1 5000 192.168.1.2 5001
    # THE OUTPUT WILL BE THE MESSAGE RECEIVED BY THE CLIENT.
    
    # CHECK IF THE ARGUMENTS ARE PROVIDED
    IF [[ $# -NE 5 ]]; THEN
        ECHO "USAGE: $0 <SERVER_IP> <SERVER_PORT> <CLIENT_IP> <CLIENT_PORT>"
        EXIT 1
    FI
    
    SERVER_IP=$1
    SERVER_PORT=$2
    CLIENT_IP=$3
    CLIENT_PORT=$4
    
    ECHO "CONNECTING TO SERVER AT $SERVER_IP:$SERVER_PORT"
    ECHO "SENDING DATA..."
    ECHO "RECEIVED FROM CLIENT:"
    ECHO $(ECHO "$CLIENT_IP:$CLIENT_PORT" | TUN --SESSION-ID=TUN_SESSION_ID)
    ECHO "DONE SENDING DATA."
    
    ECHO "WAITING FOR CLIENT TO RECEIVE THE DATA."
    WHILE TRUE; DO
        # WAIT FOR THE CLIENT TO RESPOND
        ECHO "CHECKING CONNECTION STATUS..."
        IF ! TUND -R "$CLIENT_IP:$CLIENT_PORT"; THEN
            ECHO "CONNECTION FAILED. RETRYING..."
            SLEEP 5
        ELSE
            ECHO "CONNECTION ESTABLISHED."
            BREAK
        FI
    DONE
    

    执行脚本

    将上述脚本复制到一个文本文件(例如 SEND_DATA.SH),保存后,将其上传到服务器上进行测试。

    安装TUN服务

    根据你的TUN设备类型(如RTPS/TUN/IPX/NETBIOS/TCP/IP等),可以使用不同的软件包来安装TUN服务。一般情况下,你需要下载与之匹配的TUN软件包,并按照其安装说明进行操作。

    TUN IPSEC服务器配置

    对于IPSEC服务器,你可以使用以下命令来安装TUN服务:

    SUDO APT-GET INSTALL TUNLIB-IPSEC
    

    TUN UTM服务器配置

    对于UTM服务器,你可以使用以下命令来安装TUN服务:

    SUDO APT-GET INSTALL TUNLIB-UTM
    

    更多信息

    对于TUN服务的详细使用指南,建议查阅相关文档或参考官方教程,通常会提供详细的使用指南和支持文档。

    通过这些步骤,你应该能够创建一个TUN服务,用于在远程服务器之间传输数据。请注意,实际应用中的TUN服务可能需要更复杂的配置和安全性措施,以保护数据安全。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月7日