防火墙之iptables详解

防火墙之iptables和firewalld的前世今生.
防火墙之iptables详解.
防火墙之iptables流量控制.

  • iptables 是一个命令行工具,位于用户空间,我们用这个工具操作netfilter。
  • netfilter 是防火墙真正的安全框架(framework),netfilter位于内核空间。Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:① 网络地址转换(Network Address Translate)。② 数据包内容修改。③ 数据包过滤的防火墙功能。

1、iptables 五链四表

## 1.1、iptables提供的链(chain) - `PREROUTING` 链:数据包进行路由决策前应用的规则,一般用于改变数据包的目标地址,不让别人知道我找的是谁(对进入的数据包进行预处理)。可以用于 NAT 等预处理操作。 - `POSTROUTING` 链:数据包从本机出去前,对数据包应用的规则,一般用于更改数据包的源地址信息,不让给别人知道我是谁(对输出的数据包进行预处理)。可以用于 NAT 等预处理操作。 - `INPUT` 链:数据包经由路由决策后,进入到本机处理时应用的规则,一般用于本机进程处理的数据包(数据包本机处理)。 - `FORWARD` 链:数据包经由路由决策后,本机不做处理,仅仅是转发数据包时应用的规则(数据包本机转发)。 - `OUTPUT` 链:新建数据包经路由决策后,从本机输出时应用的规则,一般用于本机处理后的数据包(数据包本机发出)。

当流量进入主机后,首先通过 prerouting 模块判断 是否为本机的请求,如果流量属于本机,则 通过 input 模块 进入到用户空间,然后通过 output 模块,最后通过 postrouting 模块转发到网卡,如果不是本机的流量则通过 forward 将流量发送到 postrouting 转发到网卡。

报文的流向:
到本机某进程的报文:PREROUTING --> INPUT
由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING

1.2、iptables提供的表(table)

  • filter 表:主要用于对数据包进行滤功能;根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG),所谓的防火墙其实基本上是指这张表上的过滤规则,对应内核模块iptables_filter;
  • nat 表:network address translation,网络地址转换功能;主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次,如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。对应内核模块iptables_nat;
  • raw 表:是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,在匹配数据包时,raw表的规则要优先于其他表,对应内核模块iptables_raw。我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中。
  • mangle 表:拆解报文,做出修改,并重新封装,主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。对应内核模块iptables_mangle;

1.3、链和表的关系

iptables中的4张"表"位于处于同一条"链"时,执行优先级次序(由高而低):raw --> mangle --> nat --> filter

1.4、规则匹配执行动作(target)

规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。

  • ACCEPT:接受允许数据包通过;

  • DROP:直接丢弃数据包,不回应任何信息,客户端只有当该链接超时后才会有反应;

  • REJECT:拒绝数据包,会给客户端发送一个数据包被丢弃的响应包的信息;

  • SNAT:S指Source,源 NAT (源地址转换)地址。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决私网用户用同一个公网IP上网的问题;

  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时化变的IP上;

  • DNAT:D指Destination,目的NAT,解决私网服务端,接收公网请求的问题。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址;

  • REDIRECT:在本机做端口映射;

  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键

  • 如果没有规则匹配成功:iptables 将根据表的默认策略来处理数据包。默认策略通常是接受或拒绝。

2、iptables 常用命令

2.1、查看指定表table的规则

1.列出filter表的所有规则【省略-t filter 默认为操作filter表】
iptables           -L
iptables -t filter -L 
2.列出filter表的所有规则详细信息
iptables -nvL -t filter
3.其他
iptables -t raw -L
iptables -t mangle -L
iptables -t nat -L
-t 指定要操作的表
-L 列出规则

所以,上述命令的含义为,注意,上图中显示的规则(绿色标注的部分为规则)是Centos6启动iptables以后默认设置的规则,我们暂且不用在意它们,上图中,显示出了3条链(蓝色标注部分为链),INPUT链、FORWARD链、OUTPUT链,每条链中都有自己的规则,前文中,我们打过一个比方,把"链"比作"关卡",不同的"关卡"拥有不同的能力,所以,从上图中可以看出,INPUT链、FORWARD链、OUTPUT链都拥有"过滤"的能力,所以,当我们要定义某条"过滤"的规则时,我们会在filter表中定义,但是具体在哪条"链"上定义规则呢?这取决于我们的工作场景。比如,我们需要禁止某个IP地址访问我们的主机,我们则需要在INPUT链上定义规则。因为,我们在理论总结中已经提到过,报文发往本机时,会经过PREROUTING链与INPUT链(如果你没有明白,请回顾前文),所以,如果我们想要禁止某些报文发往本机,我们只能在PREROUTING链和INPUT链中定义规则,但是PREROUTING链并不存在于filter表中,换句话说就是,PREROUTING关卡天生就没有过滤的能力,所以,我们只能在INPUT链中定义,当然,如果是其他工作场景,可能需要在FORWARD链或者OUTPUT链中定义过滤规则。

2.2、查看指定链chain下指定表table的规则

1.只查看指定表中的指定链的规则
iptables -t filter -L INPUT
iptables -vL INPUT
iptables -nvL INPUT
-n 不对IP地址进行名称反解,直接显示IP地址;

pkts:对应规则匹配到的报文的个数。
bytes:对应匹配到的报文包的大小总和。
target:规则对应的target,往往表示规则对应的"动作",即规则匹配成功后需要采取的措施。
prot:规则对应的协议,是否只针对某些协议应用此规则。
opt:规则对应的选项。
in:数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
out:数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。
source:规则对应的源头地址,可以是一个IP,也可以是一个网段。
destination:规则对应的目标地址。可以是一个IP,也可以是一个网段。

在这里插入图片描述

--line-numbers 显示规则的编号,该选项无短选项,但缩写为 --line。
iptables -nvL INPUT --line-numbers

在这里插入图片描述

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
policy 表示当前链的默认策略
packets 表示当前链默认策略匹配到的包的数量,0 packets表示默认策略匹配到0个包。
bytes 表示当前链默认策略匹配到的所有包的大小总和。

-x 表示显示精确的计数值
-v 才会显示出包的数量和所有包的大小总和。
iptables -nvL
iptables -nvxL

2.3、常见例子

1.查看对应表的所有规则,-t选项指定要操作的表,省略"-t 表名"时,
默认表示操作filter表,-L表示列出规则,即查看规则。
iptables -t 表名 -L

2.查看指定表的指定链中的规则。
iptables -t 表名 -L 链名

3.查看指定表的所有规则,并且显示更详细的信息(更多字段),
-v表示verbose,会显示出"计数器"的信息。
iptables -t 表名 -v -L
iptables -t 表名 -vL

4.表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址。
iptables -t 表名 -n -L

5.表示查看表的所有规则,并且显示规则的序号
--line-numbers / --line 选项表示显示规则的序号。注意:此选项均为长选项,不能与其他短选项合并。
iptables --line-numbers -t 表名 -L
iptables --line -t 表名 -L

6.表示查看表中的所有规则,并且显示更详细的信息(-v选项)。
计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值,
-x选项表示显示计数器的精确值。
iptables -t 表名 -v -x -L

7.综合一下 什么意思呢?
iptables --line -t filter -nvxL
iptables --line -t filter -nvxL INPUT

2.4、iptables 清空所有规则

>清除所有iptables规则
iptables -F
iptables -Z
iptables -X

iptables --table filter -nL INPUT
iptables --table filter -nvL INPUT

2.5、iptables 增加规则

拒绝 源ip 192.168.168.200 上的所有报文访问当前机器;
DROP 直接丢弃掉报文;REJECT 则返回一个数据包丢弃的响应信息。
iptables -t filter -I INPUT -s 192.168.168.200 -j DROP

2.6、iptables 删除规则

1.第一种删除规则是,直接把 -I 参数改成 -D 。
iptables -t filter -D INPUT -s 192.168.168.200 -j DROP

2.在查询命令后面加 --line 查询编号,然后通过编号删除。
iptables -L -t filter --line
iptables -t filter -D INPUT 1
iptables -t filter -D INPUT 3

2.7、iptables 修改规则


2.8、iptables 保存备份规则

1.iptables 保存规则
service iptables save

2.将iptables规则备份保存在指定文件中。
iptables-save > 文件名

3.通过备份iptables规则恢复防火墙规则。
iptables-restore < 文件名

4.iptables规则保存在这个文件中 /etc/sysconfig/iptables。
  保存 iptables 规则的时候,其实也可以使用下面的命令。
iptables-save > /etc/sysconfig/iptables

2.9、iptables 自定义新的规则链(chain)

-N:new, 自定义一条新的规则链。
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除。
-X:delete,删除自定义的空的规则链。
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受, DROP:丢弃。

1.自定义一条新的规则链chain
iptables -N test_chain
2.在nat表中自定义一条新的规则链
iptables -N test_chain -t nat
3.关联自定义链chain
iptables -A INPUT -s 172.31.0.0/16 -j TEST_CHAIN

3、iptables规则脚本参考模板

#!/bin/bash
#
#永久开启防火墙
#systemctl start iptables
#systemctl enable iptables
chkconfig iptables on
#清除所有iptables规则
iptables -F
iptables -X
iptables -Z
#设置INPUT链的默认策略为DROP
iptables -P INPUT DROP
#设置OUTPUT链的默认策略为ACCEPT
iptables -P OUTPUT ACCEPT
#开启ssh 22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#开启mds 80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p udp --dport 80 -j ACCEPT
#开启Oracle 11521端口
iptables -A INPUT -p tcp --sport 11521 -j ACCEPT
iptables -A INPUT -p udp --sport 11521 -j ACCEPT
#开启de 27001端口
iptables -A INPUT -p tcp -s 59.1.12.44 --sport 27001 -j ACCEPT
iptables -A INPUT -p udp -s 59.1.12.44 --sport 27001 -j ACCEPT
iptables -A INPUT -p tcp -s 59.1.12.44 --dport 27001 -j ACCEPT
iptables -A INPUT -p udp -s 59.1.12.44 --dport 27001 -j ACCEPT
#允许外部主机ping内部主机
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
#允许内部主机ping外部主机
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

#允许外部eclipse使用de
#iptables -A INPUT -p tcp -s 59.1.12.2 --dport 27001 -j ACCEPT
#iptables -A INPUT -p udp -s 59.1.12.2 --dport 27001 -j ACCEPT

#保存规则
#systemctl restart iptables
service iptables save

4、常见命令参数介绍

iptables --help
----------------------------------------------
iptables v1.4.21

Usage: iptables -[ACD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

Commands:
Either long or short options are allowed.
  --append  -A chain		Append to chain
  --check   -C chain		Check for the existence of a rule
  --delete  -D chain		Delete matching rule from chain
  --delete  -D chain rulenum
				Delete rule rulenum (1 = first) from chain
  --insert  -I chain [rulenum]
				Insert in chain as rulenum (default 1=first)
  --replace -R chain rulenum
				Replace rule rulenum (1 = first) in chain
  --list    -L [chain [rulenum]]
				List the rules in a chain or all chains
  --list-rules -S [chain [rulenum]]
				Print the rules in a chain or all chains
  --flush   -F [chain]		Delete all rules in  chain or all chains
  --zero    -Z [chain [rulenum]]
				Zero counters in chain or all chains
  --new     -N chain		Create a new user-defined chain
  --delete-chain
            -X [chain]		Delete a user-defined chain
  --policy  -P chain target
				Change policy on chain to target
  --rename-chain
            -E old-chain new-chain
				Change chain name, (moving any references)
Options:
    --ipv4	-4		Nothing (line is ignored by ip6tables-restore)
    --ipv6	-6		Error (line is ignored by iptables-restore)
[!] --protocol	-p proto	protocol: by number or name, eg. `tcp'
[!] --source	-s address[/mask][...]
				source specification
[!] --destination -d address[/mask][...]
				destination specification
[!] --in-interface -i input name[+]
				network interface name ([+] for wildcard)
 --jump	-j target
				target for rule (may load target extension)
  --goto      -g chain
                              jump to chain with no return
  --match	-m match
				extended match (may load extension)
  --numeric	-n		numeric output of addresses and ports
[!] --out-interface -o output name[+]
				network interface name ([+] for wildcard)
  --table	-t table	table to manipulate (default: `filter')
  --verbose	-v		verbose mode
  --wait	-w [seconds]	maximum wait to acquire xtables lock before give up
  --wait-interval -W [usecs]	wait time to try to acquire xtables lock
				default is 1 second
  --line-numbers		print line numbers when listing
  --exact	-x		expand numbers (display exact values)
[!] --fragment	-f		match second or further fragments only
  --modprobe=<command>		try to insert modules using this command
  --set-counters PKTS BYTES	set the counter during insert/append
[!] --version	-V		print package version.
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值