#####################################
基础原理
实战练习之隐式规则
实战练习之显式规则
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
优先级次序为
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的本职工作不是对数据流进行过滤而是对数据流进行分类。它使用模式匹配算法把进入设备的数据包应用层内容与事先定义好的协议规则进行比对,如果匹配成功就说明这个数据包属于某种协议。
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 �Cs 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 �CC /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 流控系统,支持透明网桥、旁路监听两种工作模式。透明网桥模式同时具备流量分析及控制功能;旁路监听模式仅具备流量分析功能。如设备具备多个网络接口,也可同时启用网桥和旁路监听,此种模式在实际环境中应用场景不多,不做详细介绍。以下是最普遍的透明网桥模式的部署拓扑及说明,以一路网桥(一进一出)为例:
注:Panabit 透明地串接在核心交换机与路由器之间,内网口接核心交换机,外网口接路由器;网桥上无需配置 IP 地址,仅相当于一条网线,无需改变原有拓扑和网络设置;内外网线全部连通后,0.5 配置界面图中的数据接口状态将显示为“正常”,此时网络恢复畅通。将管理口连接到核心交换机,从内网可以访问到管理地址,至此 Panabit 流控系统的上线工作完成。
配置过程请参考
http://www.panabit.com/free2/panabit_v1006_manual.pdf
本文出自 “星矢” 博客,转载请与作者联系!