Linux 的防火墙

2015-06-23 Tuesday     linux , network

Linux 防火墙是由 Netfilter 和 iptables 两个组件组成,其中前者在内核空间中;后者是一个用户程序,用于插入、修改和删除相应的防火墙规则。

通过 Netfilter+iptables 可以实现数据包过滤、网络地址转换和数据报文处理等功能。

Netfilter 简介

Netfilter 框架用来在网络协议栈的内核路径上过滤数据包,就像一条路上的关卡,一个数据包在被处理的路径上在经过这些关卡时会被检查,如果符合条件就进行处理,结果就是若干个动作,包括接受、丢弃、排队、导入其它路径等。

框架只需针对一个数据包得出一个结果即可,关卡内部提供什么服务在Netfilter框架中并没有任何规定。

Netfilter 是一个设计良好的框架,之所以说它是一个框架是因为它提供了最基本的底层支撑,而对于实现的关注度却没有那么高,这种底层支撑实际上就是其 5 个 HOOK 点。

各个 hook 点其实就是固定的“检查点”,这些检查点是内嵌于网络协议栈的,它将检查点无条件的安插在协议栈中,这些检查点的检查是无条件执行的。

netfilter

如上图所示,Netfilter 包括了五个检查节点。

  1. PREROUTING:报文进入网络层但是还未到达路由前
  2. FORWARD:报文经过路由后,确定需要转发之后
  3. INPUT:报文经过路由之后,确定要本地接收之后
  4. OUTPUT:本地数据包发送
  5. POSTROUTING:数据包通过本机马上发出去之前

在内核中,通过如下的宏定义。

#define NF_IP_PRE_ROUTING   0
#define NF_IP_LOCAL_IN      1
#define NF_IP_FORWARD       2
#define NF_IP_LOCAL_OUT     3
#define NF_IP_POST_ROUTING  4

iptables

该工具在 CentOS 中是默认安装,如果没有可以通过 yum install iptables 安装。

示例

关于添加、除去、编辑规则的命令的一般语法如下。

iptables [-t table] command [chain] [match] [target]

----- command,指定管理规则的方式,如插入、增加、删除以及查看等
-A, --append  该命令将一条规则附加到链的末尾
-L, --list    列出指定链中的所有规则,默认查看filter表,要查看NAT表,可加上-t NAT参数

----- match,条件匹配分为基本匹配和扩展匹配,拓展匹配又分为隐式扩展和显示扩展
-p  指定规则协议,如tcp, udp,icmp等,可以使用all来指定所有协议
-s  指定数据包的源地址参数,可以使IP地址、网络地址、主机名
-d  指定目的地址
-i  输入接口
-o  输出接口

常用操作

首先是查看当前的记录,默认查看的是 filter 表,如果要查看 NAT 表,可以加上 -t nat 参数。

# iptables --line-number -nvL POSTROUTING -t nat

如上参数包括:
   -n    不对IP进行反查,显示速度会快很多
   -v    输出详细信息,包括通过该规则的数据包数量、总字节数、相应的网络接口
   --line-number   显示规则的序列号,这个参数在删除或修改规则时会用到

添加规则有两个参数:1) -A 添加到规则的末尾;2) -I 插入到指定位置,默认插入到规则的首部。

----- 添加一条规则到尾部
# iptables -A INPUT -s 192.168.1.5 -j DROP

----- 插入一条规则到第三行
# iptables -I INPUT 3 -s 192.168.1.3 -j DROP

结下来可以通过如下方式删除。

----- 删除之前添加的规则
# iptables -D INPUT -s 192.168.1.5 -j DROP

----- 如果规则太长,直接通过行号删除,如下删除第2行
# iptables -D INPUT 2

接下来看看如何修改规则。

----- 接下来先查找对应的规则号
# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       all  --  192.168.1.1          0.0.0.0/0

----- 然后将第一条规则改为ACCEPT
# iptables -R INPUT 1 -j ACCEPT

持久化保存

设置完成之后,可以直接通过 iptables-save 保存为文件,默认打印到 stdout 中。

----- RHEL/CentOS
# iptables-save > /etc/sysconfig/iptables
# iptables-restore < /etc/sysconfig/iptables
----- Debian/Ubuntu
# iptables-save > /etc/iptables/rules.v4
# iptables-restore < /etc/iptables/rules.v4

注意,如果使用了 IPv6 则对应 ip6tables-save 命令以及 /etc/iptables/rules.v6/etc/sysconfig/ip6tables

常用实例

下面是常用的示例。

----- 允许访问22端口,如果需要拒绝访问,则将ACCEPT改为DROP即可
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
----- 允许192.168.1.123访问本机的1521端口
# iptables -I INPUT -s 192.168.1.123 -p tcp --dport 1521 -j ACCEPT
-A INPUT -s 192.30.19.82/32 -p tcp -m tcp --dport 21005 -j ACCEPT
----- 在指定位置插入,如果时-A参数则是在末尾添加
# iptables -I INPUT 3 -p tcp -m tcp --dport 20 -j ACCEPT

----- 添加NAT规则,对192.168.10.0/24进行地址伪装
# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

----- 查看filter表规则,显示编号,常用于删除
# iptables -L -n --line-number
----- 查看NAT表规则
# iptables -t nat -vnL POSTROUTING --line-number

----- 修改规则,改为DROP
# iptables -R INPUT 3 -j DROP

----- 删除input的第3条规则
# iptables -D INPUT 3
----- 删除nat表中postrouting的第一条规则
# iptables -t nat -D POSTROUTING 1
----- 清空filter表INPUT所有规则
# iptables -F INPUT
----- 清空所有规则
# iptables -F
----- 清空nat表POSTROUTING所有规则
# iptables -t nat -F POSTROUTING

---- 设置filter表INPUT默认规则是DROP
# iptables -P INPUT DROP

其它

目前除了 iptables 之外,还有 nf-hipac 。曾经有网友测试过,nf-hipac 比 iptables 优化的不是一星半点,而且前者在加载 20000 个条目时,使用 iperf 的测试结果基本根裸奔相差无几。不过该项目基本已经停滞,现在是通过 ipset 替换之 ^_^

目前有个 Netfilter 的项目,用来取代现有的 {ip,ip6,arp,eb}tables 等工具,不过现在还在开发过程中。

另外,内核中提供了 BPF (BSD Packet Filter) 支持,包括现在的 tcpdump 等程序,都是使用的这一规则。据说,其速度是 iptables 的几倍,采用综合状态机、JIT,可以在很短的时间内完成数据包的匹配判断,可以参考 eBPF: One Small Step



如果喜欢这里的文章,而且又不差钱的话,欢迎打赏个早餐 ^_^


About This Blog

Recent Posts

Categories

Related Links

  • RTEMS
    RTEMS
  • GNU
  • Linux Kernel
  • Arduino

Search


This Site was built by Jin Yang, generated with Jekyll, and hosted on GitHub Pages
©2013-2019 – Jin Yang