tun虚拟网卡和fib_validate_source的反向过滤

想在用户空间构造一个IP数据包,然后通过写到tun虚拟网卡,通过内核协议栈转发出去。发现数据包能通过pre_routing Hook节点,就是过不了forward Hook。进一步追踪,发现到了fib_validate_source函数就drop掉了。

经过向大牛请教及自己分析,才知道是反向路由过滤的原因。

反向过滤参考 http://blog.csdn.net/layrong/article/details/45673037

当开启反向路径过滤时,对于从网卡A交付到协议栈转发的数据包fib_validate_source会检查路由表中对于源IP地址的数据包是否路由到网卡A。因此解决上述问题,需要在路由表中加上对称的路由(以上述数据包源地址为目的地址的数据包路由到Tun网卡),或者关闭rp_filter反向过滤功能!


要启动tun虚拟网卡,需要使用系统调用来创建和配置网络接口。以下是一个简单的C语言程序,可以启动一个名为“tun0”的tun虚拟网卡。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <net/if.h> #include <linux/if_tun.h> int tun_alloc(char *dev) { struct ifreq ifr; int fd, err; if ((fd = open("/dev/net/tun", O_RDWR)) < 0) { perror("open /dev/net/tun"); return -1; } memset(&ifr, 0, sizeof(ifr)); ifr.ifr_flags = IFF_TUN | IFF_NO_PI; if (*dev) { strncpy(ifr.ifr_name, dev, IFNAMSIZ); } if ((err = ioctl(fd, TUNSETIFF, (void *)&ifr)) < 0) { perror("ioctl TUNSETIFF"); close(fd); return err; } strcpy(dev, ifr.ifr_name); return fd; } int main() { int tunfd; char tun_name[IFNAMSIZ]; strcpy(tun_name, "tun0"); tunfd = tun_alloc(tun_name); if (tunfd < 0) { fprintf(stderr, "Error creating tun interface\n"); exit(1); } printf("Interface %s created\n", tun_name); close(tunfd); return 0; } ``` 在这个程序中, `tun_alloc()` 函数用于创建和配置tun虚拟网卡。它首先打开 `/dev/net/tun` 设备文件,然后使用 `ioctl()` 系统调用设置tun虚拟网卡的参数。在这里,我们将网卡的名称设置为“tun0”,并且将 `IFF_NO_PI` 标志设置为了1,以避免在数据包中包含Linux内核的附加信息。 在 `main()` 函数中,我们调用 `tun_alloc()` 来创建一个名为“tun0”的tun虚拟网卡。如果创建失败,我们打印错误消息并退出程序。否则,我们打印一条消息,表明接口已创建,并且关闭文件描述符以释放系统资源。 需要注意的是,这个程序需要在root权限下运行,才能够创建和配置tun虚拟网卡。运行程序时,可以使用以下命令来编译和运行程序: ```shell gcc -o tun tun.c sudo ./tun ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值