#####################################

基础原理

实战练习之隐式规则

实战练习之显式规则

SNAT

DNAT

iptables七层过滤

Panabit

#####################################

基础原理

防火墙的定义

   工作在主机或网络的边缘,对于进出的数据报文按照事先定义好的规则中的标准进行检查,一旦符合标准随后便采取此规则定义的处理动作的机制称作防火墙。


Linux防火墙iptables

分别由位于内核空间的netfilte和用户空间的iptables组合

netfilter Frame

iptables 数据报文过滤,NAT,mangle等规则生成的工具

数据包进入linux主机有可能会进过5个过滤点,这五个过滤点又称为hook function(钩子函数),他们分别是:

input;output ;forward;prerouting;postrouting

每一个钩子函数上都可以有多条规则,叫做规则链。因此有五个规则链:

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

iptable可以定义4类规,这里规则中可以由不同的链构成,因此这个表分别是:

filter(过滤)表

INPUT

OUTPUT

FORWARD

nat(地址转换)表

PREROUTING

POSTROUTING

mangle(拆开、修改、封装)表

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

raw(还原原始)表

PREROUTING

OUTPUT

Iptables_iptables

优先级次序为

raw-mangle-nat-filter

基本语法

iptabels [-t table] common chain [num] 匹配标准-j 处理办法

管理规则

-A 附加一条规则,在链的尾部

-I chain [num] 插入一条规则,插入为对应chain上的第几条,如果省略则表示插入为第一条

-Dchain [num] 删除制定链中第num条规则,如果省略表示删除第一条

-Rchain [num] 替换指定的规则

管理链

-F [chain] 清空制定规则链,如果省略chain,则可以实现删除对应表中的所有链

-P chain 设置制定链的默认策略

-N 自定义一个新的空链

-X 删除一个自定义的空链

-Z 置零制定链中所有规则的计数器

-E 重命名自定链

查看类

-L 显示制定表中的所有规则

-n 以数据格式显示主机地址和端口号

-v 显示详细信息

-vv

-x 显示计数器的精确值

--line-numbers 显示规则号码

iptables不是服务,但有服务脚本,服务脚本的主要作用在于生效保存的规则,因为规则在内核空间的内存之中,重启就没有了。

iptables停止服务的过程就是移除这些模块的过程,脚本作用主要是完成装载及移除iptables/netfilter相关的内核模块

iptables_net iptables_filter iptables_mangle iptables_raw ip_nat ip_conntrack

lsmod | grep ip查看相关功能模块



实战练习之隐式规则

放行本机192.168.1.190 ssh服务被192.168.1.0/24访问

iptables -t filter -A INPUT -s 192.168.1.0/24 -d 192.168.1.190  -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.1.190 -d 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

127.0.0.1的icmp只对自己放行(为了更加可靠,-i 制定interface为回环口)

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT

iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT

本机可以ping通外面

iptables -A OUTPUT -s 192.168.1.190 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 192.168.1.190 -p icmp --icmp-type 0 -j ACCEPT

生成环境中httpd访问量肯定比ssh多,所以放在第一个

iptables -I INPUT -d 192.168.1.190 -p tcp --dport 80 -j ACCEPT
iptables -I OUTPUT -s 192.168.1.190 -p tcp --sport 80 -j ACCEPT
iptables -L -n -v

DNS为本地客户端解析(有可能会转发)还有tcp,所有需要8条规则

iptables -A INPUT -d 192.168.1.190 -p udp --dport 53 -j ACCEPT
客户机请求进来
iptables -A OUTPUT -s 192.168.1.190 -p udp --sport 53 -j ACCEPT
服务端解析返回
iptables -A OUTPUT -s 192.168.1.190 -p udp --dport 53 -j ACCEPT
服务端递归找根
iptables -A INPUT -d 192.168.1.190 -p udp --sport 53 -j ACCEPT
根返回结果给DNS服务器


实战练习之显式规则

-m state 状态追踪

NEW 新连接请求

ESTABLISHED 已建立的连接

NVALID 非法连接请求

RELATED 相关联的(ftp命令连接中的命令激活的另一个连接)

放行sshd出去一定是对进来包的响应。

iptables -A INPUT -d 192.168.1.190 -p tcp --dport 22 -m state NEW,ESTABLISHED -j ACCEPT
(此时ip_conntrack会自动加载)
iptables -A OUTPUT -s 192.168.1.190 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
(此时22号端口出去的必须是响应报文)

放行别人ping自己,并且自己只允许回应的包是响应的包。

iptables -A INPUT -d 192.198.1.190 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.190 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT

ip_conntrack追踪可以优化OUTPUT链,以后只限定INPUT,OUT使用一条即可,可以提高规则检测效率

iptables -A OUTPUT -s 192.168.1.190 -m state --state ESTABLISHED -j ACCEPT

FTP放行(状态追踪)

修改配置文件 /etc/sysconfig/iptables-config

IPTABLES_MODULES = "ip_nat-ftp ip_conntrack_ftp"指明加载模块

ip_nat-ftp ip_conntrack_ftp

iptables -A INPUT -d 192.168.1.190 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
命令连接
iptables -A INPUT -d 192.168.1.190 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
命令连接中的命令关联
iptables -A OUTPUT -s 192.168.1.190 -m state --state ESTABLISHED,RELATED -j ACCEPT
数据连接出口

条目优化

(SHH、HTTP等服务多数都是ESTABLISHED,只有FTP多数是ESTABLISH、RELATED,为了优化INPUT链匹配性能可以如下)

iptables -I INPUT -d 192.168.1.190 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

FTP SSH HTTP 范例如下:

(FTP注意修改配置文件修改配置文件 /etc/sysconfig/iptables-config IPTABLES_MODULES = "ip_nat-ftp ip_conntrack_ftp"指明加载模块)

-A INPUT -d 192.168.1.190 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -d 192.168.1.190 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
-A OUTPUT -s 192.168.1.190 -m state --state ESTABLISHED -j ACCEPT

multiport 离散的多端口匹配扩展

--source-ports

--destination-ports

--ports

iptables -I INPUT 2 -d 192.168.1.190 -p tcp -m multiport --destination-ports 21,22,80  -m state --state NEW -j ACCEPT

iprange 范围地址[支持取反]

[!] --src-range

[!] --dst-range

iptables -A INPUT -p tcp -d 192.168.1.190 -p tcp -m iprange --src-range 192.168.1.200-192.168.1.250 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

connlimit 连接数限制

[!] --conlimit-above num同一个IP地址并发最大请求数(当默认策略为DROP的时候需要配合取反使用)

iptables -A INPUT -d 192.168.1.190 -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT
某个IP的并发连接低于2个就允许
iptables -A INPUT -d 192.168.1.190 -p tcp --dport 80 -m connlimit  --connlimit-above 2 -j  DROP
等同上面含义(当默认策略为DROP时候推荐上面那种用法)

limit

--limitRATE 时间速率限定(但第一次请求并发量满了,时间速率就会生效)

--limit-burst 第一批请求到达响应数量 (如果不写,默认为5)

iptables -A INPUT -d 192.168.1.190 -p icmp -icmp-type 8 -m limit --limit 6/minute -j ACCEPT
第一批并发请求响应数量为5个,
iptables -R OUTPUT 1 -s 192.168.1.190 -m state --state RELATED,ESTABLISHED -j ACCEPT
修改是因为之前是tcp协议

string字符串过滤

--algo {bm|kmp}

--string "STRING"

iptables  -I INPUT -d 192.168.1.190 -m string --algo kmp --string "sex" -j REJECTURI
中包含sex的字符被拒绝
iptables  -I OUTPUT -s 192.168.1.190 -m string --algo kmp --string "sex" -j REJECT
页面内容中有sex的字符不给予回应iptabls

-N自定义链

被引用链不能使用X删除,链中有规则也不能使用X直接删除,只有空链可以使用X删除

iptables -N clean_in
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptables -A clean_in -d 192.168.1.255 -p icmp -j DROP
iptables -A clean_in -p tcp ! --syn  -m state --state NEW -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 192.168.1.190 -j RETURN
iptables -I INPUT -j clean_in      引用自定义链

利用 recent模块抵御DOS攻击

ssh远程连接(可以引用链clean_in之后)

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
单个IP 并发请求数  不是必须加的
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP



SNAT

--to-source MASQUERADE 动态捕获外网地址

内部维护着NAT会话池,记录那些经过SNAT的报文,到报文回到NAT服务上,源地址是公网客户端请求地址,目标地址是内网客户端

所以说SNAT在数据包回来的时候也会根据NAT会话池做DNAT转换,把目标地址转换为发起请求道公网的那台客户端的IP地址

而TCP报文的序列号确保了DNAT过程中内网客户端的唯一性(NAT会话表),DNAT是自动进行的。

而转换是在出口网卡时候进行,所以当然是postrouting,或者OUTPUT而不是prerouting

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 220.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j SNAT --to-source 220.1.1.1
只有从ppp0流出的才做NAT会话记录

当服务器收到来自于192.168.1.0网段的用户的请求报文,都做源地址转换并转换为220.1.1.1并发出去,但是又想拒绝内网向外网发出的ping包

iptables -A FORWARD -s 192.168.1.0/24 -p icmp -j REJECT


把FORWARD默认策略修改为DROP之后如何放行httpd请求,还有ping协议,如果是FTP请确保启动ip_nat-ftp模块并且把第一条改为ESTABLISH,RELATED

iptables -P FORWARD DROP
iptables -A FORWARD -m -state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -AFORWARD -s 192.168.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
回应的包会被第一条ESTABLISHED匹配到,所以没有必要添加type 0
iptables -AFORWARD -s 192.168.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT



DNAT

因为外网的请求到达服务器公网网卡,所以必须立刻转换目标IP才能通过路由机制通过另一块内网网卡转送至内网服务器上

所以把内网的服务器发布出去,应该prerouting,否则因为目标地址是本机就会自己送到本机内部。

并且内网服务器网管必须指向NAT服务器内网网卡,如果直接回应给他源地址就不是NAT服务器公网地址了,外网用户发现不是同一条连接,没办法处理。

内网服务器响应报文目标IP应该外网请求用户的IP,当回应报文到达NAT服务器内网网卡时候会自动进行SNAT转换,把源IP从内网服务器变为NAT服务器的公网IP地址,然后送至客户端。

可见不仅SNAT用到了DNAT,DNAT的过程也用到了SNAT(这个过程是自动的)

iptables -t nat -A PREROUTING -d 192.168.1.190 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.20 [-p tcp --dport80]
前者是公网IP地址,后者是内网WEB服务器

DNAT做FTP的时候,由于FTP服务器的端口是变化的,所以无法提前预测, 以上只要请求80端口的时候才转发,因此DNAT要写清楚。


PNAT

另外也可以映射到内网不同的端口,比如80映射到内部的8080,如下:

iptables -t nat -A PREROUTING -d 192.168.1.190 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.20:8080

string过滤(网关)

-iptables -A FORWARD -m string --alog kmp --string "h7n9" -j DROP



iptables七层过滤

在Linux的防火墙体系Netfilter下有一个独立的模块L7 filter 。从字面上看Netfilter是对网络数据的过滤,L7 filter是基于数据流应用层内容的过滤。不过实际上 L7 filter的本职工作不是对数据流进行过滤而是对数据流进行分类。它使用模式匹配算法把进入设备的数据包应用层内容与事先定义好的协议规则进行比对,如果匹配成功就说明这个数据包属于某种协议。

L7 filter是基于数据流工作的,建立在Netfilter connstrack功能之上。因为一个数据流或者说一个连接的所有数据都是属于同一个应用的,所以L7 filter没有必要对所以的数据包进行模式匹配,而只匹配一个流的前面几个数据包 (比如10个数据包)。当一个流的前面几个数据包包含了某种应用层协议的特征码时 (比如QQ),则这个数据流被L7 filter识别;当前面几个数据包的内容没有包含某种应用层协议的特征码时,则L7 filter放弃继续做模式匹配,这个数据流也就没有办法被识别,L7 filter所支持的协议如下图所:

1、给内核打补丁,并重新编译内核

# tar zxvf  linux-2.6.28.10.tar.gz  -C  /usr/src
# tar zxvf  netfilter-layer7-v2.22.tar.gz  -C  /usr/src
# cd /usr/src
# ln –s  linux-2.6.28.10  linux
# cd /usr/src/linux/
# patch -p1  <  ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
# cp /boot/config-2.6.18-164.el5  /usr/src/linux/.config
# make  menuconfig
#####################编译时用的选项#######################
Networking support → Networking Options →Network packet filtering framework →Core Netfilter Configuration
<M>  Netfilter connection tracking support
<M>  “layer7” match support
<M>  “string” match support
<M>  “time”  match support
<M>  “iprange”  match support
<M>  “connlimit”  match support
<M>  “state”  match support
<M>  “conntrack”  connection  match support
<M>  “mac”  address  match support
<M>   "multiport" Multiple port match support
#####################编译时用的选项#######################
Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration
<M> IPv4 connection tracking support (required for NAT)
<M>   Full NAT
    <M>     MASQUERADE target support                                                              
    <M>     NETMAP target support                                                          
    <M>     REDIRECT target support
# make
# make modules_install
# make install
# vim /etc/grub.confg
    default=0
#chkconfig iptables off
#shutdown -r now

2、给iptables源码打补丁,并重新编译iptables

# cp /etc/init.d/iptables ~/iptables
# cp /etc/sysconfig/iptables-config ~/
# rpm  -e  iptables-ipv6  iptables  iptstate  --nodeps
# tar jxvf iptables-1.4.6.tar.bz2 –C  /usr/src
# cd /usr/src/iptables-1.4.6
# cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.*   ./extensions/
# ./configure  --prefix=/usr  --with-ksource=/usr/src/linux
# make
# make install
# vim ~/iptables                修改路径 前面加上/usr
    if [ ! -x /usr/sbin/$IPTABLES ]; then
    echo -n $"/usr/sbin/$IPTABLES does not exist."; warning; echo
# mv ~/iptables  /etc/rc.d/init.d/  添加服务脚本
# chkconfig --add iptables      开机启动
# service iptables start
# cp iptables-config  /etc/sysconfig/   还原之前设置

3、安装l7proto

# tar zxvf l7-protocols-2009-05-28.tar.gz   应用层协议的特征码
# cd l7-protocols-2009-05-28
# make install
# /etc/l7-protocols/protocols           此目录中文件代表所支持的协议

4、利用l7-protocols提供的协议的特征码过滤qq、xunlei等应用……

防火墙

192.168.1.190 内部地址

220.1.1.10 外部地址

iptables -A nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 220.1.1.10
    内部用户通过SNAT上网
iptables -A FORWARD -s 192.168.1.0/24 -m layer7 --l7proto qq -j DROP
    过滤应用层qq协议转发包
iptables -A FORWARD -s 192.168.1.0/24 -m layer7 --l7proto xunlei -j DROP
    过滤应用层xunlei协议转发包

控制上网时间

-m time

--datestart --datestop

--timestart --timestop

iptables -A FORWARD -s 192.168.1.10/24-m time--timestart 08:10:00--timestop 12:00:00 -j DROP
iptables -A FORWARD -s 192.168.1.10/24-m time--timestart 14:30:00--timestop 18:20:00 -j DROP

总结:虽然L7 filter不是对所有的数据包进行模式匹配,只匹配一个流的前面几个数据包 ,但检测的层次越深性能必然会下降,如果想把这种功能独立出去,可以使用Panabit。


Panabit

Panabit 应用层流量分析及控制系统。Panabit 流控是一款真正意义上的应用层级流控产品,基于连接过程和协议特征识别,对于加密协议采用主动探测引擎,经过一套完整的识别流程,准确识别应用,精确定位具体的软件客户端,把宽带网络的应用可视化和可管理提高到一个新的阶段。Panabit 流控系统能帮助宽带运营网络管理人员实时了解网络应用流量状态及应用概况,通过策略进行灵活可控的流量管理,提升网络运行效率。

其次有专门的团队跟踪研究互联网应用变化,采用抓包的方法不断收集分析协议样本,利用自主开发、描述能力强的“协议特征描述语言”—PSDL(Protocol Signature Description Language),维护协议特征库,快速提供给用户升级。Panabit流控系统,正常 3 个月升级一次版本,1 个月升级一次协议特征库。升级了特征库,将有更多的协议被识别,降低未知流量的比例。

Panabit 流控系统,支持透明网桥、旁路监听两种工作模式。透明网桥模式同时具备流量分析及控制功能;旁路监听模式仅具备流量分析功能。如设备具备多个网络接口,也可同时启用网桥和旁路监听,此种模式在实际环境中应用场景不多,不做详细介绍。以下是最普遍的透明网桥模式的部署拓扑及说明,以一路网桥(一进一出)为例:

Iptables_iptables_02


注:Panabit 透明地串接在核心交换机与路由器之间,内网口接核心交换机,外网口接路由器;网桥上无需配置 IP 地址,仅相当于一条网线,无需改变原有拓扑和网络设置;内外网线全部连通后,0.5 配置界面图中的数据接口状态将显示为“正常”,此时网络恢复畅通。将管理口连接到核心交换机,从内网可以访问到管理地址,至此 Panabit 流控系统的上线工作完成。

配置过程请参考

http://www.panabit.com/free2/panabit_v1006_manual.pdf

Iptables_iptables_03

Iptables_iptables_04