意图是让一个程序拦截一系列IP数据包并读取其原始内容,然后在进行调整后重新插入到网络中。
我的方法是基于设置一个Tuntap接口(具体来说是Tun),然后使用iptables等工具将所需的数据包重定向到该隧道接口。
为了测试目的,我编写了这个短小的shell脚本来设置Tun接口并添加所需的规则。现在,我打算在任何从我的本地机器发送到目的地为
编辑:
如果有其他方法可以实现第一段描述的功能而不是使用Tun/Tap,那么任何建议当然都会受到欢迎。
我的方法是基于设置一个Tuntap接口(具体来说是Tun),然后使用iptables等工具将所需的数据包重定向到该隧道接口。
为了测试目的,我编写了这个短小的shell脚本来设置Tun接口并添加所需的规则。现在,我打算在任何从我的本地机器发送到目的地为
123.123.123.123
的数据包上进行测试。以下是启动脚本:# Set up the tunnel
ip tuntap add dev maintun mode tun
ifconfig maintun inet 10.10.10.1 netmask 255.255.255.0 up
# Mark packets for forwarding to tun
iptables -t mangle -A PREROUTING -d 123.123.123.123 -j MARK --set-mark 2
# Apply ClientRouter table to mark 2 as it's defined in /etc/iproute2/rt_tables
# 201 ClientRouter
ip rule add fwmark 2 table ClientRouter
# Apply gw if to ClienRouter
ip route add default via 10.10.10.1 dev maintun table ClientRouter
我开始编写一个perl脚本来从Tun设备读取数据,但是我同时卡在了多个点上:
- 我认为这样做的方法是让脚本自己通过调用
ioctl()
到/dev/net/tun
文件句柄来创建接口,但我不确定ioctl()
需要的其他参数。这导致我有下面两个问题: - 我看到第二个参数引用了
TUNSETIFF
。我只知道它必须是数字。它要求什么? - 据我所了解,第三个参数应该是某种标志,但我没有找到相关信息。可能,其中一个标志是选择它是否应该是Tun或Tap隧道。有关此事的任何信息吗?
由于我被ioctl()标志困住了,我想退一步问:如何以编程方式从Tun设备读取数据,最好是预先配置好的设备?
此外,如果有人看到启动脚本有任何问题,请随意指出。
尽管理想情况下解决方案应该是使用perl,但并非必须如此,只是这是我最容易阅读的语言。Java也是不错的选择。不幸的是,我的C语言水平远远不够胜任此项工作。编辑:
如果有其他方法可以实现第一段描述的功能而不是使用Tun/Tap,那么任何建议当然都会受到欢迎。
注意:
我遇到了这个问题,虽然类似,但它并没有提供关于ioctl()参数的答案。不过,它表明需要调用ioctl()
。