3-8  Linux系统中防火墙的框架简单分析

Netfilter提供了一个抽象、通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统。Netfilter框架包含以下五部分:

  1. 为每种网络协议(IPv4、IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数), 这些钩子函数在数据报流过协议栈的几个关键点被调用。在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架。

  2. 内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何模块对该协议和钩子函数进行了注册。若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查(可能还会修改)该数据包、丢弃该数据包及指示netfilter将该数据包传入用户空间的队列。

  3 .那些排队的数据包是被传递给用户空间的异步地进行处理。一个用户进程能检查数据包,修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数中注入到内核中。

  4. 任何在ip层要被抛弃的ip数据包在真正抛弃之前都要进行检查。例如允许模块检查ip-spoofed包(被路由抛弃)。

  5.IP层的五个HOOK点的位置如下所示 :

  1. NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点(刚刚进行完版本号,校验 和等检测), 源地址转换在此点进行;ip_input.c中IP_rcv调用。

  2. NF_IP_LOCAL_IN:经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行;ip_local_deliver中调用

  3. NF_IP_FORWARD:要转发的包通过此检测点,FORWORD包过滤在此点进行;

  4. NF_IP_POST_ROUTING:所有马上便要通过网络设备出去的包通过此检测点,内置的目的地址转换功能(包括地址伪装)在此点进行;

  5. NF_IP_LOCAL_OUT:本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。

  这些点是已经在内核中定义好的,内核模块能够注册在这些HOOK点进行的处理,可使用nf_register_hook函数指定。在数据报经过这些钩子函数时被调用,从而模块可以修改这些数据报,并向netfilter返回如下值:

  NF_ACCEPT 继续正常传输数据报

  NF_DROP 丢弃该数据报,不再传输

  NF_STOLEN 模块接管该数据报,不要继续传输该数据报

  NF_QUEUE 对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)

  NF_REPEAT 再次调用该钩子函数

  一个基于Netfilter框架的、称为iptables的数据报选择系统在Linux2.4内核中被应用,其实它就是ipchains的后继工具,但却有更强的可扩展性。内核模块可以注册一个新的规则表(table),并要求数据报流经指定的规则表。这种数据报选择用于实现数据报过滤(filter表),网络地址转换(Nat表)及数据报处理(mangle表)。 Linux2.4内核提供的这三种数据报处理功能都基于netfilter的钩子函数和IP表。它们是独立的模块,相互之间是独立的。它们都完美的集成到由Netfileter提供的框架中。

  包过滤

  filter表格不会对数据报进行修改,而只对数据报进行过滤。iptables优于ipchains的一个方面就是它更为小巧和快速。它是通过钩子函数NF_IP_LOCAL_IN, NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架的。因此对于任何一个数 据报只有一个地方对其进行过滤。这相对ipchains来说是一个巨大的改进,因为在ipchains中一个被转发的数据报会遍历三条链。

  NAT

  NAT表格监听三个Netfilter钩子函数:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。 NF_IP_PRE_ROUTING实现对需要转发的数据报的源地址进行地址转换而NF_IP_POST_ROUTING则对需要转发的数据包的目的地址进行地址转换。对于本地数据报的目的地址的转换则由NF_IP_LOCAL_OUT来实现。NAT表格不同于filter表格,因为只有新连接的第一个数据报将遍历表格,而随后的数据报将根据第一个数据报的结果进行同样的转换处理。NAT表格被用在源NAT,目的NAT,伪装(其是源NAT的一个特例)及透明代理(其是目的NAT的一个特例)。

  数据报处理(Packet mangling)

  mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT钩子中进行注册。使用 mangle表,可以实现对数据报的修改或给数据报附上一些带外数据。当前mangle表支持修改TOS位及设置skb的nfmard字段。

  源码分析

  如果我们想加入自己的代码,便要用nf_register_hook函数,其函数原型为:

  int nf_register_hook(struct nf_hook_ops *reg)

  struct nf_hook_ops

  {

  struct list_head list;

  /* User fills in from here down. */

  nf_hookfn *hook;

  int pf;

  int hooknum;

  /* Hooks are ordered in ascending priority. */

  int priority;

  };

  我们的工作便是生成一个struct nf_hook_ops结构的实例,并用nf_register_hook将其HOOK上。其中list项我们总要初始化为{NULL,NULL};由于一般在IP层工作,pf总是PF_INET;hooknum就是我们选择的HOOK点;一个HOOK点可能挂多个处理函数,谁先谁后,便要看优先级,即priority的指定了。netfilter_ipv4.h中用一个枚举类型指定了内置的处理函数的优先级:

  enum nf_ip_hook_priorities {

  NF_IP_PRI_FIRST = INT_MIN,

  NF_IP_PRI_CONNTRACK = -200,

  NF_IP_PRI_MANGLE = -150,

  NF_IP_PRI_NAT_DST = -100,

  NF_IP_PRI_FILTER = 0,

  NF_IP_PRI_NAT_SRC = 100,

  NF_IP_PRI_LAST = INT_MAX,

  };

  hook是提供的处理函数,也就是我们的主要工作,其原型为:

  unsigned int nf_hookfn(unsigned int hooknum,

  struct sk_buff **skb,

  const struct net_device *in,

  const struct net_device *out,

  int (*okfn)(struct sk_buff *));

  它的五个参数将由NFHOOK宏传进去。

  nf_register_hook根据reg中注册的协议簇类型和优先级在nf_hooks中找到相应的位置并插入到此表中。struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS]在netfilter初始化时(netfilter_init/netfilter.c,而它在sock_init时调用)已经初始为一个空表。

  例如iptable在初始化时(init/iptable_filter.c)调用nf_register_hook注册他的hook函数。

  static struct nf_hook_ops ipt_ops[]

  = { { { NULL, NULL }, ipt_hook, PF_INET, NF_IP_LOCAL_IN, NF_IP_PRI_FILTER },

  { { NULL, NULL }, ipt_hook, PF_INET, NF_IP_FORWARD, NF_IP_PRI_FILTER },

  { { NULL, NULL }, ipt_local_out_hook, PF_INET, NF_IP_LOCAL_OUT,

  NF_IP_PRI_FILTER }

  };

  mangle在init/iptable_mangle.c中注册它自己的hook函数。

  static struct nf_hook_ops ipt_ops[]

  = { { { NULL, NULL }, ipt_hook, PF_INET, NF_IP_PRE_ROUTING, NF_IP_PRI_MANGLE },

  { { NULL, NULL }, ipt_local_out_hook, PF_INET, NF_IP_LOCAL_OUT,

  NF_IP_PRI_MANGLE }

  };

  NAT在init/ip_nat_standalone.c中注册它自己的hook函数

  /*包过滤前,更改目的地址*/

  static struct nf_hook_ops ip_nat_in_ops

(0)

相关推荐

  • linux下mysql开启远程访问权限 防火墙开放3306端口

    开启mysql的远程访问权限 默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限. 主流的有两种方法,改表法和授权法. 相对而言,改表法比较容易一点,个人也是比较倾向于使用这种方法,因此,这里只贴出改表法 1.登陆mysql mysql -u root -p 2.修改mysql库的user表,将host项,从localhost改为%.%这里表示的是允许任意host访问,如果只允许某一个ip访问,则可改为相应的ip,比如可以将l

  • 在Linux代理服务器上设置防火墙

    一般而言,实现Linux的防火墙功能有两种策略.一种是首先全面禁止所有的输入.输出和转发数据包,然后根据用户的具体需要逐步打开各项服务功能.这种方式的特点是安全性很高,但必须全面考虑用户所需的各项服务功能,不能有任何遗漏,要求系统管理员清楚地知道实现某种服务和功能需要打开哪些服务和端口.第二种方式是首先默认打开所有的输入.输出数据包,然后禁止某些危险包.IP欺骗包.广播包.ICMP服务类型攻击等:对于应用层的服务,像http.sendmail.pop3.ftp等,可以有选择地启动或安装.这种方式

  • Linux下设置防火墙白名单(RHEL 6和CentOS 7)的步骤

    进入Linux 命令行,编辑防火墙规则配置文件 iptables vi /etc/sysconfig/iptables 下面是一个白名单设置的例子: # Firewall configuration written by system-config-securitylevel # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTP

  • linux防火墙配置教程之允许转发实验(2)

    一.实验目标 在上一次"Linux基础网络搭建实验"中,内.外网虚拟机之所以能Ping通,是因为暂时关闭了防火墙,然而现实中这样操作显然存在很大的安全隐患,所以本次实验在上次实验的基础下,开启防火墙,并配置防火墙规则,使得内.外网虚拟机任然能够Ping通. (Linux基础网络搭建实验:Linux网络搭建基础实验(1) ) 网络拓扑图: 二.实验步骤 1.搭建如图所示的网络(参考"Linux基础网络搭建实验") 2.在网关上开启防火墙,此时内网虚拟机不能Ping通外

  • linux增加iptables防火墙规则的示例

    以下是我的iptables设置 复制代码 代码如下: *filter:INPUT DROP [0:0]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [49061:9992130]-A INPUT -i lo -j ACCEPT   不开启会有很多服务无法使用,开启回环地址-A INPUT -p icmp -j ACCEPT   允许icmp包通过,也就是允许别人ping自己-A INPUT -m state --state RELATED,ESTABLISHED -j

  • Linux系统中防火墙的框架分析

    Netfilter提供了一个抽象.通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统.Netfilter框架包含以下五部分: 1. 为每种网络协议(IPv4.IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数), 这些钩子函数在数据报流过协议栈的几个关键点被调用.在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架. 2. 内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何

  • linux防火墙配置教程之访问外网web实验(3)

    一.实验目标 1.本次实验在"Linux基础网络搭建实验"的基础上,在外网虚拟机上搭建WEB服务,并分别配置外网和网关的防火墙规则,使内网能够访问WEB服务 2.Linux基础网络搭建实验:Linux网络搭建基础实验(1) 3.实验拓扑: 二.实验步骤 1.建立如图所示的网络拓扑结构,内外网联通,网关防火墙也暂时关闭 2.外网测试主机配置 (1)配置本地Yum源(参考:CentOS 6.5配置本地Yum源教程) (2)检查系统是否安装WEB服务器,如有,则启动该服务,如没有,则安装该服

  • linux下防火墙开启某个端口号及防火墙常用命令使用(详解)

    1.永久性生效,重启后不会复原 开启:chkconfigiptables on 关闭:chkconfigiptables off 2.即时生效,重启后复原 重启防火墙 方式一:/etc/init.d/iptables restart 方式二:service iptables restart 关闭防火墙: 方式一:/etc/init.d/iptables stop 方式二:service iptables stop 启动防火墙 方式一:/etc/init.d/iptables start 方式二:

  • Linux中在防火墙中开启80端口方法示例

    linux如果刚安装好防火墙时我们常用的端口是没有增加的,也就是说不能访问,那么要怎么把常用端口增加到防火墙通过状态呢,下面我们以80端口为例子吧. 最近自己在学习Linux.搭建一个LNMP环境.在测试时一切都好.然后重启Linux后.再次访问网站无法打开.最终原因是在防火墙中没有加入 80 端口的规则.具体方法如下: 在CentOS下配置iptables防火墙,是非常必要的.来我们学习如何配置!,其它版本一下: 1.打开iptables的配置文件: 代码如下 vi /etc/sysconfi

  • Linux防火墙配置SNAT教程(1)

    1.实验目标 以实验"防火墙配置-访问外网WEB"为基础,在WEB服务器上安装Wireshark,设置Wireshark的过滤条件为捕获HTTP报文,在Wireshark中开启捕获,在内网测试机上访问WEB服务器,查看捕获结果,再在网关防火墙上设置SNAT,查看捕获结果 (防火墙配置-访问外网WEB:linux防火墙配置教程之访问外网web实验(3) ) 2.SNAT(source network address translation) 源地址转换,其作用是将ip数据包的源地址转换成

  • 关闭selinux(防火墙)方法分享

    刚好手工装完一台CentOS6.4,就顺便记录一下. 复制代码 代码如下: # sestatusSELinux status:                 enabledSELinuxfs mount:                /selinuxCurrent mode:                   enforcingMode from config file:          enforcingPolicy version:                 24Policy

  • 教你将Linux配置为代理防火墙

    Linux本身可以通过添加插座软件包起到代理防火墙的作用,而且,这一切都是免费的. 什么是代理防火墙 代理防火墙不让任何直接的网络流通过,而由它作为Internet和内部网络计算机之间 的中间媒介.防火墙自己处理各种网络服务而不是只让它们直接通过.例如,登录到网络上的计算机请求一个Internet网页.计算机不直接链接到Internet网络服务提供的网页,而是连到自己网络的代理服务器上,代理服务器识别代理请求,然后以合适的方式传递给相应的Internet网络服务器.远程网络服务器视为来自防火墙服

  • Linux防火墙iptables入门教程

    一.关于iptables Iptables是一个基于命令行的防火墙工具,它使用规则链来允许/阻止网络流量.当一条网络连接试图在你的系统中建立时,iptables会查找其对应的匹配规则.如果找不到,iptables将对其采取默认操作.几乎所有的Linux发行版都预装了iptables.在Ubuntu/Debian中更新/安装iptables的命令为: 复制代码 代码如下: sudo apt-get install iptables 现有的一些图形界面软件也可以替代iptables,如Firesta

  • linux查看防火墙状态与开启关闭命令详解

    linux查看防火墙状态与开启关闭命令有以下两种方式: 一.service方式 查看防火墙状态: [root@centos6 ~]# service iptables status iptables:未运行防火墙. 开启防火墙: [root@centos6 ~]# service iptables start 关闭防火墙: [root@centos6 ~]# service iptables stop 二.iptables方式 先进入init.d目录,命令如下: [root@centos6 ~]

  • Linux下防火墙的简单配置与插入规则介绍

    查看当前的防火墙设置 iptables -L INPUT -n --line-numbers 删除一条策略,例如第4行策略 iptables -D INPUT 4 -A:在尾部插入 -I (insert)在指定链中插入一条新规则,为指明插入到第几行 (如:在第七行插入) iptables -I INPUT 7 -p tcp -m state --state NEW -m tcp --dport 81 -j ACCEPT 然后保存 service iptables save 然后重启 servic

  • linux利用CSF防火墙屏蔽恶意请求

    问题 最近不知道为什么,恶意代理的请求数越来越多,明明我返回的都是403Forbidden,但是由于数量实在庞大,还是消耗了我大量的带宽和资源.之前的方法已经没有用了,想了半天还是研究研究防火墙吧,虽然仅仅靠Apache也能对某些IP进行黑名单设置,但是感觉还是有点麻烦的.比如最常见的用iptables,或者是ufw,虽然都能很好的做到管理,但是他们基本都需要一条一条的加,十分麻烦. 网上搜索了下,找到了一个挺方便的小工具–CSF(ConfigServer & Security Firewall

  • linux下mysql链接被防火墙阻止的解决方法

    vi /etc/sysconfig/iptables 在后面添加 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT service iptables restart 发现还是不行 最终发现记录要添加在 -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT 这一条前面 再次重启 OK

  • 阿里云linux服务器安全设置(防火墙策略等)

    首先需要进行linux的基础安全设置,可以先参考这篇文章 http://www.jb51.net/article/94842.htm 1.Linux系统脚本 #!/bin/bash ######################################### #Function: linux drop port #Usage: bash linux_drop_port.sh #Author: Customer Service Department #Company: Alibaba Clo

随机推荐