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. 使用mongodump及mongorestore备份及恢复数据

    mongodump及mongorestore是用于备份和恢复mongodb数据库的两个命令,位于mongodb安装目录的bin文件夹下. mongodump导出的备份文件为二进制格式,每一个文档的对应 ...

  2. 多线程之ThreadLocal

    Java并发编程:深入剖析ThreadLocal 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLoc ...

  3. 在handlebars.js {{#if}}条件下的逻辑运算符解决方案

    解决方案.这增加了比较运算符. Handlebars.registerHelper('ifCond', function (v1, operator, v2, options) { switch (o ...

  4. cloudstack 添加新网卡使其能上网

    由于虚拟机使用了默认的网络套餐,是不能上网的.现在的需求是使其能上网. 操作步骤: 1.添加一个在能上网的网络里的网卡,使其成为默认网卡 2.复制网卡配置文件,修改网卡名称等,重启network(可能 ...

  5. http协议中的keeplive是做什么的?它的适应场景是什么?

    1.Http底层也是通过TCP传输的. 2.HTTP keep-alive Http是一个”请求-响应”协议,它的keep-alive主要是为了让多个http请求共享一个Tcp连接,以避免每个Http ...

  6. pipeline 发布war包

    pipline 写法分为 脚本式和声明式,下面采用脚本式编程: node { stage('checkout') { echo '开始检出代码' checkout([$class: 'GitSCM', ...

  7. UITapGestureRecognizer 的用法(轻触手势识别器)

    最近在项目中用到了手势操作,键盘回收时还是挺常用的,现在总结下,多谢网络上大神们的分享. 先分享下我在项目中用的代码: UITapGestureRecognizer * mytap=[[UITapGe ...

  8. vue 目录结构解析

    ├── README.md 项目介绍├── index.html 入口页面├── build 构建脚本目录│ ├── webpack.base.conf.js webpack基础配置,开发环境,生产环 ...

  9. PHP原生开发的各大音乐平台API接口

    支持以下音乐平台 网易云音乐 QQ音乐 酷狗音乐 酷我音乐 虾米音乐 百度音乐 一听音乐 咪咕音乐 荔枝FM 蜻蜓FM 喜马拉雅FM 全民K歌 5sing原创 5sing翻唱 若是数据获取失败 方案一 ...

  10. 将CSV文件导入到hive数据库

    将csv文件导入hive后出现了所有的字段只显示在新建的表的第一个字段中,后面的字段全是null. 出现这种的原因是hive以行分隔数据,需要修改为按逗号'  ,  ‘ 进行分隔读取, 具体操作如下, ...