- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个 Linux 内核模块,它将数据包重定向到本地主机网络服务器,该数据包最初是通过这台机器使用网桥转发的。它还重定向以回复客户端。客户端忘记了重定向。所以有2个部分 1. 所有通过网桥转发到外部网络服务器的数据包都被重定向到本地网络服务器。
我可以通过 nf_hook NF_INET_LOCAL_OUT 完成第二部分
unsigned int snoop_hook_reply( unsigned int hooknum, struct sk_buff *skb,
const struct net_device *in, const struct net_device *out,
int(*okfn)( struct sk_buff * ) )
{
int offset, len;
struct ethhdr *ethh;
struct iphdr *iph;
struct tcphdr *tcph;
bool flag = false;
struct net_device *eth1_dev , *lo_dev;
if (!skb) return NF_ACCEPT;
iph = ip_hdr(skb);
if (!iph) return NF_ACCEPT;
skb_set_transport_header(skb, iph->ihl * 4);
tcph = tcp_hdr(skb);
/* skip lo packets */
if (iph->saddr == iph->daddr) return NF_ACCEPT;
if (tcph->dest == htons(80))
flag=true;
if(flag != true)
return NF_ACCEPT;
// correct the IP checksum
iph->check = 0;
ip_send_check (iph);
//correct the TCP checksum
offset = skb_transport_offset(skb);
len = skb->len - offset;
tcph->check = 0;
if(skb->len > 60){
tcph->check = csum_tcpudp_magic((iph->saddr), (iph->daddr), len, IPPROTO_TCP, csum_partial((unsigned char *)tcph,len,0));
}
else{
tcph->check = ~csum_tcpudp_magic((iph->saddr), (iph->daddr), len, IPPROTO_TCP, 0);
}
//send to dev
eth1_dev = dev_get_by_name(&init_net,"eth1");
lo_dev = dev_get_by_name(&init_net,"lo");
skb->dev = eth1_dev;
ethh = (struct ethhdr *) skb_push(skb, ETH_HLEN);
skb_reset_mac_header(skb);
skb->protocol = ethh->h_proto = htons(ETH_P_IP);
memcpy (ethh->h_source,eth1_dev->dev_addr , ETH_ALEN);
memcpy (ethh->h_dest, d_mac, ETH_ALEN); // d_mac is mac of the gateway
dev_queue_xmit(skb);
return NF_STOLEN;
}
上面的代码非常适合我。一个问题是稍后我会破坏数据包,因此可能需要创建一个新的 sk_buff。
我无法通过 NF_INET_PRE_ROUTING 完成第一部分,我无法通过 TCP/IP 堆栈将数据包/sk_buff 推送到网络服务器进程。我尝试将 dev_queue_xmit() 函数与 skb->dev 一起用作 eth1 和 lo 。我看到数据包通过 tcpdump 命中 lo 或 eth1。但是数据包没有到达本地主机网络服务器。任何人都可以帮助我解决这个问题或指出一些类似的已回答问题。我相信我需要调用一些接收函数而不是 dev_queue_xmit()。此外,当数据包到达 NF_INET_PREROUTING 时,我的以太网 header 已经存在,所以我没有形成它。我已经通过多种方式完成了上述任务,首先使用原始套接字,然后使用 nf_queue,现在我想通过这种方法查看性能。谢谢
最佳答案
如果你想在本地接收数据包,你不能在 eth1 上调用 dev_queue_xmit(),因为它会被发送出去。在将 skb->dev 指向 eth1/lo 之后,您可能需要调用 netif_rx()。
还有一点,如果dest-ip不是你本地的host ip,那么你需要再次避免路由,否则你的拦截就没有用了。为此,您需要将数据包的目标 ip 修改为 eth1/lo IP 或通过使用 skb_dst_set() 设置“rth->dst.input= ip_local_deliver”来欺骗 IP 层,使数据包被接受为本地数据包。
关于linux - 通过 sk_buff 将以太网数据包重定向到本地主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32759533/
在我们的服务出现一些预期的增长之后,突然间一些更新花费了非常长的时间,这些过去非常快,直到表达到大约 2MM 记录,现在它们每个需要大约 40-60 秒。 update table1 set fiel
我在服务中实现了一个传感器事件监听器,只要采样周期和最大报告延迟低于 1 秒,该监听器就可以正常工作,但一旦我将采样周期增加到超过 1 秒,传感器就根本不会更新。 我希望采样周期为 10 秒(可能是
我使用 Tkinter GUI 来启动测量和分析过程,基本上只需单击一个按钮即可开始。由于这些测量可能需要一段时间,我尝试添加一个进度条,即这个: http://tkinter.unpythonic.
我正在尝试使用套接字发送数据包,但出现错误。 invalid conversion from ‘omnetpp::cPacket*’ to ‘inet::Packet*’ [-fpermissive]
我刚刚发现 String#split 有以下奇怪的行为: "a\tb c\nd".split => ["a", "b", "c", "d"] "a\tb c\nd".split(' ') => ["a
您好,我正在尝试 ClojureScript,我正在使用 Klipse作为我的 REPL 差不多。这可能不是它的预期用途,但因为我没有做任何太复杂的事情,所以现在没问题。 我遇到的一个问题是尝试设置计
根据下面的数据,ClockKit 会生成一次 future 的 CLKComplicationTimelineEntry 项,但对于过去的时间点,会进行 24 次调用!这是为什么? 更多详情: 我注意
我有一个 MySQL 表,这个表有一个名为 datetime_utc 的 DATETIME 列。如您所料,它是 UTC 日期和时间。在我的 Bookshelf 模型中,我定义了一个虚拟 getter,
大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源
我是一名优秀的程序员,十分优秀!