下面是也是我在12580工作时发生的事情,重新记录并发出来。这种特殊需求很考 验PF的功底。在新旧系统并存,做重构的时候有时很需要这种救急的作法。
一、缘起
miscweb1(172.16.88.228)的系统近段时间经常死掉,没有查到最终原因,现在的
策略是将其中一个端口上的服务摘出来,以确认问题,所以新准备了另一台机器 (172.16.88.116),由于miscweb1上还有别的服务,所以不能通过切换域名到新机器的 方式进行测试,另外也不方便让所有调用待迁移服务的部门手工改程序调用新的机器,这 样实施起来时间比较长,协调多个部门也困难,更可怕的是万一调用新的机器上的服务仍 然有问题的话,再改回去更加劳民伤财。
所以通过网络层的策略透明地实现,将流量从miscweb1上转到新机器上(用户仍然访问 miscweb1,但实际上是由新机器提供的服务),将是一个简便易行、修改最小的方式。
二、用PF实现透明转发的几种方式及对比
1、miscweb1代理转发
在miscweb1上: . 起用pf . 起用三层数据包转发功能(net.inet.ip.forwarding=1) . 增加下面的pf策略
int_if="bce0" new_dump="172.16.88.116" rdr pass on $int_if proto tcp from any to any port 9999 -> $new_dump nat pass on $int_if from any to $new_dump port 9999 -> ($int_if)
rdr数据包进入(ip_input)miscweb1时,修改目标地址到新机器上,因为起用了三层转 发,它发现目标地址是不是本机的地址(而是新机器的IP),随即通过int_if转发出去(ip_forward)。
nat在数据包即将从int_if发出去之前(ip_output),将源地址改成int_if的接口IP地址,这样新机器 看到的请求都是来源于miscweb1,这样,不需要对新机器做任何修改,回来的流量都会通过miscweb1。
在新机器上: 不需要做任何修改
特点: . 请求及返回的流量都经过miscweb1,相当于做了代理 . 新机器上显示请求都是来源于miscweb1,看不到真实的客户端地址 . 只修改了miscweb1,新机器及客户端不需要做任何修改
2、miscweb1及新机器协同实现代理转发
在miscweb1上:
. 起用pf . 起用三层数据包转发功能(net.inet.ip.forwarding=1) . 增加下面的pf策略
int_if="bce0" new_dump="172.16.88.116" rdr pass on
$int_if proto tcp from any to any port 9999 ->
$new_dump
rdr数据包进入(ip_input)miscweb1时,修改目标地址到新机器上,因为起用了三层转 发,它发现目标地址是不是本机的地址(而是新机器IP),随即通过int_if转发出去(ip_forward)。
在新机器上: . 起用pf . 增加下面的pf策略
int_if="bce0" old_dump="172.16.88.228" pass in quick on $int_if reply-to ($int_if $old_dump) proto tcp from any to any port 9999
reply-to策略在收到数据包时,记住回包时的转发地址,回给misceweb1,因为msicweb1是用 rdr进行转发,需要返回的数据也通过它,如果没有这策略,新机器会将这些回包直接发给缺省 网关。
特点: . 请求及返回的流量都经过miscweb1,相当于做了代理 . 新机器上显示请求能看到真实的客户端地址 . miscweb1和新机器都需要修改,协同操作,客户端不需要修改
3、miscweb1上单臂进行单方向的流量转发
在miscweb1上:
. 起用pf . 起用三层数据包转发功能(net.inet.ip.forwarding=1) . 增加下面的pf策略
int_if="bce0" new_dump="172.16.88.116" pass in quick on $int_if route-to ($int_if $new_dump) proto tcp from any to any port 9999 no state
route-to策略将包直接转发给新机器,注意后面的"no state",这个让pf对这个策略不生成状态,也就不 按状态表转发,每个符合这条规则的包都将进行规则匹配。原因是freebsd使用的pf落后于openbsd很多 ,不支持sloppy(松散地记录状态)记录状态方式,这要在流量单臂通过(回来的流量不通过时),导致后续 的包不能通过状态表的严格检查而中断连接。
在新机器上:
. 修改rc.conf.local,将miscweb1的ip(172.16.88.228)绑定在新蛋机的loopback接口上
特点: . 客户发过来的包都经过miscweb1,新机器回的数据包直接返回给客户端,不通过miscweb1 . 新机器上能看到客户端的真实IP . miscweb1和新机器都需要修改,协同操作,客户端不需要修改
三、其它事项
freebsd上起用pf的步骤
1、加载pf相关的内核模块
运行命令: kldload pf
修改起动配置文件(/boot/loader.conf)增加下面的配置行,让机器每次起动自动加载pf模块): pf_load="YES"
2、起用pf,freebsd下pf缺省没有起用pf(disabled)
运行命令: pfctl -e
修改起动配置文件(/etc/rc.conf.local),增加下面一行,让机器每次起动自动起用pf功能: pf_enable="YES"

用pf透明地将流量从一台机器转到另一台机器上的缘起及实现方式对比的更多相关文章

  1. TCP/IP(三)数据链路层~2

    一.局域网 1.1.局域网和以太网的区别和联系 局域网:前面已经介绍了,其实就是学校里面.各个大的公司里,自己组件的一个小型网络,这种就属于局域网. 以太网:以太网(Ethernet)指的是由Xero ...

  2. Networking 基本术语/概念

    目录 文章目录 目录 基本概念 冲突域(Collision Domain) 广播域(Broadcast Domain) 冲突域与广播域的区别 IP 网络数据传输方式 物理网络设备 发展简述 中继器(R ...

  3. PF防火墙

    PF防火墙 点击认领       PF防火墙 ( 全称:Packet Filter ) 是 UNIX LIKE 系统上进行 TCP/IP 流量过滤和网络地址转换的软件系统.PF 同样也能提供 TCP/ ...

  4. 大约PF_RING/Intel 82599/透明VPN一些事

    接近崩溃的边缘,如今,在医院这篇文章地方的想法,小病,我宁愿不吃药瓶.一台笔记本电脑,但无法上网,我不称职.想知道的东西.唯一可用3G,不开的热点.由于没人给我报销流程.这个周末,我只有一天,由于下雨 ...

  5. WebP 在减少图片体积和流量上的效果如何?MIP技术实践分享

    作者 | Jackson 编辑 | 尾尾 不论是 PC 还是移动端,图片一直占据着页面流量的大头,在图片的大小和质量之间如何权衡,成为了长期困扰开发者们的问题.而 WebP 技术的出现,为解决该问题提 ...

  6. hadoop 透明加密

    hadoop 透明加密 hadoop 透明加密 kms transparent 2015年04月09日 18:12:20 糖糖_ 阅读数:12248 标签: transparenthadoop kms ...

  7. Linux下安装流量监控工具iftop

    在Linux系统中,top命令可以查看系统资源包括内存,CPU占用信息,查看和探测网络状态可以使用netstat,nmap等工具,实时流量监控可以使用iftop,下面是在CentOS7系列系统上安装i ...

  8. Qt——透明无边框Widget的bug

    Experience 最近在封装一些类的时候,打算做一个窗口框架,能实现拖动.缩放.最大最小化.基本样式等功能,可不慎遇见一件无比蛋疼的事情,QWidget最小化后再恢复正常界面,最小化按钮居然仍处于 ...

  9. 定制Android透明按钮

    自己在学习和做例子的过程中,常常会需要按钮,由于系统自带按钮样式不太好看,所以需要我们自己来定制项目得按钮,我常常采用2中方法: 1.是制作9-patch的图片,这样能够匹配文字内容的长短. 2.是指 ...

随机推荐

  1. Oracle 将不同列的值拼接成一个 字符串

    利用拼接操作符“||”或者 CONCAT('','')函数,将不同列的值 拼接成一个 字符串   -- 方法一:推荐 SELECT S.TEAM ||'**'|| S.NAME ||'**'|| S. ...

  2. 8.实现(Realization)

    实现关系是用来描述接口和实现接口的类或者构建结构之间的关系,接口是操作的集合,而这些操作就用于规定类或者构建结构的一种服务. 在接口和类之间的实现关系中,类实现了接口,类中的操作实现了接口中所声明的操 ...

  3. CSS(04) 定位

    布局常用的三种:标准流.定位.浮动: 1.文档流-标准流 窗体自上而下分成一行行(元素在 (X)HTML 中的位置),并在一行行中从左到右排放元素: 2.CSS 定位 Position 属性(绝对定位 ...

  4. spring含参数 环绕通知demo

    题目:有一个懂得读心术的人需要完成两件事情:截听志愿者的内心感应和显示他们在想什么 <?xml version="1.0" encoding="UTF-8" ...

  5. Oracle数据库多语言文字存储解决方案

    一.关于字符集 字符集(也称字元集,Character Set)就是字符编码表(codepage),一个字符不论英文.中文.韩文等在计算机系统内存或硬盘中通过二进制的字节(Byte)保存,这个二进制的 ...

  6. C#制作艺术字

    相信 Word  中的 艺术字 功能大家都不陌生, 前面这个 "Word" 单词就是它所为. 今天, 我们就利用C#来制作几款自己的艺术字, 可能会对我们了解字体图像的制作原理有一 ...

  7. Eclipse和Android Studio中的DDMS使用时什么不同?

    http://www.jb51.net/softjc/454131.html Eclipse和Android Studio中的DDMS使用时什么不同? 相信很多经常开发Android应用的朋友应该都接 ...

  8. js中的this和apply

    this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 1.纯粹函数调用. function test() { this. ...

  9. 查看系统和PowerShell版本

    查询PowerShell当前版本$psversiontable.BuildVersion.Major 查询Windows当前版本:[System.Environment]::OSVersion.Ver ...

  10. discuz制作

    discuz x1.5模板制作图文教程[1] 在开始前,先了介绍一下discuz!的几个模板文件:1.        header.htm ------------------------------ ...