能否使用socat打开现有tun设备,而非新建tun设备进行数据中继?
socat对已有被占用tun接口实现中继的方案
首先明确前提:Linux系统下默认tun设备是独占打开的,仅当设备创建时开启了多队列特性才支持多个进程同时挂载,所以需要分两种情况处理:
场景1:tun0支持多队列挂载
可以直接通过socat指定绑定已有tun0设备实现中继,参考命令结构:
socat tun:tun0,iff-no-pi,iff-up [你要对接的目标地址/协议]
参数说明:
tun:tun0:强制绑定已存在的tun0设备,不会新建虚拟网卡iff-no-pi:关闭tun设备的额外报文信息头,避免和原有占用进程的报文解析逻辑冲突iff-up:保持tun0的up状态,socat退出时不会自动关闭设备
示例:将tun0的流量中继到远端10.0.1.5的9999 TCP端口:socat tun:tun0,iff-no-pi,iff-up TCP:10.0.1.5:9999
场景2:tun0被独占占用、不支持多队列挂载
这种情况无法直接让socat挂载tun0,只能通过流量镜像的方式实现中继:
- 第一步:用iptables的TEE模块将tun0的流量镜像到本地环回地址
示例:镜像tun0所有入站流量到127.0.0.10:iptables -t mangle -A PREROUTING -i tun0 -j TEE --gateway 127.0.0.10 - 第二步:用socat接收镜像流量并转发到目标端
示例:将镜像到127.0.0.10的UDP流量转发到192.168.3.2的4444端口:socat UDP4-RECVFROM:4444,bind=127.0.0.10 UDP4-SENDTO:192.168.3.2:4444
注意:如果需要同时中继tun0的出站流量,补充添加iptables出站规则即可:
iptables -t mangle -A POSTROUTING -o tun0 -j TEE --gateway 127.0.0.10
内容的提问来源于stack exchange,提问作者progquester
相关产品推荐
相关产品推荐

