- iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter
- netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
- iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
- netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
- Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
- 网络地址转换(Network Address Translate)
- 数据包内容修改
- 数据包过滤的防火墙功能
- 容器
- 存放东西的
- 表(table)
- 存放链的容器
- 链(chain)
- 存放规则的容器
- 规则(policy)
- 允许或拒绝的规则
| Netfilter | Tables | Chains | Policy |
|---|---|---|---|
| 一栋楼 | 楼里的房子 | 房子里的柜子 | 柜子里的衣服 |
- iptables是4表5链,链名必须大写
- 我们最常用的是 Filter 表的 INPUT 链以及 NAT 表的 PREROUTING 链,以及 NAT 表的 POSTROUTING 链
- 默认表,最常用,大部分操作都在用这个表
- 最常用,也是写规则最多的链
- 是否允许数据包进来
- 对于制定到本地套接字的包,到达本地防火墙服务器的数据包
- 不常用
- 路由穿过数据包,经过本地防火墙服务器的数据包
- 不常用
- 处理从主机出去的数据包
- 本地创建的数据包
- NAT表意思是网络地址转换,主要是用来改IP和Port,主要用来实现两个功能
- 端口和IP映射,比如访问10.0.0.3:8080,可以给你转发到10.0.0.4:87
- 服务器没有外网IP
- 共享上网
- 数据进来之前,改变数据包信息
- 这个链就是对IP和Port映射的(DMZ),作用是改变数据包的源IP,源Port
-
很少用
-
本地创建的数据包在路由之前进行改变
-
可以实现共享上网
-
在数据包进来之后,在数据包即将出去时,改变数据包信息
- 不常用,忽略,专门用来改变数据包的
- 不常用,忽略
- 我们知道iptables是按照规则来办事的,我们就来说说规则(policy),规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
- iptables工作在OSI的二,三,四层.
- iptables是采用数据包过滤机制工作的,所以他会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机.
# 工作流程小结: 1. 防火墙是一层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的,基于包过滤的. 2. 如果匹配上规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新的规则了 3. 如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,就向下进行匹配,直到匹配默认规则得到明确阻止还是通过,默认规则默认是允许的,工作中是配置为拒绝 4. 防火墙的默认规则是对应链的所有的规则执行完才会执行的. # 把拒绝的规则放在最上面,效率高3. iptables工作过程
- 数据包进来之后,最先遇到的是NAT表的PREROUTING链,然后在经过forward表,一般不会再forward上处理,所以数据可以直接经过,然后有2条路选择
- 一个是经过filter表的INPUT链(规则写的最多的地方,允不允许数据包进来),然后就可以访问local process(服务信息),然后在经过一系列出站的表和链
- 一个是经过filter表的FORWARD链,一般也不会对FORWARD链进行处理,然后经过nat表,POSTROUTING链出去,整个过程并没有访问到真正的服务(local process)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uUQFkGfG-1633324803471)(D:Typora图片路径image-20210124113819791.pn
g)]
# 工作过程小结: 1. 一号线: 先经过nat表的PREROUTING链,进入防火墙,经过filter表的FPRWARD链,最后经过nat表的POSTROUTING链. 2. 二号线: 先经过nat表的PREROUTING链,进入防火墙,经过filter表的INPUT链,因为OUTPUT链一般不会去加规则,所以最后就直接经过nat表的POSTROUTING链. # 两条线的功能: 一号线功能: 1. 一号线用作局域网上网共享 2. 二号线作用是外部IP和端口映射为内部IP和端口 二号线功能: 1. 主要是防火墙功能.也是最常用的4. iptables内容 (1). tables ==>表
-
iptables是表的容器,最常用的表有filter和nat表.
-
我们再想想另外一个问题,我们对每个"链"上都放置了一串规则,但是这些规则有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们是不是能把实现相同功能的规则放在一起呢?
-
我们把具有相同功能的规则的集合叫做"表",所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4种功能的范围,所以,学习iptables之前,我们必须先搞明白每种表 的作用。
| 表 | 说明 |
|---|---|
| filter | 默认表,最常用,主要是服务器自身相关的.他是真正负责防火墙功能的.负责过滤功能,防火墙;内核模块:iptables_filter,链有:INPUT,FORWARD,OUTPUT |
| nat | 最常用,network address translation,网络地址转换功能;内核模块:iptable_nat,链有:OUTPUT.PREROUTING,POSTROUTING |
| mangle | 基本不用, 拆解报文,做出修改,并重新封装 的功能;iptable_mangle链:INPUT,FORWARD,OUTPUT,PREROUTING,POSTROUTING |
| raw | 基本不用,关闭nat表上启用的连接追踪机制;iptable_raw |
- 表又是链的容器,所有的链都要大写.
- 防火墙的作用就在于对经过的报文匹配规则,然后执行对应的动作,所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了链
| 链 | 说明 |
|---|---|
| INPUT | 进入到设备本身的包,进入主机的路由,过滤进入主机的数据包. |
| OUTPUT | 本地创建的数据包在路由之前进行改变,出的路由,改变主机发送出的数据包的目的地址.处理源地址和本机地址的数据包,从主机发送出去的数据包. |
| FORWARD | 转发的 |
| PREROUTING | 预备路由,在数据包到达防火墙时尽心路由判断之前执行的规则,作用是改变数据包的**目的地址和目的端口.**生产应用:比如把80端口转为局域网的9000端口 |
| POSTROUTING | 出去的路由,在数据包离开防火墙时进行路由判断之后执行的规则,作用是改变数据包的**源地址和源端口.**生产应用:局域网共享上网. |
- 链是规则的容器,链是一条条的过滤语句.
- 某些链中注定不会包含某类规则,就像某些关卡天生就不具备某些功能一样.
| 链 | 链中的规则存在于哪些表 |
|---|---|
| INPUT | mangle,filter,(centos7中还有nat,centos6中没有) |
| OUTPUT | raw, mangle,nat,filter |
| FORWARD | mangle,filter |
| PREROUTING | raw,mangle,nat |
| POSTROUTING | mangle,nat |
- 配置规则一定一定要找到源IP和目标IP
# 保证加载的模块 lsmod |egrep 'filter|nat|ipt' iptable_mangle 12695 0 iptable_nat 12875 0 nf_nat_ipv4 14115 1 iptable_nat nf_nat 26787 1 nf_nat_ipv4 ipt_REJECT 12541 2 nf_reject_ipv4 13373 1 ipt_REJECT nf_conntrack 133095 4 nf_nat,nf_nat_ipv4,xt_conntrack,nf_conntrack_ipv4 iptable_filter 12810 1 ip_tables 27126 3 iptable_filter,iptable_mangle,iptable_nat libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
# 如果没有加载通过如下命令添加相应模块到内核中: modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state # 检查 lsmod |egrep 'filter|nat|ipt' iptable_nat 12875 0 nf_nat_ipv4 14115 1 iptable_nat nf_nat_ftp 12770 0 nf_nat 26787 2 nf_nat_ftp,nf_nat_ipv4 nf_conntrack_ftp 18638 1 nf_nat_ftp ipt_REJECT 12541 2 nf_reject_ipv4 13373 1 ipt_REJECT nf_conntrack 133095 7 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4 iptable_filter 12810 1 ip_tables 27126 2 iptable_filter,iptable_nat libcrc32c 12644 3 xfs,nf_nat,nf_conntrack(二). iptables的使用
# centos7中默认是装了iptables的命令,而没有真正装iptables yum -y install iptables-servers # iptables的配置文件/etc/sysconfig/iptables,可以把规则放在这里面 rpm -ql iptables-services /etc/sysconfig/iptables1. iptables参数
-L 显示表中的所有规则,只写-L有些是看不懂的 -n 不要把端口或ip反向解析为名字 -t 指定想看的表 -A append 追加 准许ACCEPT(后面加链) -I insert拒绝的规则放在最上面,A和I的区别就在于-A是追加,-I是添加到最前面,所以拒绝一定要用- I,封IP就用-I -D delete 删除 -p protocal 协议 tcp|udp|icmp|all --dport 目标端口 --sport 源端口 -s 源ip地址 --source -d 目标ip地址 --destination -m 指定模块,比如指定多个端口的模块 -m multiport -j 满足条件后的动作 : DROP|ACCEPT|REJECT, REJECT拒绝也是一种回应,而DROP是无回应. -F 清除所有规则,不会处理默认的规则 -X 删除用户自定义的链 -Z 链的计数器清零(数据包计数器与数据包字节计数器) --line-number 显示规则所在的行数,删规则的时候可以直接用行号进行删除 ! 非,位置是在前面 : 表示范围 -i 指定入口网卡 例:iptables -A INPUT -i eth0 -o 指定出口网卡 例:iptables -A FORWARD -o eth0 MASQUERADE 源地址伪装2. iptables查看
# 查看默认表的规则 iptables -nL # 查看指定表的规则,-t指定哪个表 iptables -nL -t mangle3. iptables清空规则
# 清空规则,但是不会清空默认的规则 iptables -F # 删除用户自定义的规则 iptables -X # 对链计数器清零,防火墙进行拦截的时候,会记住拦截了多少次,数据多大 iptables -Z4. iptables添加和删除规则
- 可以使用nc命令开启一个端口进行测试,服务端nc -l 8080开启一个端口,客户端可以telnet ip:8080,就可以通信,需要清除iptables上的所有规则
# 语法:
iptables -[ACD] chain rule-specification [options]
iptable; -t:指定表; 动作:(-A|-D|-C); 指定动作于哪个链; 动作的规则:{ -p:指定协议(tcp|udp|icmp|all ); 目的端口还是源端口(--dport|--sport); 端口信息} 对规则的处理:(DROP|ACCEPT|REJECT)
# -C: 改变规则
# -D: 删除规则
# -A: 增加规则
# --dport: 目标端口
# --sport: 源端口
# 案例,拒绝目的端口为333的连接.(用户连接端口,所以就是目的端口)
iptables -t filter -A INPUT -p tcp --dport 333 -j DROP
# 增加一条拒绝的规则,让他放在规则的最上面,一般拒绝都放最上面
iptables -t filter -I INPUT -s 10.0.0.0/24 -p tcp --dport 8080 -j DROP
# 默认规则是允许的且默认是在filter表,端口没有就不指定.这里规则是只允许10.4.7.0/24网段可以访问,
iptables -I INPUT ! -s 10.4.7.0/24 -j DROP
# 拒绝多个端口,-m multiport,拒绝10.0.0.0网段连接8080和9090端口
iptables -I INPUT -s 10.0.0.0/24 -p tcp -m multiport --dport 8080,9090 -j DROP
# 拒绝多个端口,可以用范围
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8080:9090 -j DROP
# 添加规则 iptables -t filter -A INPUT -p tcp --dport 80 -j DROP # 删除规则 iptables -t filter -D INPUT -p tcp --dport 80 -j DROP # 也可以直接用行号来进行删除,慎用 iptables -t filter -D INPUT 1 # 添加规则 iptables -t filter -A INPUT -p tcp --dport 80 -j DROP # 查看规则的序号.可以看到刚添加的规则的序号是1,那么删除规则的时候只要指定需要就可以了 iptables -L -n --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination # 按照序号来删除规则,删除序号为1的规则. iptables -t filter -D INPUT 15. 封IP地址
# 封IP就用-I,这样规则就放在链的最上面.才能真正达到封192.168.136.11的功能.-s(源IP),访问服务器,就是源IP iptables -t filter -I INPUT -p tcp -s 192.168.136.11 --dport 80 -j DROP6. SNAT
- SNAT也叫源地址转换,实现共享上网
- 改源IP是因为此时172.16.1.0/24网段的已经进来(数据包没进来怎么改ip?),只针对出网,所以用POSTROUTING链,允不允许进才用PRERUTING链
# 172.16.1.0网段比如不能上网而10.0.0.61可以上网,那么直接把这个网段的所有IP都改为10.0.0.61,就可以实现 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61 # 配置了SNAT,还是不能转换,需要加载内核文件,net.ipv4.ip_forward = 1 echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf # 如果是公网IP不固定 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE7. DNAT
# 172.16.1.0网段比如不能上网而10.0.0.61可以上网,那么直接把这个网段的所有IP都改为10.0.0.61,就可以实现 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61 # 配置了SNAT,还是不能转换,需要加载内核文件,net.ipv4.ip_forward = 1 echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf # 如果是公网IP不固定 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE7. DNAT
# 在数据包进来的时候就需要将他们的端口改了,10.0.0.61的9000端口改为172.16.1.17:8000端口 iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.17:8000 # 用户访问10.0.0.61给他转到172.16.1.17上 iptables -t nat -A PREROUTING -d 10.0.0.61 -j DNAT --to-destination 172.16.1.17



