Linux可以配置为在桥接模式下运行。 为网桥分配了两个或更多物理接口。 在接口
之间共享单个IP地址。 默认情况下,任何到达一个接口的数据包都会立即路由到另一个
网桥接口。

需要的Linux包:
bridge-utils
ebtables

在我们设置桥接模式的示例中,我们将使用本地地址192.168.1.11/24并将eth0
和eth1作为桥接接口;

brctl addbr br0 # create bridge device
brctl stp br0 off # Disable spanning tree protocol
brctl addif br0 eth0 # Add eth0 to bridge
brctl addif br0 eth1 # Add eth1 to bridge

ifconfig eth0 0 0.0.0.0 # Get rid of interface IP addresses
ifconfig eth1 0 0.0.0.0 # ditto # Set the bridge IP address and enable it
ifconfig br0 192.168.1.11 netmask 255.255.255.0 up

如果您还没有这样做,请记住添加一个默认路由,例如此路由为192.168.1.1。

ip route add default via 192.168.1.1

绿色箭头是源自客户端的数据包,红色箭头是源自源服务器的数据包。 未定向到本地地址的所有流量都将通过网桥。 我们需要分解一些流量并对其进行路由,以便将其路由到ATS。 这需要ebtables。 我们想要拦截的流是绿色1(从客户端到网桥)和红色1(源服务器到桥接)。

在此示例中,我们将拦截端口80(HTTP)流量。 我们将使用BROUTING链,因为它仅针对从外部发起并到达(转发启用)接口的数据包。 虽然看起来这将拦截所有端口80流量,但它只会影响上述两种流量。 -j redirect将数据包标记为转移到网桥而不转发,DROP目标将数据包放入正常的iptables路由中,以便我们可以对它们使用标准设备测试[1]。 虽然此示例仅处理端口80,但除端口值外,其他端口相同。 另请注意,此处的端口是从客户端和源服务器的角度来看的端口,而不是Traffic Server服务器端口。

ebtables -t broute -F # Flush the table
# inbound traffic
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp --ip-dport 80 \
-j redirect --redirect-target DROP
# returning outbound traffic
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp --ip-sport 80 \
-j redirect --redirect-target DROP

Traffic Server在第3层运行,因此我们需要使用iptables来正确处理IP数据包:
iptables -t mangle -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 \
-j TPROXY --on-ip 0.0.0.0 --on-port 8080 --tproxy-mark 1/1
iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp --sport 80 \
-j MARK --set-mark 1/1

此时接口的方向性很重要。 例如,eth1是入站(客户端)接口,而eth0是出站(源服务器端)接口。 我们标记两个数据包流,以便我们可以对它们使用策略路由。 对于入站数据包,我们需要使用TPROXY强制接受数据包到外部IP地址。 对于返回出站数据包,将有一个套接字打开绑定到外部地址,我们只需要强制它在本地传递。 --on-ip的值为0,因为目标端口正在侦听并且未绑定到特定地址。 --on-port的值必须与Traffic Server服务器端口匹配。 否则它的值是任意的。 --dport和--sport从客户端和源服务器的角度指定端口。

一旦标记了流,我们就可以通过策略路由表强制它们通过环回接口在本地传递:
ip rule add fwmark 1/1 table 1
ip route add local 0.0.0.0/0 dev lo table 1

使用的标记是任意的,但它必须在iptables和路由规则之间保持一致。

在records.config中设置
proxy.config.http.server_ports value from --on-port (see below)
proxy.config.reverse_proxy.enabled 1
proxy.config.url_remap.remap_required 0

其他疑难解答
检查以确保iptables没有过滤(阻止)传入的HTTP连接。
您可以使用以下命令清除所有过滤器:
iptables -t filter --flush FORWARD
iptables -t filter --flush INPUT

这有点激烈,应该只用于测试/调试。 实时系统可能需要一些过滤器,但这超出了本文档的范围。 如果这样可以解决问题,那么您的过滤器集限制性太强。

请注意,此问题将阻止基本网桥(没有ATS)允许HTTP流量通过。

验证是否已启用IP数据包转发。
cat /proc/sys/net/ipv4/ip_forward
echo '1' > /proc/sys/net/ipv4/ip_forward

可以通过将其置于/etc/sysctl.conf中来保持此设置
net/ipv4/ip_forward=1

ats Linux Bridge内联的更多相关文章

  1. Linux 中 x86 的内联汇编

    工程中需要用到内联汇编,找到一篇不错的文章,趁机学习下. 原文地址:http://www.ibm.com/developerworks/cn/linux/sdk/assemble/inline/ 如果 ...

  2. Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)【转】

    转自:http://www.linuxidc.com/Linux/2013-06/85221p3.htm 阅读Linux内核源码或对代码做性能优化时,经常会有在C语言中嵌入一段汇编代码的需求,这种嵌入 ...

  3. Neutron 理解(14):Neutron ML2 + Linux bridge + VxLAN 组网

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  4. 最牛X的GCC 内联汇编

    导读 正如大家知道的,在C语言中插入汇编语言,其是Linux中使用的基本汇编程序语法.本文将讲解 GCC 提供的内联汇编特性的用途和用法.对于阅读这篇文章,这里只有两个前提要求,很明显,就是 x86 ...

  5. GCC内联汇编入门

    原文为GCC-Inline-Assembly-HOWTO,在google上可以找到原文,欢迎指出翻译错误. 中文版说明 由于译者水平有限,故译文出错之处,还请见谅.C语言的关键字不译,一些单词或词组( ...

  6. [翻译] GCC 内联汇编 HOWTO

    目录 GCC 内联汇编 HOWTO 原文链接与说明 1. 简介 1.1 版权许可 1.2 反馈校正 1.3 致谢 2. 概览 3. GCC 汇编语法 4. 基本内联 5. 扩展汇编 5.1 汇编程序模 ...

  7. 嵌入式C语言自我修养 10:内联函数探究

    10.1 属性声明:noinline & always_inline 这一节,接着讲 __atttribute__ 属性声明,__atttribute__ 可以说是 GNU C 最大的特色.我 ...

  8. ARM嵌入式开发中的GCC内联汇编__asm__

    在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择.但如果完全通过汇编代码实现,又会过于复杂.难以调试.因此,C语言内嵌汇编的方式 ...

  9. 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制

    通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言的库函数与在C代码中 ...

随机推荐

  1. 【洛谷】【动态规划+单调队列】P1725 琪露诺

    [题目描述:] 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到河 ...

  2. 检查oracle用户默认密码的账户

    1. 检查使用默认用户密码的账号 --11g 通过数据字典SYS.DEFAULT_PWD$或视图DBA_USERS_WITH_DEFPWD select u.username, u.account_s ...

  3. 'vue-cli-service' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    首先把 node_modules 文件夹删除 然后运行以下命令: cnpm install 这样就可以正常运行

  4. Day7 访问权限

    构造者模式思想 进行初始化,解决了多个构造器重载,构造器参数过多记不住的情况. package day7;//声明一个程序包 class Employee{ private String name; ...

  5. mysql 去除特殊字符和前后空白字符

    mysql 去除特殊字符 update table set field = replace(replace(replace(field,char(9),''),char(10),''),char(13 ...

  6. Kubernetes 详解

    Kubernetes主要由以下几个核心组件组成: etcd保存了整个集群的状态: apiserver提供了资源操作的唯一入口,并提供认证.授权.访问控制.API注册和发现等机制: controller ...

  7. Js apply()使用详解

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  8. HDU 1114(没有变形的完全背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 Piggy-Bank Time Limit: 2000/1000 MS (Java/Others ...

  9. [图解tensorflow源码] [转载] tensorflow设备内存分配算法解析 (BFC算法)

    转载自 http://weibo.com/p/1001603980563068394770   @ICT_吴林阳 tensorflow设备内存管理模块实现了一个best-fit with coales ...

  10. ubuntu16.04系统gcc下降和升级

    gcc下降 1 安装 sudo apt-get install -y gcc-4.7 sudo apt-get install -y g++-4.7 2 重新建立软连接 cd /usr/bin #进入 ...