用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.是指 ...
随机推荐
- Unity3d:使用uWebKit插件嵌入网页,网页中的flv视频无法播放
问题描述:unity3d程序,使用uWebKit插件嵌入网页,用来播放FLV视频,有的电脑可以正常播放,有的电脑在网页中播放不了ps:网页中的播放器用的是player.swf解决方案:是由于网页中的播 ...
- Openfire开发配置,Openfire源代码配置,OpenFire二次开发配置(eclipse)
首先去官网把openfire的源码下下来: http://www.igniterealtime.org/downloads/source.jsp 1.下载后放到你的workspace当中,我的woek ...
- 消息系统Kafka介绍 - 董的博客
1. 概述 Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数据.活跃的流式数据在web网站应用中非常常见,这些数据包括网站的pv.用户访问了什么内容,搜索了 ...
- c++中智能输出文件
首先我们要为每一时间步,设置一个文件名: ] = "; itoa(time,timestr,); std::string s; s += timestr; std::string path ...
- 5.迪米特法则(Law Of Demeter)
1.定义 狭义的迪米特法则定义:也叫最少知识原则(LKP,Least Knowledge Principle).如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中的一个类需要 ...
- [效果]JS折叠菜单-使用方法 (Moo.Fx)
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-06-24) 用法: 1.添加JS库 CODE:<script src="prototype.lite.js& ...
- jquery 选择器中含有空格注意
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- COM组件入门(一)
近期须要用到COM组件的知识,看了看COM编程指南,感觉还不错.把我的学习心得记录下来.这是我依据教程写的demo StopWatch接口实现部分,接口部分我的项目是动态库,主要源代码例如以下: 完整 ...
- Android---3种方式限制EditView输入字数(转载)
方法一:利用TextWatcher editText.addTextChangedListener(new TextWatcher() { private CharSequence temp; pri ...
- 如何在 iOS 8 中使用 Swift 实现本地通知(下)
在上集中,我们已经构建了一个简单的待办列表应用(to-do list app),这个应用可以在待办项过期时通过本地通知提醒用户.现在,我们要在之前的基础上添加以下功能:应用图标角标上显示过期待办项的数 ...