【发布时间】:2015-08-07 10:15:42
【问题描述】:
目的是让程序拦截一组 IP 数据包并读取其原始内容,然后在修补后将其重新插入网络。
我的方法是建立一个 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 不同的方法允许我按照第一段所述进行操作,那么当然欢迎任何建议。
注意:
我遇到了this question,虽然类似,但它没有提供对 ioctl() 争论的答案。然而,这表明需要拨打ioctl()。
【问题讨论】:
-
您可能还对 libnetfilter_queue / NFQUEUE 的使用感兴趣。请参阅home.regit.org/netfilter-en/… 进行简短讨论。
标签: linux perl shell iptables tunnel