`
izuoyan
  • 浏览: 9449248 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个实用并且确实的内核补丁--关于桥接nat的

阅读更多

kernel-janitors@vger.kernel.org
bdschuym@pandora.be
...相关的收件人邮箱

Hi,everyone

As we know,the NAT netfilter-hook for IP hooking at OUTPUT is called after routing,so we must rerouting if the destinaton or source address is changed by NAT after the hook.It's all right as the kernel shown for us.But I don't see any logic for rerouting after the bridged-NAT.If bridge-NAT changes a destination or source MAC address,we should do bridge-rerouting as the IP-layer do.
I have only the kernel of version 2.6.8,so I patch on it.Thought the bridge-logic of kernel source of version 2.6.3X has not been changed,it's no matter to patch on kernel of version 2.6.8.

Best wishes

...邮件签名

--- kernel-source-2.6.8/net/bridge/netfilter/ebtable_nat.c 2004-08-14 01:38:09.000000000 -0400
+++ kernel-source-2.6.8/net/bridge/netfilter/ebtable_nat.c 2010-09-25 23:18:13.040825944 -0400
//以上不标准,正确的做法应该是在git源码树上修改...
@@ -10,6 +10,7 @@

#include <linux/netfilter_bridge/ebtables.h>
#include <linux/module.h>
+#include "../br_private.h"

#define NAT_VALID_HOOKS ((1 << NF_BR_PRE_ROUTING) | (1 << NF_BR_LOCAL_OUT) | \
(1 << NF_BR_POST_ROUTING))
@@ -61,6 +62,30 @@
};

static unsigned int
+ebt_nat_dst_local(unsigned int hook, struct sk_buff **pskb, const struct net_device *in
+ , const struct net_device *out, int (*okfn)(struct sk_buff *))
+{
+ struct net_bridge *br = netdev_priv(out);
+ struct net_bridge_fdb_entry *dst;
+ char orig_mac[ETH_ALEN] = {0};
+ unsigned int ret = 0;
+ memcpy(orig_mac, ((**pskb).mac.ethernet)->h_dest, ETH_ALEN * sizeof(unsigned char));
+ ret = ebt_do_table(hook, pskb, in, out, &frame_nat);
+ if (strncmp(((**pskb).mac.ethernet)->h_dest, orig_mac, ETH_ALEN)) {
+ rcu_read_lock();
+ if ((((**pskb).mac.ethernet)->h_dest)[0] & 1)
+ br_flood_deliver(br, *pskb, 0);
+ else if ((dst = __br_fdb_get(br, ((**pskb).mac.ethernet)->h_dest)) != NULL)
+ br_deliver(dst->dst, *pskb);
+ else
+ br_flood_deliver(br, *pskb, 0);
+ rcu_read_unlock();
+ return NF_STOLEN;
+
+ }
+ return ret;
+}
+static unsigned int
ebt_nat_dst(unsigned int hook, struct sk_buff **pskb, const struct net_device *in
, const struct net_device *out, int (*okfn)(struct sk_buff *))
{
@@ -76,7 +101,7 @@

static struct nf_hook_ops ebt_ops_nat[] = {
{
- .hook = ebt_nat_dst,
+ .hook = ebt_nat_dst_local,
.owner = THIS_MODULE,
.pf = PF_BRIDGE,
.hooknum = NF_BR_LOCAL_OUT,

分享到:
评论

相关推荐

    TEWA-800E光猫改桥接

    手打做了个文档,TEWA-800E光猫改桥接操作详细步骤,把路由模式改成桥接模式即可,对LAN1口打勾,路由器WAN口接光猫lan1口,然后路由器正常PPPOE拨号即可。

    创捷pro-face触摸屏桥接模块(profibus)产品说明书.pdf

    3. 网络连接:桥接模块通常具有一个或多个Profibus接口,能够连接多个Profibus设备,从而扩展了网络的规模和提高了系统的灵活性。 4. 硬件集成:桥接模块能够被集成到更大的自动化系统中,与PLC(可编程逻辑控制器...

    ros-winbox中的桥接设置

    ros-winbox中的桥接设置 看了就明白怎么做的

    无线路由器TP-LINK+TL-WR340G+无线桥接设置.docx

    不同于传统的无线桥接一对一连接,WDS可以实现一对多的桥接,同时不影响AP作为无线热点的功能。WDS至少需要两个具有相同功能的AP,最大数量取决于设备支持的扩展能力。 二、TL-WR340G的四种工作模式 1. **AP模式**...

    WLAN-WDS无线网络桥接及手机终端优化.pdf

    无线网络桥接的技术原理是将两个或多个物理网络分开,每个网络作为一个独立的网段存在,然后通过无线路由器互联,形成一个逻辑上的大网络。这种技术的一个重要优势是能够减轻网络拥堵问题,因为它可以将一个高流量的...

    设计模式---桥接模式

    1. 抽象(Abstraction):定义了抽象接口,它通常包含一个指向实现对象的引用。 2. 扩展抽象(Extended Abstraction):是抽象角色的子类,提供了更多的抽象操作。 3. 实现(Implementation):定义了一个接口,实现...

    路由器配置新手上路----桥接与路由.pdf

    桥接的主要目的是连接两个或多个局域网(LAN),使得这些网络之间的设备可以像处于同一个网络中一样进行通信。 - **路由**: 是指确定数据包在网络之间传输的最佳路径的过程。当数据包需要跨越多个网络才能到达目的...

    设计模式专题之(十)桥接模式---设计模式桥接模式示例代码(python--c++)

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件设计中常用于降低复杂性,特别是在系统中存在多种可变因素时,通过解耦抽象和实现,可以使得两者各自独立发展,...

    C++20设计模式学习笔记-第7章桥接模式学习代码

    C++20设计模式学习笔记-第7章桥接模式学习代码

    eve-ng模拟器桥接外网.doc

    在路由器配置中,需要配置一个和本地网卡属于一个网段的 ip 地址,R1(config)#interface e0/1,R1(config-if)#ip add 192.168.42.200 255.255.255.0,R1(config-if)#no sh。 七、测试 ping 同网关地址 在测试 ping...

    Python-djangobot通过Channels桥接Slack和Django

    本文将详细介绍如何使用`djangobot`项目,通过Channels来桥接Slack和Django,以创建一个能接收并响应Slack消息的Django应用。 首先,了解Django Channels。Channels是Django的一个扩展,它允许我们处理异步请求,如...

    TP-LINK无线路由器桥接详细设置教程.doc

    首先,桥接的目的是让两个无线路由器之间建立连接,使得一个网络的信号可以延伸到另一个路由器的覆盖范围内。在开始设置之前,你需要确认两台路由器的无线MAC地址,这是一组唯一的标识符,用于设备间的无线通信。 ...

    VMware虚拟机-网卡设置中的NAT和桥接模式.zip

    在虚拟化技术中,...如果只是需要一个可以访问互联网的环境,而对IP地址没有特殊要求,NAT模式是一个不错的选择。而如果你需要模拟真实的网络环境,或者虚拟机需要被其他网络设备直接访问,那么桥接模式更为合适。

    swift-SwiftPython-将Swift桥接到Python的实验

    SwiftPython - 将Swift桥接到Python的实验

    DIR-618桥接设置

    桥接是一种网络技术,用于连接两个独立的局域网络(LAN),使它们能够像一个整体网络那样工作。具体到无线网络中,WDS(Wireless Distribution System,无线分布式系统)就是一种实现无线桥接的技术。它允许无线接入...

    在virt-manager中桥接虚拟机

    需要桥接的应用场景2. 环境3. 配置步骤3.1 在宿主机中搭建网桥3.2 将网桥配置至虚拟机3.3 在虚拟机中配置网络4. 在终端中同时连接宿主机和虚拟机参考资源 1. 需要桥接的应用场景 假设一场景:在一运行Ubuntu桌面的...

    c++-设计模式之桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得两者可以独立地变化。这种模式常用于需要在多个维度上变化的场景,比如不同的形状和颜色,允许在不改变客户端代码的情况下增加新...

    无线路由器怎么桥接?华硕RT-AC 54U无线路由器设置桥接详细教程

    无线路由器桥接是一种扩展无线网络覆盖范围的技术,尤其在大空间或者存在物理障碍导致无线信号弱的地方非常有用。...然而,对于提升网络覆盖面积,特别是对于家庭或小型办公室环境来说,这是一个实用且经济的解决方案。

    DlinkDIR-605L无线路由器桥接

    多个DlinkDIR-605L无线路由器桥接技术

Global site tag (gtag.js) - Google Analytics