Iptables

一,iptables的原理:

当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发

iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。

二,iptables的四表五连:

iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。

iptables中定义有表,分别表示提供的功能,有filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪),这些表具有一定的优先级:raw–>mangle–>nat–>filter

iptables中定义有5条链,说白了就是上面说的5个钩子函数,因为每个钩子函数中可以定义多条规则,每当数据包到达一个钩子函数时,iptables就会从钩子函数中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合钩子函数中任一条规则,iptables就会根据该函数预先定义的默认策略来处理数据包
1. Filter表
Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:

INPUT链 – 处理来自外部的数据。
OUTPUT链 – 处理向外发送的数据。
FORWARD链 – 将数据转发到本机的其他网卡设备上。

2. NAT表
NAT表有三种内建链:

PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
OUTPUT链 – 处理本机产生的数据包。

3. Mangle表
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:
PREROUTING OUTPUT FORWARD INPUT POSTROUTING
4. Raw表
Raw表用于处理异常,它具有2个内建链: PREROUTING chain OUTPUT chain

下图十分清晰的表明数据包的流向。由于四表中我们常用的就只有filter和nat:
这里写图片描述

三,iptables规则的书写:

理解iptables规则的关键:

Rules包括一个条件和一个目标(target)
如果满足条件,就执行目标(target)中的规则或者特定值。
如果不满足条件,就判断下一条Rules。

目标值(Target Values)
下面是你可以在target里指定的特殊值:

ACCEPT – 允许防火墙接收数据包
DROP – 防火墙丢弃包
QUEUE – 防火墙将数据包移交到用户空间
RETURN – 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。
SNAT - 源地址转换
DNAT-目的地址转换
REDIRECT-目标端口转换
MARK-将数据包打上标记

四,iptables常用命令和参数:
以下选项指明了将要被执行的操作. 以下选项只能单独在命令行中被指明使用,除非其他被指出的情况。
-A, –append chain rule-specification
在选定的链后添加一个或者多个规则

-C, –check chain rule-specification
检测一条规则是否匹配此链中指定的规则,或者说检测匹配规则是否存在

-D, –delete chain rule-specification
-D, –delete chain rulenum
删除一个或者多个从链中指定的规则,可以使用规则号码或者匹配的规则信息

-I, –insert chain [rulenum] rule-specification
向选定的链中以给定序号向对应位置插入一条或者多条规则。

-R, –replace chain rulenum rule-specification
替换选定链中的一条规则

-L, –list [chain]
列出链中的所有规则,如果没有指定链,则所有的链中的规则都将被显示
用法:iptables -t nat -n -L
用法:iptables -L -v

-S, –list-rules [chain]
显示所与选中链中的规则,如果未选中具体的链,则所有链的规则将以iptables-save形式打印出来

-F, –flush [chain]
刷新选中的链或者所有的链(如果未指定具体的链)。此操作等于删除了所有的规则

-Z, –zero [chain [rulenum]]
将所有链中的数据包归零,或者清零给定的链,或者指定链中的具体规则

-N, –new-chain chain
用给定的名称创建一条用户自定的链

-X, –delete-chain [chain]
删除用户自定的链. 要删除的链必须不存在其他参考.

-P, –policy chain target
对于给定的目标设置链的策略

-E, –rename-chain old-chain new-chain
用给定的链名称重命名一条旧的链

-h 帮助. 给出(当前最简)语法描述.

参数陈列
以下参数明组成了一条规则的设置(例如添加、删除、插入、替换、附加等命令).

-4, –ipv4
此选项对iptables和iptables-restore无效.

-6, –ipv6
如果一条规则使用了-6参数插入iptables-restore此操作将会被默默忽略,其他的用法会报错

[!] -p, –protocol protocol
检测规则或者数据包的传输协议.

[!] -s, –source address[/mask][,…]
指明源,地址可以是网路名称,主机名,网络地址 (with /mask), 或者普通ip

[!] -d, –destination address[/mask][,…]
指明目的

-m, –match match
指明一条匹配的规则进行使用

-j, –jump target
指明规则的目标(下一跳)

-g, –goto chain
指明进程应该在用户指定的链中继续执行

[!] -i, –in-interface name
数据包要通过或者接收的接口名称(只有进入INPUT, FORWARD and PREROUTING
链的数据包需要指明)

[!] -o, –out-interface name
指明数据包将要被送往的接口名称

-c, –set-counters packets bytes
此参数可以使管理员初始化数据包和字节计数(在 INSERT, APPEND, REPLACE操作中).

更多选项参数
以下为附加的参数选项以及用法讲解

-v, –verbose
显示操作的详细输出信息

-w, –wait [秒]
等待xtables锁,阻止一个程序的多实例同时运行,并且一段时间试图去获得执行锁。默认的,如果不能获取执行锁,程序将会退出。此参数将会使进程等待,一直到获得执行锁

-n, –numeric
数字化输出,ip地址和端口号将会以数字格式显示出来。默认的,此程序会尝试列出主机名称或者网络名称或者服务名称

-x, –exact
数字详述.显示具体的数据包值以及字节数,而不是大约的K’s(multiples of 1000) M’s (multiples of 1000K)G’s (multiples of 1000M),此参数只与-L参数相关

也可以根据防火墙的连接状态来设置策略:

五,实验:
iptables -A INPUT -m state –state NEW -i lo -j ACCEPT #设置状态为NEW但是经过本地回环接口的连接允许

iptable -A INPUT -m state –state NEW -p tcp –dport 22 -j ACCEPT #设置经过22端口的新状态允许连接

iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT #设置ESTABLISHED和RELATED状态的可以连接

实验:关于源地址转换和目的地址转换:
环境:实验主机配置双网卡,eth0(172.25.254.93),eth1(172.25.92.93),eth1相当于路由器,可以实现内网和外网之间通信的桥梁。
测试主机配置ip为(172.25.92.1),相当于内网主机,配置网关为(172.25.92.93)

源地址转换:
[root@93 ~]# sysctl -p | grep ip_forward
net.ipv4.ip_forward = 1
要保证此项值为1,如果为0,则不能实现路由转发
在/etc/sysctl.conf重添加即可
这里写图片描述
[root@93 ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to-source 172.25.254.93 #在93主机上添加策略:从本机上路由的数据包的源地址转变为172.25.254.93

测试,在172.25.92.1主机上:
这里写图片描述
从图中可以看见,虽然是测试主机(172.25.92.1)使用ssh连接的172.25.254.92,但是在92主机上显示的却是172.25.254.93主机连接的,这就是因为路由策略的原因。

目的地址转换:
[root@93 ~]# iptables -t nat -A PREROUTING -i eth0 -d 172.25.254.93 -j DNAT –to-dest 172.25.92.1 #将访问目的是172.25.254.93的连接转向172.25.92.1

测试:在172.25.254.92主机上:
这里写图片描述
可以看出虽然在92主机上使用ssh连接的是172.25.254.93,但是却将目的地转向172.25.92.1,这种结果就是因为路由的原因。

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值