如何让TUN设备接收传入数据包?(iOS简易VPN服务器项目场景)
如何让TUN设备接收传入数据包?(iOS简易VPN服务器项目场景)
我最近在做一个面向iOS的简易VPN服务器项目,具体流程是这样的:iOS端会把拦截到的数据包通过UDP连接发送给Go服务器,之后服务器再将这些数据包注入到TUN设备中。
我的Go服务器工作流程分为以下几步:
- 创建TUN设备
- 创建UDP监听器
- 开始监听来自TUN设备的数据包
- 开始监听来自UDP连接的数据包
TUN设备初始化实现
func CreateTun() (*water.Interface, error) { tun_ip := "192.168.9.11" config := water.Config{ DeviceType: water.TUN, } iface, err := water.New(config) if err != nil { return nil, err } _, err := util.RunCommand(fmt.Sprintf("sudo ip addr add %s/24 dev %s", tun_ip, iface.Name())) if err != nil { return nil, err } _, err = util.RunCommand(fmt.Sprintf("sudo ip link set dev %s up", iface.Name())) if err != nil { return nil, err } // 此处省略后续代码逻辑 }
要确保TUN设备能正常接收传入数据包,有几个关键要点需要注意:
- 权限问题:操作TUN设备和修改网络配置都需要管理员权限,所以启动Go服务器时一定要用
sudo命令运行。 - 路由规则配置:仅初始化TUN设备还不够,需要添加系统路由规则,将目标流量导向TUN设备所在的IP段(比如
192.168.9.0/24),这样数据包才会被TUN设备捕获处理。 - 数据包转发设置:如果需要将TUN设备的数据包转发到公网,还要确保系统开启了IP转发功能,可以通过
echo 1 > /proc/sys/net/ipv4/ip_forward命令开启。
备注:内容来源于stack exchange,提问作者picKit
相关产品推荐
相关产品推荐

