栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

iptables

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

iptables

一. 认识iptables (一). 概念
  • iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter
  • netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
  • iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
  • netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
  • Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
    • 网络地址转换(Network Address Translate)
    • 数据包内容修改
    • 数据包过滤的防火墙功能
1. 名词
  • 容器
    • 存放东西的
  • 表(table)
    • 存放链的容器
  • 链(chain)
    • 存放规则的容器
  • 规则(policy)
    • 允许或拒绝的规则
NetfilterTablesChainsPolicy
一栋楼楼里的房子房子里的柜子柜子里的衣服
二. 表与链
  • iptables是4表5链,链名必须大写
  • 我们最常用的是 Filter 表的 INPUT 链以及 NAT 表的 PREROUTING 链,以及 NAT 表的 POSTROUTING 链
(一). Filter
  • 默认表,最常用,大部分操作都在用这个表
1. INPUT
  • 最常用,也是写规则最多的链
  • 是否允许数据包进来
  • 对于制定到本地套接字的包,到达本地防火墙服务器的数据包
2. FORWARD
  • 不常用
  • 路由穿过数据包,经过本地防火墙服务器的数据包
3. OUTPUT
  • 不常用
  • 处理从主机出去的数据包
  • 本地创建的数据包
(二). NAT
  • NAT表意思是网络地址转换,主要是用来改IP和Port,主要用来实现两个功能
    • 端口和IP映射,比如访问10.0.0.3:8080,可以给你转发到10.0.0.4:87
    • 服务器没有外网IP
    • 共享上网
1. PREROUTING
  • 数据进来之前,改变数据包信息
  • 这个链就是对IP和Port映射的(DMZ),作用是改变数据包的源IP,源Port
2. OUTPUT
  • 很少用

  • 本地创建的数据包在路由之前进行改变

3. POSTROUTING
  • 可以实现共享上网

  • 在数据包进来之后,在数据包即将出去时,改变数据包信息

(三). Mangle
  • 不常用,忽略,专门用来改变数据包的
(四). RAW
  • 不常用,忽略
三. 基础
  • 我们知道iptables是按照规则来办事的,我们就来说说规则(policy),规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
1. OSI 7层模型
  • iptables工作在OSI的二,三,四层.
2. iptables执行过程
  • 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
(2). chains ==>链
  • 表又是链的容器,所有的链都要大写.
  • 防火墙的作用就在于对经过的报文匹配规则,然后执行对应的动作,所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了链
说明
INPUT进入到设备本身的包,进入主机的路由,过滤进入主机的数据包.
OUTPUT本地创建的数据包在路由之前进行改变,出的路由,改变主机发送出的数据包的目的地址.处理源地址和本机地址的数据包,从主机发送出去的数据包.
FORWARD转发的
PREROUTING预备路由,在数据包到达防火墙时尽心路由判断之前执行的规则,作用是改变数据包的**目的地址和目的端口.**生产应用:比如把80端口转为局域网的9000端口
POSTROUTING出去的路由,在数据包离开防火墙时进行路由判断之后执行的规则,作用是改变数据包的**源地址和源端口.**生产应用:局域网共享上网.
(3). policy ===>规则
  • 链是规则的容器,链是一条条的过滤语句.
  • 某些链中注定不会包含某类规则,就像某些关卡天生就不具备某些功能一样.
链中的规则存在于哪些表
INPUTmangle,filter,(centos7中还有nat,centos6中没有)
OUTPUTraw, mangle,nat,filter
FORWARDmangle,filter
PREROUTINGraw,mangle,nat
POSTROUTINGmangle,nat
四. 使用iptables
  • 配置规则一定一定要找到源IP和目标IP
(一). iptables加载的内核
# 保证加载的模块
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/iptables
1. 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 mangle
3. iptables清空规则
# 清空规则,但是不会清空默认的规则
iptables -F

# 删除用户自定义的规则
iptables -X

# 对链计数器清零,防火墙进行拦截的时候,会记住拦截了多少次,数据多大
iptables -Z
4. 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 1
5. 封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 DROP
6. 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 MASQUERADE
7. 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 MASQUERADE
7. 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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291823.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号