Jar*_*und 7 linux shell perl iptables tunnel
目的是让程序拦截一组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
Run Code Online (Sandbox Code Playgroud)
我开始编写一个perl脚本来从Tun设备读取,但是我立即停留在多个点上:
ioctl()文件句柄来创建接口/dev/net/tun,但我不确定其他争论ioctl()是否需要.这引导我接下来的两点:TUNSETIFF.我所知道的是它必须是数字的.它要求什么?当我遇到ioctl()标志时,我想退后一步问:如何以编程方式从Tun设备读取,最好是事先设置的预配置设备?
此外,如果有人发现启动脚本有任何问题,请随时喊出来.
虽然理想情况下溶剂将在perl中,但它不一定是,这只是我能阅读最简单的语言.Java也不错.不幸的是,我的C识字率甚至没有达到应有的水平.
编辑:
如果采用与Tun/Tap不同的方法允许我按照第一段中的描述进行操作,那么当然欢迎任何建议.
注意:
我遇到了这个问题,虽然类似,但它没有提供ioctl()论证的答案.然而,这表明需要ioctl()打电话.
首先,TUN/TAP 接口记录在 Linux 内核文档中,如果您还没有看过,值得一读。当然,这些示例是用 C 语言编写的,但希望仍然有用。
我看到对第二个论点的引用是
TUNSETIFF。我只知道它必须是数字。它在要求什么?
这是一个 C 库常量,您可以使用如下代码确定其值:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <linux/if_tun.h>
int main(int argc, char **argv) {
printf("TUNSETIFF: %d\n", TUNSETIFF);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的系统上返回:
TUNSETIFF: 1074025674
Run Code Online (Sandbox Code Playgroud)
根据我收集的信息,第三个争论应该是某种标志,但我还没有找到有关它们的信息。据推测,一个标志将用于选择它是否应该是 Tun 或 Tap 隧道。有这方面的信息吗?
第三个参数是指向结构的指针
ifr_name,该结构具有包含设备名称的属性和ifr_flags
包含标志的属性。内核文档提供了以下示例代码:
/* Flags: IFF_TUN - TUN device (no Ethernet headers)
* IFF_TAP - TAP device
*
* IFF_NO_PI - Do not provide packet information
*/
ifr.ifr_flags = IFF_TUN;
if( *dev )
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){
close(fd);
return err;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用上面用于查找 的值的相同代码来查找
不同标志 ( IFF_TUN, ) 的值。IFF_TAPTUNSETIFF
如果您使用 Perl 编写代码,则需要一种方法来创建相应的 C 兼容结构。我的 Perl 太生疏了,无法立即提出正确的解决方案。
然而,似乎有许多可用的 Perl 模块可以简化整个过程:
| 归档时间: |
|
| 查看次数: |
1540 次 |
| 最近记录: |