您的位置:首页 > 运维架构 > Linux

linux安全之iptables防火墙详解1

2016-08-04 12:00 567 查看
在介绍iptables防火墙之前我们先来了解下IP TCP报文的格式,因为iptables防火墙的规则基本都是根据这些报文中的字段信息来做匹配,所以报文的格式就非常重要了

ip头部信息




抓包信息如下



TCP头部信息如下



抓包信息如下



大家可以对照着图片和抓包对比每个字段的意思,这里理解起来会更方便,好了下面正式开始介绍我们的iptables,先附上图片简单说明下




Iptables/netfiter
Iptables:命令行的编写规则工具
Netfiter:在内核中

链(内置): 相当于5道阀门,对应着上图中的5个方框,这5个链相当重要,大家需要理解清楚
1、PREROUTING 路由之前
2、INPUT
3、FORWARD 转发链
4、OUTPUT
5、POSTROUING 路由之后

功能:
Filter:过滤表
Nat: 网络地址转换表
Mangle:拆解报文,做出修改(例如修改ttl值,增加一个标记等),并重新封装
Raw:关闭nat表上启用的连接追踪功能

优先级:raw-->mangle-->nat-->filter

在上面的表中,平常用的最多的就是INPUT表,其实就是nat表,但是在云计算平台openstack中,如果网络组件neutron用了虚拟化网络技术openvswitch,这四张表都会用到,而且非常复杂,后面我们会简单截图看看

数据流向:及其重要
流入本机:PREROUTING-->INPUT
本机流出:OUTPUT-->POSTROUTING
转发:PREROUTING-->FORWARD-->POSTROUTING

路由功能发生的时刻:
报文刚刚进入本机的那一刻,判断目标主机是?如果是自己就送往INPUT,如果不是自己则送往FORWARD

报文离开本机之前,判断经由哪个接口送往下一站

规则的编写
1、匹配条件
基本匹配条件
扩展匹配条件

2、处理动作
基本处理动作
扩展处理动作
自定义处理机制

Iptables的链:内置链和自定义链
自定义链:用户自定义,用于内置链的扩展和补充,可实现更灵活的规则管理机制
自定义链在云计算平台openstack中大量的用到,因此这里也要引起高度的重视,后面我们会通过一个简单的例子来说明
需要和内置链关联起来,由内置链转发到自定义的链

基本匹配(-s -d -p –I -o)
-I 数据报文流入接口,只能应用于PREROUTING INPUT FORWARD链
-o 数据报文流出接口,只能应用于FORWARD OUTPUT POSTROUING链
-p (tcp, udp, udplite, icmp, esp, ah, sctp or all) 并非指的是应用层的协议

Iptables –t filter –A INPUT –s 172.16.80.1 –d 172.16.80.5 –p icmp –j DROP

iptables -L -n -v --line-numbers 查看规则

扩展匹配:需要加载扩展模块,方可生效 –m选项
隐士扩展:不需要手动加载扩展模块
Tcp --source-port,--sport port[:port] --destination-port,--dport port[:port]
--tcp-flags mask comp --syn --tcp-option number

Iptables –A INPUT –d 172.16.80.5 –p icmp –icmp-type 8 –j DROP 限制别人ping自己

iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
代表要检查的标志位是SYN,ACK,FIN,RST,其中SYN必须置为1,余下的为0

显示扩展:必须要手动加载扩展模块
Multiport扩展
iptables -A INPUT -s 1.1.1.1/24 -d 172.16.80.116 -p tcp -m multiport --dports 22,80 -j ACCEPT
iprange扩展
iptables -A INPUT -d 172.16.80.116 -p tcp --dport 80 -m iprange --src-range 172.16.80.90-172.16.80.95 -j ACCEPT
string扩展
对报文中的应用层数据做字符串模式匹配检测
--algo 字符串匹配算法
--string pattern 要检测的字符串模式
iptables -A OUTPUT -d 172.16.80.116 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT
time扩展
根据报文到达的时间与指定的时间范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
iptables -A OUTPUT -d 172.16.80.116 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun –kerneltz -j DROP

connlimit扩展
根据每客户端IP做并发连接数数量匹配
--connlimit-upto n 连接数量小于等于n时匹配(默认策略要求是DROP)
--connlimit-above n 连接数量大于n时匹配 (默认策略要求是ACCEPT)
iptables -A INPUT -d 172.16.80.116 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

state扩展 (conntrack,在IP层实现)
根据连接追踪机制去检查连接的状态
Conntrack机制:能追踪本机上的请求和响应直接的关系,状态有如下几种
NEW:新发出请求,连接追踪模板中不存在此连接的相关信息条目,因此将其识别为第一次发出的请求
ESTABLISHED:在NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态
RELATED:相关联的连接,如ftp中命令连接与数据连接之间的关系
INVALID:无效的连接

iptables -A INPUT -d 172.16.80.116 -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -d 172.16.80.116 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d 172.16.80.116 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

调整连接追踪功能所能够容纳的最大连接数量
[root@centos01 ~]# cat /proc/sys/net/nf_conntrack_max
31636
[root@centos01 ~]# cat /proc/net/nf_conntrack 已经追踪到的并记录下来的连接

Iptables –Z 清空计数器

最后我们来做一个小实验,自定义链和截图openstack部分规则链,nat表我们以后再来介绍
[root@centos01 ~]# iptables -A INPUT -d 172.16.80.116 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT 对目标主机172.16.80.116只放行22 80端口
[root@centos01 ~]# iptables -P INPUT DROP 更改默认策略是DROP

这时候我们从客户端ping 172.16.80.116是无法通信的



那么我们就来自定义链来放行icmp规则
iptables -N icmp 新定义一个链icmp(名字随便取)
iptables -A icmp -d 172.16.80.116 -p icmp --icmp-type 8 -mstate --state NEW -j ACCEPTiptables -A icmp -j RETURN对自定义的链icmp做默认跳转(即在这个icmp链中没有匹配住的就默认返回到前面关联的链INPUT中去)iptables -A INPUT -j icmp 将自定义的链icmp和内置链INPUT关联起来,这样内置链才会生效

这时我们再来从客户端ping该主机








最后截图openstack相关部分,大家有兴趣自己看看研究下,下篇我们介绍nat部分












内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 安全 iptables