一、iptables简介
iptables是linux自带的一款防火墙工具,它能帮助我们基于规则完成数据包过滤、数据包重定向和网络地址转换功能。
严格的说,iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter。
Netfilter 组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易。我们使用iptables工具去操作真正的安全框架。
二、iptables的相关概念
2.1 规则
比如,来自某个IP地址的访问,就要将其拒绝,这就是一条规则。规则存储在内核空间的数据包过滤表中,这些规则分别指定了源地址、目的地址,传输协议(TCP、UDP、ICMP)和服务类型(HTTP、FTP)等。
2.2 链
安全策略的定义往往不只有一条规则,甚至还会有多个互斥的规则。这么多规则,执行的顺序是什么?哪个规则先执行?这就涉及到链这个概念。简单来讲,链就是将多个规则从上大小串起来的一个集合单位,规则按从上到下依次进行匹配。
2.3 表
链可以有多个。将多个链再规整在一起的集合,叫做表。
三、iptables四表五链介绍
iptables具有Filter, NAT, Mangle, Raw四种内建表,不同的表含有的链也不同,具体见下图。
3.1 filter表
filter是iptables的默认表,主要负责过滤功能。这里面的链条、规则,可以决定一个数据包是否可以到达目标进程端口。包含以下内建链:
INPUT:对路由策略分派过来的包到达目标进程端口之前进行匹配并处理(数据包入口)。用来过滤目的地址是本机的连接。
FORWARD:对路由策略分派过来的包进行路由转发。用来过滤目的地址和源地址都不是本机的连接。
OUTPUT:判断,从本地的目标进程端口处理好的包如何返回/要不要返回给请求方(数据包出口)。用来过滤源地址是本机的连接。
3.2 nat表
nat表主要负责网络地址转换功能,这里面的链条、规则,可以修改源和目标的ip地址,从而进行包路由。
nat 的原理,简单的说就是当内网主机访问外网时,当内网主机的数据包要通过路由器时,路由器将数据包中的源内网 IP 地址改为路由器上的公网 IP 地址(SNAT),同时记录下该数据包的消息;外网服务器响应这次由内而外发出的请求或数据交换时,当外网服务器发出的数据包经过路由器时,目标地址原本是路由器上的公网 IP 地址被路由器改为内网 IP(DNAT)。
nat表包含以下内建链:
(1)PREROUTING:处理刚到达本机并在路由转发前的数据包(路由前)。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。注意:所有的数据包进来的时侯都先由这个链处理。
(2)POSTROUTING:处理即将离开本机的数据包(路由后)。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。注意:所有的数据包出来的时侯都要经由这个链处理。
(3)OUTPUT:处理本机产生的数据包。
3.3 mangle表
mangle表可以对数据包进行重新封装,这里面的链条,规则,可以修改数据包的内容。包含以下内建链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。作用与其它表的同名链相同。
3.2 raw表
raw表用于控制数据包是否被状态追踪机制处理,包含以下内建链:PREROUTING、OUTPUT。作用与其它表的同名链相同。
这四个表的优先级由高到低的顺序为raw->mangle->nat->filter。
注意:如果想要linux主机支持转发,则需要开启内核的ip_forward功能:
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p
四、对iptables的进一步理解
当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而客户端报文的目标终点为web服务所监听的套接字(IP:Port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标终点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点。我们说过,netfilter才是真正的防火墙,它是内核的一部分,所以,如果我们想要防火墙能够达到”防火”的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了INPUT关卡和OUTPUT关卡,而这些关卡在iptables中不被称为”关卡”,而被称为”链”。
如果客户端发到本机的报文中包含的服务器地址并不是本机,而是其他服务器,此时本机就应该能够进行转发,那么这个转发就是本机内核所支持的IP_FORWARD功能,此时我们的主机类似路由器功能,所以我们会看到在iptables中,所谓的关口并只有上面所提到的INPUT及OUTPUT这两个,应该还有“路由前”,“转发”,“路由后”,它们所对应的英文名称分别为“PREROUTING”,“FORWARD”,“POSTROUTING”,这就是我们说到的5链。
由上图可以看到,当我们在本地启动了防火墙功能时,数据报文需要经过以上关口,根据各报文情况,各报文经过的“链”可能不同,如果报文目标地址是本机,则会经常INPUT链发往本机用户空间,如果报文目标不是本机,则会直接在内核空间中经由FORWARD链和POSTROUTING链转发出去。
所以,我们能够想象出某些常用场景中,报文的流向。但无论如何,数据包都会先经过PREROUTING链。报文流向介绍如下:
到本机某进程的报文:PREROUTING --> INPUT
由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING
数据包经由iptables的流程见下图:
五、iptables命令的语法规则
5.1 基本语法格式
iptables的基本语法格式如下:
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
1.
说明:
表名、链名用于指定 iptables命令所操作的表和链
命令选项用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;条件匹配用于指定对符合什么样条件的数据包进行处理;
目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转给其它链处理。
5.2 管理控制选项
iptables命令的管理控制选项如下:
-A:在指定链的末尾添加一条新的规则
-D:删除指定链中的某一条规则,可以按规则序号和内容删除
-I:在指定链中插入一条新的规则,默认在第一行添加
-R:修改、替换指定链中的某一条规则,可以按规则序号和内容替换
-L:列出指定链中所有的规则进行查看
-E:重命名用户定义的链,不改变链本身
-F:清空链中的所有规则
-N:新建一条用户自己定义的规则链
-X:删除指定表中用户自定义的规则链
-S:打印指定链中的所有规则
-P:设置指定链的默认策略
-Z:清空链中使用的规则
-p:指定协议,可以是tcp、udp、icmp协议
-t:指定要操纵的表
-s:指定源地址
-d:指定目标地址
--sport:指定源端口
--dport:指定目标端口
-i:数据包进入的网卡
-o:数据包出口的网卡
-j:对数据包的处理方式,后面介绍
-n:使用数字形式显示输出结果
-v:查看规则表详细信息的信息
-m mutiport --sport/--dport:端口匹配,指定一组源端口/目标端口
-m mac --mac-source xx:xx:xx:xx:xx:xx:匹配源mac地址
-m iprange --src-range/--dst-range:指明一组IP(源地址/目标地址)的使用条件
-m state --state xxx:限定收发包的状态,有INVALID, ESTABLISHED, NEW, RELATED和UNTRACKED这几种
NEW: 新连接请求
ESTABLISHED:已建立的连接
INVALID:无法识别的连接
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接
UNTRACKED:未追踪的连接
-V:查看版本
-h:获取帮助
5.3 处理数据包的方式
防火墙处理数据包方式如下(-j 后面可以接的参数):
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不给任何回应信息
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
SNAT:源地址转换
DNAT:目标地址转换
REDIRECT:重定向
MASQUERAED:地址伪装
六、iptables使用案例
#删除INPUT链的第一条规则
iptables -D INPUT 1
#拒绝进入防火墙的所有ICMP协议数据包
iptables -A INPUT -p icmp -j REJECT
#允许防火墙转发除ICMP协议以外的所有数据包。使用”!”可以将条件取反
iptables -A FORWARD -p ! icmp -j ACCEPT
#拒绝转发来自192.168.1.10主机的数据,允许转发来自192.168.0.0/24网段的数据
iptables -A FORWARD -s 192.168.1.10 -j REJECT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
#所有发给目标网口是wlan0 且目标ip是121.18.238.0/29 地址的包,都会被丢弃,不作任何回复
iptables -A OUTPUT -o wlan0 -d 121.18.238.0/29 -j DROP
#拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包
iptables -A INPUT -p tcp -m state --state NEW -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包,无任何回复
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
#web服务器开启80端口,可接收外部的http请求
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许ping。由于是双向的,所以INPUT链、OUTPUT链都要设置
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
##将本机的对8080端口请求转发至其他主机,主机IP:192.168.0.141,目标主机IP和端口:192.168.0.142:80;
#进入PREROUTING作目标地址转换。由192.168.0.141:8080转为192.168.0.142:80
iptables -t nat -A PREROUTING -d 192.168.0.141/32 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.0.142:80
#数据包进入POSTROUTING链,即将离开本机,做源地址转换,由客户端IP转换为192.168.0.141
iptables -t nat -A POSTROUTING -d 192.168.0.142/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.141
#将本机的对80端口请求重定向到8080端口
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
#清空所有iptables规则
iptables -F
#清除iptables nat表规则
iptables -t nat -F
#保存iptables规则
service iptables save
-----------------------------------
©著作权归作者所有:来自51CTO博客作者wx6325de70699f3的原创作品,请联系作者获取转载授权,否则将追究法律责任
iptables使用详解
https://blog.51cto.com/u_15796303/6455949
路由规则:
实例1:显示当前路由
命令:
route
route -n
输出:
![复制代码](https://common.cnblogs.com/images/copycode.gif)
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.120.0 * 255.255.255.0 U 0 0 0 eth0
e192.168.0.0 192.168.120.1 255.255.0.0 UG 0 0 0 eth0
10.0.0.0 192.168.120.1 255.0.0.0 UG 0 0 0 eth0
default 192.168.120.240 0.0.0.0 UG 0 0 0 eth0
[root@localhost ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.120.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.0.0 192.168.120.1 255.255.0.0 UG 0 0 0 eth0
10.0.0.0 192.168.120.1 255.0.0.0 UG 0 0 0 eth0
0.0.0.0 192.168.120.240 0.0.0.0 UG 0 0 0 eth0
![复制代码](https://common.cnblogs.com/images/copycode.gif)
说明:
第一行表示主机所在网络的地址为192.168.120.0,若数据传送目标是在本局域网内通信,则可直接通过eth0转发数据包;
第四行表示数据传送目的是访问Internet,则由接口eth0,将数据包发送到网关192.168.120.240
其中Flags为路由标志,标记当前网络节点的状态。
Flags标志说明:
U Up表示此路由当前为启动状态
H Host,表示此网关为一主机
G Gateway,表示此网关为一路由器
R Reinstate Route,使用动态路由重新初始化的路由
D Dynamically,此路由是动态性地写入
M Modified,此路由是由路由守护程序或导向器动态修改
! 表示此路由当前为关闭状态
实例2:添加网关/设置网关
命令:
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
输出:
![复制代码](https://common.cnblogs.com/images/copycode.gif)
[root@localhost ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.120.0 * 255.255.255.0 U 0 0 0 eth0
192.168.0.0 192.168.120.1 255.255.0.0 UG 0 0 0 eth0
10.0.0.0 192.168.120.1 255.0.0.0 UG 0 0 0 eth0
224.0.0.0 * 240.0.0.0 U 0 0 0 eth0
default 192.168.120.240 0.0.0.0 UG 0 0 0 eth0
![复制代码](https://common.cnblogs.com/images/copycode.gif)
[root@localhost ~]#
说明:
增加一条 到达244.0.0.0的路由
实例3:屏蔽一条路由
命令:
route add -net 224.0.0.0 netmask 240.0.0.0 reject
输出:
![复制代码](https://common.cnblogs.com/images/copycode.gif)
[root@localhost ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.120.0 * 255.255.255.0 U 0 0 0 eth0
192.168.0.0 192.168.120.1 255.255.0.0 UG 0 0 0 eth0
10.0.0.0 192.168.120.1 255.0.0.0 UG 0 0 0 eth0
224.0.0.0 - 240.0.0.0 ! 0 - 0 -
224.0.0.0 * 240.0.0.0 U 0 0 0 eth0
default 192.168.120.240 0.0.0.0 UG 0 0 0 eth0
![复制代码](https://common.cnblogs.com/images/copycode.gif)
说明:
增加一条屏蔽的路由,目的地址为 224.x.x.x 将被拒绝
实例4:删除路由记录
命令:
route del -net 224.0.0.0 netmask 240.0.0.0
route del -net 224.0.0.0 netmask 240.0.0.0 reject
输出:
![复制代码](https://common.cnblogs.com/images/copycode.gif)
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.120.0 * 255.255.255.0 U 0 0 0 eth0
192.168.0.0 192.168.120.1 255.255.0.0 UG 0 0 0 eth0
10.0.0.0 192.168.120.1 255.0.0.0 UG 0 0 0 eth0
224.0.0.0 - 240.0.0.0 ! 0 - 0 -
224.0.0.0 * 240.0.0.0 U 0 0 0 eth0
default 192.168.120.240 0.0.0.0 UG 0 0 0 eth0
[root@localhost ~]# route del -net 224.0.0.0 netmask 240.0.0.0
[root@localhost ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.120.0 * 255.255.255.0 U 0 0 0 eth0
192.168.0.0 192.168.120.1 255.255.0.0 UG 0 0 0 eth0
10.0.0.0 192.168.120.1 255.0.0.0 UG 0 0 0 eth0
224.0.0.0 - 240.0.0.0 ! 0 - 0 -
default 192.168.120.240 0.0.0.0 UG 0 0 0 eth0
[root@localhost ~]# route del -net 224.0.0.0 netmask 240.0.0.0 reject
[root@localhost ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.120.0 * 255.255.255.0 U 0 0 0 eth0
192.168.0.0 192.168.120.1 255.255.0.0 UG 0 0 0 eth0
10.0.0.0 192.168.120.1 255.0.0.0 UG 0 0 0 eth0
default 192.168.120.240 0.0.0.0 UG 0 0 0 eth0
[root@localhost ~]#
![复制代码](https://common.cnblogs.com/images/copycode.gif)
说明:
实例5:删除和添加设置默认网关
命令:
route del default gw 192.168.120.240
route add default gw 192.168.120.240
输出:
![复制代码](https://common.cnblogs.com/images/copycode.gif)
[root@localhost ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.120.0 * 255.255.255.0 U 0 0 0 eth0
192.168.0.0 192.168.120.1 255.255.0.0 UG 0 0 0 eth0
10.0.0.0 192.168.120.1 255.0.0.0 UG 0 0 0 eth0
[root@localhost ~]# route add default gw 192.168.120.240
[root@localhost ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.120.0 * 255.255.255.0 U 0 0 0 eth0
192.168.0.0 192.168.120.1 255.255.0.0 UG 0 0 0 eth0
10.0.0.0 192.168.120.1 255.0.0.0 UG 0 0 0 eth0
default 192.168.120.240 0.0.0.0 UG 0 0 0 eth0
[root@localhost ~]#
![复制代码](https://common.cnblogs.com/images/copycode.gif)
说明:
备注:
route -n (-n 表示不解析名字,列出速度会比route 快)
- # route
- Destination Gateway Genmask Flags Metric Ref Use Iface
- 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
- 169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
- default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
route 命令的输出项说明
输出项 说明
Destination |
目标网段或者主机 |
---|---|
Gateway |
网关地址,”*” 表示目标是本主机所属的网络,不需要路由 |
Genmask |
网络掩码 |
Flags |
标记。一些可能的标记如下: |
U — 路由是活动的 |
|
H — 目标是一个主机 |
|
G — 路由指向网关 |
|
R — 恢复动态路由产生的表项 |
|
D — 由路由的后台程序动态地安装 |
|
M — 由路由的后台程序修改 |
|
! — 拒绝路由 |
|
Metric |
路由距离,到达指定网络所需的中转数(linux 内核中没有使用) |
Ref |
路由项引用次数(linux 内核中没有使用) |
Use |
此路由项被路由软件查找的次数 |
Iface |
该路由表项对应的输出接口 |
参考:
https://blog.51cto.com/u_15796303/6455949
https://www.cnblogs.com/peida/archive/2013/03/05/2943698.html
标签:iptables,0.0,192.168,UG,数据包,路由 From: https://www.cnblogs.com/rebrobot/p/17582261.html