用pf透明地将流量从一台机器转到另一台机器上的缘起及实现方式对比
一、缘起
miscweb1(172.16.88.228)的系统近段时间经常死掉,没有查到最终原因,现在的
所以通过网络层的策略透明地实现,将流量从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透明地将流量从一台机器转到另一台机器上的缘起及实现方式对比的更多相关文章
- TCP/IP(三)数据链路层~2
一.局域网 1.1.局域网和以太网的区别和联系 局域网:前面已经介绍了,其实就是学校里面.各个大的公司里,自己组件的一个小型网络,这种就属于局域网. 以太网:以太网(Ethernet)指的是由Xero ...
- Networking 基本术语/概念
目录 文章目录 目录 基本概念 冲突域(Collision Domain) 广播域(Broadcast Domain) 冲突域与广播域的区别 IP 网络数据传输方式 物理网络设备 发展简述 中继器(R ...
- PF防火墙
PF防火墙 点击认领 PF防火墙 ( 全称:Packet Filter ) 是 UNIX LIKE 系统上进行 TCP/IP 流量过滤和网络地址转换的软件系统.PF 同样也能提供 TCP/ ...
- 大约PF_RING/Intel 82599/透明VPN一些事
接近崩溃的边缘,如今,在医院这篇文章地方的想法,小病,我宁愿不吃药瓶.一台笔记本电脑,但无法上网,我不称职.想知道的东西.唯一可用3G,不开的热点.由于没人给我报销流程.这个周末,我只有一天,由于下雨 ...
- WebP 在减少图片体积和流量上的效果如何?MIP技术实践分享
作者 | Jackson 编辑 | 尾尾 不论是 PC 还是移动端,图片一直占据着页面流量的大头,在图片的大小和质量之间如何权衡,成为了长期困扰开发者们的问题.而 WebP 技术的出现,为解决该问题提 ...
- hadoop 透明加密
hadoop 透明加密 hadoop 透明加密 kms transparent 2015年04月09日 18:12:20 糖糖_ 阅读数:12248 标签: transparenthadoop kms ...
- Linux下安装流量监控工具iftop
在Linux系统中,top命令可以查看系统资源包括内存,CPU占用信息,查看和探测网络状态可以使用netstat,nmap等工具,实时流量监控可以使用iftop,下面是在CentOS7系列系统上安装i ...
- Qt——透明无边框Widget的bug
Experience 最近在封装一些类的时候,打算做一个窗口框架,能实现拖动.缩放.最大最小化.基本样式等功能,可不慎遇见一件无比蛋疼的事情,QWidget最小化后再恢复正常界面,最小化按钮居然仍处于 ...
- 定制Android透明按钮
自己在学习和做例子的过程中,常常会需要按钮,由于系统自带按钮样式不太好看,所以需要我们自己来定制项目得按钮,我常常采用2中方法: 1.是制作9-patch的图片,这样能够匹配文字内容的长短. 2.是指 ...
随机推荐
- MES取所有部门的函数实例
USE [ChangHong]GO/****** Object: UserDefinedFunction [dbo].[FN_GetDeptCode] Script Date: 04/26/2016 ...
- 今天做php经典实例,发现,我是对的,面试官给我说错了
那是七月中下旬在乐元素公司面试,问了我问什么 $str = "Hellow {$res} world";这么写,我回答说 在字符串中插入复杂变量可以用花括号干起来把? 他告诉我 应 ...
- 模拟log4j获取日志对象调用所在的类名、方法名及行号
当我们在记录日志时,每个类中会定义一个日志对象,然后利用这个对象去写日志,那么我们在处理日志时,如何能才能记录日志对象所在的类.方法和行号呢?log4j中已经实现了该功能,那么它是怎么实现的呢? 其实 ...
- OpenGL中的功能与OSG对应功能 (摘)
将OpenGL中的功能与OSG对应功能进行列举: OpenGL function OpenSceneGraph implementation glClear( GLbitfield mask ) os ...
- TP复习11
## ThinkPHP 3.1.2 模板中的基本语法#讲师:赵桐正微博:http://weibo.com/zhaotongzheng 本节课大纲:一.导入CSS和JS文件 1.css link js ...
- [Angular2 Form] Build Select Dropdowns for Angular 2 Forms
Select Dropdowns in Angular 2 a built with select and option elements. You use *ngFor to loop throug ...
- linux脚本^M: bad interpreter:解决方法
转自:http://blog.csdn.net/huiguixian/article/details/6386774 在Linux中执行.sh脚本,异常提示/bin/sh^M: bad interpr ...
- 剑指 offer set 5 二进制中 1 的个数
总结 1. 负数右移会保持其符号. 比如 0x80000000 右移, 其对应的绝对值也是 0X80000000, 其右移一位并保持符号, 得到 0XC0000000. 符号位保持, 使得负数永远都无 ...
- 多条件判断语句case
一.case语句的基本格式: case 变量 in 模式1) 语句块1 :: 模式2) 语句块2 :: ...... :: esac 上面的格式中,每个模式后面的两个分号"::"是 ...
- LeetCode28 Implement strStr()
题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ne ...