我必须编写一个vpn模块。首先,我编写了一个内核模块,用于修改所有传入和传出的TCP数据包。它使用netfilter钩子。对于传入的数据包,我通过将它们递增1来修改(struct sk_buff)->data
和(struct sk_buff)->tail
指针之间的字节。对于传出数据包,我通过将它们递减1来修改(struct sk_buff)->data
和(struct sk_buff)->tail
指针之间的字节。
但是,我尝试在localhost和localhost之间建立TCP连接(通过netcat),但我没有成功。你能告诉我我做错了什么吗?我需要修改struct sk_buff
结构中的其他一些字段吗?
是否可以仅从内核空间实现我的简单vpn模块?(因此不使用libnetfilter_queue等特殊库)?
谢谢。
答案 0 :(得分:2)
是的,您可以在不使用libnetfilter的情况下执行此操作。但鉴于您提供的有关项目的信息有限,很难就如何解决问题给出一个好的建议。这里有一些应该有用的参考资料。
1)我建议您查看TUN/TAP接口驱动程序API。这将允许您在应用程序空间而不是内核中实现代码。有关此类VPN的一个很好的示例,请参阅openvpn。
如果您对更高级的内核空间挂钩感兴趣...
2)查看关于挂钩到netfilter netfilter kernel hooks