防火墙之iptables和firewalld的前世今生.
防火墙之iptables详解.
防火墙之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.