以下这是是我学生时代在达内培训并且结合网上的一些资料做的学习笔记,和大家分享下
1. 什么是防火墙
1.1简介
1)防火墙是一道保护性的安全屏障,起保护,隔离的作用,Iptables是linux/unix自带的基于包过滤的防火墙工具
2)可以对流入和流出服务器的数据包进行很精细的控制。特别是它可以在一台低配置的服务器上跑的非常好。
3)Iptables主要工作在OSI七层的二、三、四层,如果重新编译内核,iptables也可以支持7层控制(squid代理+iptables)
1.2分类
1)根据保护对象分为主机防火墙,网络防火墙
2)根据载体分为硬件防火墙,软件防火墙
3)软件防火墙又分为应用层防火墙,网络层防火墙,Linux包过滤防火墙就是网络层防火墙
1.3优化
1)尽可能不给服务器配置外网ip,通过代理转发,在内网直接关闭防火墙
2)在外网ip的环境,并发不是特别大情况,可以开启防火墙
如果并发特别大,iptables会影响性能,需要使用防火墙
2.包过滤防火墙
2.1防火墙称呼
2.1.1netfilter
1)位于linux内核中的包过滤功能体系,称为linux防火墙的“内核态”;
2.1.2Iptables
1)位于/sbin/iptables,管理规则的工具,称为linux防火墙的“用户态”。
注意:两种称呼都可指linux防火墙,用后者居多
2.2iptables 管理结构
2.2.1图示
2.2.2容器
1)容器是包含或者属于的关系
2)iptables是表的容器,iptables包含4个表filter、nat、mangle、raw表。
raw 表:确定是否对数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包的源/目标地址或端口
filter表:确定是否放行该数据包
3)Iptables的表又是链的容器,包含5个链input、output、forward、prerouting、postrouting
2.3规则表解析
2.3.1filter表
Filter表 | 强调:主要和主机自身有关,真正负责防火墙功能的(过滤流入流出主机的数据包)。Filter表是iptables默认使用的表。这个表定义了三个链(Chains) 企业工作场景:主机防火墙 |
|
INPUT | 负责过滤所有目标地址是本机地址的数据包。通俗的讲,就是过滤进入主机的数据包 | |
FORWARD | 负责转发流经主机的数据包。起转发作用,和Nat关系很大,LVS NAT模式。Net.ipv4.ip_forward=0 | |
OUTPUT | 处理所有源地址是本机地址的数据包,通俗的讲,就是处理从主机发出去的数据包 |
强调:对于filter表的控制是我们实现主机防火墙功能的重要手段,特别是推INPUT链的控制
2.3.2nat表
Nat表: | 负责网络地址转换,即来源与目的ip地址和port的转换。应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关。应用:和主机本身无关。一般用于局域网共享上网或者特殊的端口转换服务相关。 NAT功能一般企业工作场景 1) 用于做企业路由(zebra)或网关(iptables),共享上网(POSTROUTING) 2) 做内网外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务。(PREROUTING) 3) Web,单个端口的映射,直接映射80端口(PREROUTING) 这个表定义了三个链(Chains),nat功能就相当于网络的acl控制,和网络交换机acl类似 |
|
OUTPUT | 和主机发出去的数据包有关。改变主机发出数据包的目标地址 | |
PREROUTING | 在数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等。(通俗比喻,就是收信时,根据规则重写收件人的地址。例如:把公网IP:112.113.211.12映射到局域网的10.0.0.9服务器上,如果是web服务,可以把80转为局域网服务器上的9000端口) | |
POSTROUTING | 在数据包离开防火墙时进行判断之后执行的规则,作用改变数据包的源地址、源端口等。(通俗比喻,就是寄信时,写好发件人的地址,要让人家回信时能够有地址可回。例如:我们现在的笔记本和虚拟机都是192.168.0。0/24,就是出网的时候被我们企业路由器把源地址改成了公网地址了。生产应用:局域网共享上网) |
2.3.3mangle表
Mangle表 | 主要负责修改数据包中特殊的路由标记,如TTL,TOS,MARk等。这个表定义了5个链(Chains): | |
INPUT | ||
FORWARD | ||
OUTPUT | ||
PREROUTING | ||
POSTROUTING | ||
由于这个表与特殊标记有关,一般情况下,我们用不到这个mangle表。新手学习时最好抓住一个主线向前学,能跑通路就好,不一定要面面俱到,不然很容易陷进去而苦恼,甚至失去学习兴趣 |
2.4规则链解析
链的用途:存放一条条防火墙规则
链的分类依据:处理数据包的不同时机
默认包括5种规则链
INPUT:处理入站数据包
OUTPUT:处理出站数据包
FORWARD:处理转发的数据包
POSTROUTING:路由选择之后处理
PREROUTING:路由选择之前处理
2.5规则匹配过程
2.6包过滤匹配流程
规则表之间的顺序
1) 防火墙是层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2) 如果匹配上规则,即明确表明是阻止还是通过,数据包就不再往下匹配新规则了
3) 如果所有规则中没有明确表明是阻止还是通过,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过,若无任何匹配,则按该链的默认策略处理
4) 防火墙默认规则是对应链的所有的规则执行完才会执行的。
3.iptables基本管理
3.1基本用法
1)管理程序位置:/sbin/iptables
2)指令组成:iptables [-t表名] 选项 [链名] [条件] [-j目标操作]
Iptables –t filter –I INPUT –p icmp –j REJECT
3)可以不指定表,默认为filter表
可以不指定链,默认为对应表的所有链
除非设置默认策略,否则必须指定匹配条件
选项/链名/目标操作用大写字母,其余都小写
3.2基本的目标操作
ACCEPT:允许通过/放行
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志,然后传给下一条规则
3.3常用的管理选项
3.4规则管理示例
3.4.1添加
-A追加、-I插入
iptables –t filter –A INPUT –p tcp –j ACCEPT
iptables –I INPUT –p udp –j ACCEPT //数字代表第几行
iptables –I INPUT 2 –p icmp –j ACCEPT //-p协议名或协议号
3.4.2查看
iptables –nL INPUT
iptables –L INPUT --line-numbers
3.4.3删除、清空
-D删除、-F清空
iptables –D INPUT 3
iptables –F
iptables –t nat –F
iptables –t mangle –F
iptables –t raw –F
iptables –X //清空自定义的链
iptables –Z //计数器清零
3.4.4设置默认规则
所有链的初始默认规则均为ACCEPT
通过-P选项可重置默认规则 ACCEPT或者DROP
iptables –t filter –P INPUT DROP
iptables –t filter –nL | head -1
4filter表控制
4.1防护类型
1)主机/网络型防护
根据保护对象(主机、其它主机)区分
2)开启内核的IP转发
作为网关、路由的必要条件
sysctl –w net.ipv4.ip_forward=1 或者 echo 1 > /proc/sys/net/ipv4/ip_forward
3)基本的匹配条件
通用匹配:可直接使用,不依赖于其它条件或拓展,包括网络协议、IP地址、网络接口等条件
隐含匹配:要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件
4.2防护条件
基本的匹配条件,需要取反条件时,用叹号!
4.3过滤规则示例
4.3.1封禁IP地址/网段
1)主机防护,针对入站访问的源地址
iptables -A INPUT -s 192.168.4.120 -j DROP
iptables -A INPUT -s 10.0.10.0/24
iptables –A iNPUT ! –s 192.168.0.36 –j DROP //除了36都封掉
2)网络防护,针对转发访问的源地址
iptables -A FORWARD -s 192.168.0.0/16 -i eth1 -j DROP
iptables -A FORWARD -s 172.16.0.0/16 -i eth1 -j DROP
4.3.2限制对指定服务端口的访问
1)保护特定网络服务
iptables -A INPUT -s 192.168.168.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 220.181.78.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT ! -s 192.168.168.0/24 -p tcp --dport 20:21 -j DROP //连续的端口范围以冒号分割
注意:指定端口的时候,协议不能用all,要指定确切协议,如tcp
4.3.3禁ping相关策略处理
1)允许本机ping其它主机,但是,禁止其它主机ping本机
iptables -A INPUT -p icmp -icmp-type echo-request -j DROP
iptables -A INPUT -p icmp ! -icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp -icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp ! -icmp-type echo-request -j DROP
2)这个网段都不能ping主机
iptables –I INPUT –p icmp –icmp-type 8 –i eth0 –s 10.0.0.0/24 –j DROP
3)这个网段除了icmp协议都丢弃
Iptables –I INPUT ! –p icmp –icmp-type 8 –i eth0 –s 10.0.0.0/24 –j DROP
4.3.4TCP标记细分控制
1)禁止入站的SYN请求包(第一次握手),检查4个标记位,其中SYN位被设置
放行入站访问的其它数据包
iptables -A INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK,FIN SYN -j DROP
iptables -A INPUT -i eth1 -p tcp ! --syn -j ACCEPT
4.4iptables状态匹配
4.4.1扩展条件必要性
1)如何匹配一个连续的IP地址范围?
2)如何匹配多个不连续端口?
3)同一次连接的多个包,如何提高匹配效率?
4.4.2扩展条件的方法
1)前提条件:有对应的防火墙模块支持
2)基本方法:-m 扩展模块 --扩展条件 条件值
3)示例:-m mac –mac 00:0c:20:23:12:BE
4)常见的拓展条件类型
4.4.3网络连接的五种状态
NEW,请求建立连接的包、完全陌生的包
ESTABLISHED,将要或已经建立连接的包
RELATED,与已知某个连接相关联的包
INVALID,无对应连接,以及连接无效的包
UNTRACKED,未跟踪的包
4.4.4状态匹配规则示例
1)丢弃陌生的TCP响应包
比如,防止反射/反弹式攻击
iptables -A INPUT -m state --state NEW -p tcp ! --syn -j DROP
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
2)识别FTP数据连接
针对FTP被动模式,数据端口未知
iptables -A FORWARD -d 192.168.4.205 -p tcp -dport 20:21 -j ACCEPT
iptables -A FORWARD -s 192.168.4.205 -p tcp -sport 20:21 -j ACCEPT
iptables -A FORWARD -d 192.168.4.205 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.4.205 -m state --state ESTABLISHED,RELATED -j ACCEPT
3)保护内部网络的通信
允许从内网访问外网
禁止从外网访问内网
iptables -A FORWARD -s 192.168.4.0/24 -o etho -j ACCEPT
iptables -A FORWARD -d 192.168.4.0/24 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -d 192.168.4.0/24 -i eth0 -m state --state NEW -j DROP
4)常规访问的免状态跟踪
比如,访问量较大的web服务
iptables -t raw -A PREROUTING -d 192.168.4.205 -p tcp --dport 80 -j NOTRACK
iptables -t raw -A PREROUTING -s 192.168.4.205 -p tcp --sport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
5)根据MAC地址封锁主机
适用于交换网络,针对源MAC地址,不管其IP地址变成多少
iptables -A INPUT -m mac --mac-source 00:0C:29:74:BE:21 -j DROP
6)简化服务开启规则
一条规则开放多个端口,比如Web,FTP,Mail,SSH等等
iptables -A INPUT -p tcp -m multiport --dport 20:22,25,80,110,143,16501:16800 -j ACCEPT
7)根据IP范围封锁主机
允许从192.168.4.10-192.168.4.20登录
禁止从192.168.4.0/24网段的其它的主机登录
iptables -A INPUT -p tcp -dport 22 -m iprange --src-range 192.168.4.10-192.168.4.20 -j ACCEPT
iptables -A INPUT -p tcp -dport 22 -s 192.168.4.0/24 -j DROP
8)允许关联的状态包通过(web服务不要使用,ftp服务特殊一点)
Iptables –A INPUT –m state –state ESTABLISHED,RELATED –j ACCEPT
Iptables –A OUTPUT –m state –state ESTABLISHED,RELATED –j ACCEPT
打个比方:看电影出去wc或者接个电话,回来也得允许进去
9)-m limit
--limit n/{second/minute/hour}:指定时间内的请求速率“n”为速率
--limit-burst[n]:在同一时间内允许通过的请求“n”为数字,不指定默认为5
例如:本机地址192.168.0.36,允许10.0.0.0/16网段ping本机,但限制每分钟请求不超过20,每次并发不能超过6个
iptables –A INPUT –s 10.0.0.0/16 –d 192.168.0.36 –p icmp –icmp-type 8 –m limit –limit 20/min –limit-burst 6 –j ACCEPT
itables –A OUTPUT –s 10.0.0.0/16 –d 192.168.0.36 –p icmp –icmp-type 0 –j ACCEPT
5.NAT表典型应用
5.1应用场景
1)从局域网访问互联网的时候,比如看网页,收邮件,源地址为私有地址,服务器如何正
确给出回应
2)从互联网访问局域网的时候,比如远程管理内网的网站,文件服务器,目标地址为私有
地址,请求包如何才能正确抵达;这就需要用到NAT地址转换
5.2 SNAT源地址转换
Source Network Address Translation
修改数据包的源地址,仅用于nat表的POSTROUTING链
1)不修改源地址的情况
2)修改源地址的情况
5.3 DNAT目标地址转换
Destination Network Address Translation
修改数据包目标地址(IP、端口),仅用于nat表的PREROUTING、OUTPUT链
1)修改目标地址的情况
5.4 SNAT策略应用
前提:局域网PC机需正确设置IP地址/子网掩码/网关/
Linux网关服务器开启IP路由转发,iptables已加载nat模块
关键:选择路由之后,针对来自局域网、即将从外网接口发出去的包,将源IP地址修改为
网关的公网IP地址
配置:
1)适合有固定外网地址的
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -o eth1 -j SNAT --to-source 174.16.16.1
2)适合变化外网地址(ADSL)
iptables –t nat –A POSTROUTING –s 192.168.4.0/24 –j MASQUERADE
案例:
地址伪装策略
共享动态公网IP地址实现上网
主要针对外网接口的IP地址不固定的情况,将SNAT改为MASQUERADE
对于ADSL宽带拨号连接,网络接口可写为ppp+
5.5 DNAT策略应用
前提:内网web主机能够访问internet,比如SNAT
Linux网关服务器开启IP路由转发
将web域名解析为网关的外网IP地址
关键:在理由选择前,针对从外网接收到的、访问本机公网TCP 80端口的数据包,将其目
标地址修改为内网的web主机的IP地址
配置:
iptables -t nat -A PREROUTING -i eth1 -d 174.16.16.1 -p tcp --dport 80 -j DNAT
--to-destination 192.168.4.5
案例:
1)发布SSH服务器
执行ssh -p 2345 174.16.16.1时,实际SSH登录192.168.4.5
iptables -t nat -A PREROUTING -i eth1 -d 174.16.16.1 –p tcp --dport 2345 -j DNAT
--to-destination 192.168.4.4:22
2)发布FTP服务器
注意:加载模块nf_nat_ftp、nf_conntrack_ftp
modprobe nf_nat_ftp
iptables -t nat -A PREROUTING -i eth1 -d 174.16.16.1 -p tcp --dport 20:21 -j DNAT
--to-destination 192.168.4.5
6.防火墙脚本
6.1防火墙规则整理
6.1.1防火墙规则整理的必要性
1)写了很多规则,一重启就没了
2)封锁数百个恶意IP地址,怎么写规则啊
3)部署一台新防火墙时,能沿用之前的规则吗
6.1.2导入/导出规则
iptables-save > /root/myfw.rule //导出
iptables-restore < /root/myfw.rule //导入
iptables-save > /etc/sysconfig/iptables //开机自动加载
7.案例实操
7.1拒绝某个ip访问某个端口
实验环境:三台主机
主机A:192.168.11.139
主机B:192.168.11.140
主机C:192.168.11.141
设置:
在主机A设置拒绝主机B问
[[email protected] ~]# iptables –F
[[email protected] ~]# iptables –X
[[email protected] ~]# iptables –Z
[[email protected] ~]# iptables -A INPUT -s 192.168.11.140p tcp --dport 22 -j DROP
感悟:
1) 只设置了拒绝主机B后,主机B无连接到主机A但是主机C可以,这说明了防火
墙的规则,没有明确拒绝的都允许
2) 只设置了允许主机B后,主机B可以连接到主机A,但是主机C也可以连接,这与我之前理解的没有明确允许的都拒绝和没有明确拒绝的都允许是不是冲突的。其实不冲突,主要还是看默认策略,如图,默认策略是允许的,所以,你允许B主机,C主机也是可以进来的,除非将默认策略设置为拒绝
7.2防止syn-flood攻击
只发syn,会把syn连接池搞满,所以限制下syn的连接
iptables –N syn-flood //创建一个自定义链,名字叫syn-flood
iptables –A INPUT –i eth0 –syn –j syn-flood //只要符合这个就交给syn-flood处理
iptables –A syn-flood –m limit –limit 5000/s –limit-burst 200 –j RETURN
// 设置syn-fload策略,限制并发连接数为200和每秒发送数量为5000
iptables –A syn-flood –j DROP //剩下的就拒绝
7.3自动封ip
这个是老男孩老师讲的,用不到,先放着
1)第一种封法:
2)这是第二种封法: