一:防火墙简介
1.简介
iptables其实并不是真正的防火墙,我们可以把他理解为一个客户端的代理,用户是通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙。这个框架叫做netfilter
netfilter 内核态 位于内核空间
iptables 用户态 位于用户空间
注意:
企业环境内部服务器需关闭Linux自身防火墙;(解决安全问题尽量不给服务器配置外网IP.需要访问的话,就使用代理转发)因为高并发,iptables会加大延迟。除非并发小,服务器必须处于公网,考虑开启防火墙;大并发的情况,不能开iptables,影响性能因为iptables是要消耗CPU的,利用硬件防火墙提升架构安全
2.分类
逻辑分类
主机防火墙:针对单个主机进行防护
网络防火墙:它往往处于网络入口或者边缘,针对于网络入口进行防护,服务于防火墙背后的局域网
物理分类
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分基于软件实现,性能高,成本高
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上,性能低,成本低
二:相关术语
1.表(tables)
表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables),如上,如果把Netfilter看成是某个小区的一栋楼,那么表(tables)就是楼里的其中的一套房子
2.链(chains)
链(chains)是规则(Policys)的容器。如果把表(tables)当作有一套房子,那么链(chains)就可以说是房子里的家具(柜子等)
3.规则(Policy)
规则(Policy)就比较容易理解了,就是iptables系列过滤信息的规范和具体方法条款了.可以理解为柜子如何增加并摆放柜子东西等
Netfilter/iptables | 表(tables) | 链(chains) | 规则(Policy) |
---|---|---|---|
一栋楼 | 楼里的房子 | 房子里的柜子 | 柜子里衣服,摆放规则 |
三:Iptables表和链
默认情况下,iptables根据功能和表的定义划分包含四个表,filter,nat,mangle,raw其每个表又包含不同的操作链(chains )
1.表
raw 追踪数据包
mangle 对数据包打标记
nat 地址转换
filter 数据包过滤
2.链
PREROUTING 在路由之前
INPUT 数据包进入时
FORWARD 数据包经过时
OUTPUT 数据包出去时
POSTROUTING 在路由之后
3.表详情
raw:
Chain PREROUTING (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
mangle:
Chain PREROUTING (policy ACCEPT)
Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
Chain POSTROUTING (policy ACCEPT)
nat:
Chain PREROUTING (policy ACCEPT)
Chain INPUT (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
Chain POSTROUTING (policy ACCEPT)
filter:
Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT匹配过的数据包不会在去匹配)
Chain OUTPUT (policy ACCEPT)
4.访问顺序
当一个数据包进入网卡,先进入PREROUTING链,内核根据数据包的IP判断是否需要转发
如果是到本机的,就会到INPUT链,然后本机的所有进程可收到这个包
如果不是到本机的,且内核允许转发,就会到达FORWARD链,然后到POSRTROUTING链输出
本机发出一个数据,会通过OUTPUT链,再到POSRTROUTING链输出
注意:
规则顺序:匹配即刻停止
四:Iptables操作
1.安装
shell
centos(5/6)
启动防火墙:#/etc/init.d/iptables start
centos7
[root@xingdian ~]# yum install -y iptables iptables-services
[root@xingdian ~]# systemctl stop firewalld
[root@xingdian ~]# systemctl disable firewalld
[root@xingdian ~]# systemctl start iptables
查看版本:
[root@xingdian ~]# iptables -V
iptables v1.4.21
配置文件:
/etc/sysconfig/iptables-config #iptables主配置文件
/etc/sysconfig/iptables #记录规则文件,启动失败时,创建这个文件
2.参数解释
shell
-L:列出一个链或所有链中的规则信息,如果不写-t 默认使用filter表
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
--line-numbers:查看规则时,显示规则的序号(方便之处,通过需要删除规则-D INPUT 1
-F:清空所有的规则(-X是清理自定义的链,用的少;-Z清零规则序号)
-D:删除链内指定序号(或内容)的一条规则
-P:为指定的链设置默认规则
-A:在链的末尾追加一条规则
-I:在链的开头(或指定序号)插入一条规则
-t: 指定表名
.... 更多参数可通过--help查看
3.常见操作
shell
1.如果不写-t 默认使用filter表
指定表名查看规则
[root@xingdian ~]# iptables -t nat -L
默认查看规则:
# iptables -L
以数字的形式显示ip和端口与协议
# iptables -nL
显示规则行号
# iptables -nL --line
清空规则:
#iptables -F
清空单独的某一个链里面的规则
#iptables -F 链名
保存规则:
# service iptables save
# iptables-save > /etc/sysconfig/iptables
# iptables-restore < /etc/sysconfig/iptables
4.常见协议
shell
协议:-p (小p)
tcp ---用的最多
udp
icmp ---ping的时候用的协议
#使用协议的时候可以不指定端口,使用端口的时候必须指定协议。
案例:
禁止自己被ping,在filter表的INPUT链插入一个丢弃icmp的规则。
[root@xingdian ~]# iptables -F
[root@xingdian ~]# iptables -A INPUT -p icmp -j REJECT ----拒绝
验证:
[root@xingdian ~]# ping 192.168.246.200
PING 192.168.246.200 (192.168.246.200) 56(84) bytes of data.
From 192.168.246.200 icmp_seq=1 Destination Port Unreachable
5.目标动作
ACCEPT 允许数据包通过(默认策略)
DROP 直接丢弃数据包,不给任何回应
REJECT 拒绝数据包,必要时会给数据发送端一个响应
SNAT 源地址转换,可以解决內网用户用一个公网IP上网问题 POSTROUTING
DNAT 目标地址转换 PREROUTING
REDIRECT 做端口映射
6.规则案例
iptables语法格式
iptables -t 表名 -规则参数 链名 [规则序号] [匹配规则内容] -j [动作]
[规则参数]:对指定表中的指定链做规则变动
-A:添加规则(添加在最后一条规则后)
-I:插入规则(插入在某条规则后,不指定序号默认插入到第一条)
-D:删除规则
-R:修改规则
-P:修改链的默认规则,默认可选择DROP和ACCEPT
-N:创建自定义链,自定义链定义的规则无法生效,要在-j后引用自定义链才能生效
自定义链删除,需要在引用的自定义链的链中删除引用规则,才能进行删除
[规则序号]:使用iptables -L -t表名 --line查看规则序号,序号和插入(-I),删除(-D),修改(-R)联用
[匹配规则内容]
-p:指定协议,例如:tcp,udp,icmp
--sport:源端口号(从哪个端口来)
--dport:目标端口号(到哪个端口去)
-s:源IP(从哪个IP 来)
-d:目标IP(到哪个IP去)
[动作]:对于符合规则的数据包做何种动作
ACCEPT:接收数据包
REJECT:拒绝数据包,必要时会给数据发送端一个响应
DROP:丢弃数据表,不给任何回应
shell
添加规则:-A
[root@xingdian ~]# iptables -t filter -A INPUT -p icmp -j REJECT
[root@xingdian ~]# iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.122.113 -j REJECT
插入规则:-I
如果不指定插入到第几条,默认插入到第一条
插到哪默认就是第几条
序号靠前(小)的规则,优先级更高
[root@xingdian ~]# iptables -t filter -I INPUT 2 -p tcp --dport 22 -s 192.168.122.114 -j REJECT
//插入到第二条上面
[root@xingdian ~]# iptables -t filter -I INPUT -p tcp --dport 22 -s 192.168.122.114 -j REJECT
//默认插入到第一行
替换(修改)规则:-R
[root@xingdian ~]# iptables -t filter -R INPUT 2 -p tcp --dport 22 -s 192.168.122.115 -j REJECT 把114-->115
删除规则:-D
[root@xingdian ~]# iptables -t filter -D INPUT -p tcp --dport 22 -s 192.168.122.115 -j REJECT
[root@xingdian ~]# iptables -L --line (要删除的序号)
[root@xingdian ~]# iptables -t filter -D INPUT(链) 2
修改默认策略:-P 只能用DROP和ACCEPT
[root@xingdian ~]# iptables -t filter -P INPUT DROP
[root@xingdian ~]# iptables -t filter -P INPUT ACCEPT
添加自定义链:-N 默认不生效 是用来存储规则的
[root@xingdian ~]# iptables -N blackrach 自己创建的链
[root@xingdian ~]# iptables -t filter -A blacrach -p tcp --dport 22 -s 192.168.122.116 -j REJECT
//往自定义链上添加
[root@xingdian ~]# iptables -A INPUT -j blackrach 关联自定义链,使用自定义链
修改自定义链名称:-E
[root@xingdian ~]# iptables -E blackrach blackcloud
删掉自定义规则:不能被关联,必须是空链
[root@xingdian ~]# iptables -X +链名 删除自定义链
7.匹配规则
基本匹配
shell
协议 -p tcp udp icmp
查端口:vim /etc/services 记录的是tcp/udp协议簇
vim /etc/protocols 记录的是icmp
-p tcp udp icmp
端口:使用端口前加协议(-p)
--sport源端口
[root@xingdian ~]# iptables -A INPUT -p tcp --sport 22 -s 10.18.44.10 -j REJECT
--dport目标端口
[root@xingdian ~]# iptables -A INPUT -p tcp --dport 22 -s 10.18.44.10 -j REJECT
IP
-s 源IP source ip地址 网段 逗号可以分开多个地址
-d 目标IP destination
扩展规则
shell
-m 后面+扩展匹配
-m multiport 多端口
[root@xingdian ~]# iptables -A INPUT -m multiport --sports(--source-ports) 80,20,22,1000:2000 -j DROP
--dports(--destination-ports)
-m iprange 多ip地址
[root@xingdian ~]# iptables -A INPUT -m iprange --src-range 10.18.44.211-10.18.44.250 -j DROP
-m mac
[root@xingdian ~]# iptables -A INPUT -m mac --mac-source 52:54:00:86:a1:86 -j REJECT
获取MAC的方式
[root@xingdian opt]# arp -a 10.0.102.101
[root@xingdian opt]# arping -I eth0 10.0.102.101
8.网络地址转换
注意:实验环境效果不佳/无
SNAT:把内网地址转换成公网地址
client ----------------iptables----内网ip--公网(baidu公网)
一个数据包在经过路由之后(或者说在通过防火墙的过滤之后)才被知道他的源IP是谁,在路由之前只能看到目标IP,如果我看不到你的源IP,那怎么匹配想过滤的数据包并进行源地址转换?我防火墙根本就不能确定你是否是符合匹配条件的IP,所以只能使用POSTROUTING
shell
[root@xingdian ~]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -d 192.168.122.0/24 -j SNAT --to-source 192.168.2.1
DNAT:要把别人的公网ip换成我们内部的IP
web-server iptables client
如果我不在路由之前就把目标地址转换完成,很显然当数据包到达入口IP之后,他的目的已经达到了,因为他本来的目标IP就是防火墙的对外公网IP,那么数据包还会往里面走吗?显然不可能了,所以只能使用PREROUTING
shell
[root@xingdian ~]# iptables -t nat -A PREROUTING -d 192.168.1.2 -j DNAT --to-destination 192.168.2.2
[root@xingdian ~]# iptables -t nat -A POSTROUTING -d 192.168.2.2 -j SNAT --to 192.168.2.1
面试题
shell
[root@xingdian ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.122.1 -dport 80 -j DNAT --to-destination 192.168.1.1:8080