转http://www.javashuo.com/article/p-awyxlafv-ma.html前端
iptables防火墙能够用于建立过滤(filter)与NAT规则。全部Linux发行版都能使用iptables,所以理解如何配置 iptables将会帮助你更有效地管理Linux防火墙。若是你是第一次接触iptables,你会以为它很复杂,可是一旦你理解iptables的工 做原理,你会发现其实它很简单。
linux
首先介绍iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。以下图所示。 bash
图: IPTables Table, Chain, and Rule Structure服务器
1、iptables的表与链网络
iptables具备Filter, NAT, Mangle, Raw四种内建表:ssh
1. Filter表tcp
Filter表示iptables的默认表,所以若是你没有自定义表,那么就默认使用filter表,它具备如下三种内建链:函数
2. NAT表性能
NAT表有三种内建链:测试
3. Mangle表
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具备5个内建链:
4. Raw表
Raw表用于处理异常,它具备2个内建链:
5.小结
下图展现了iptables的三个内建表:
图: IPTables 内建表
2、IPTABLES 规则(Rules)
牢记如下三点式理解iptables规则的关键:
目标值(Target Values)
下面是你能够在target里指定的特殊值:
若是你执行iptables –list你将看到防火墙上的可用规则。下例说明当前系统没有定义防火墙,你能够看到,它显示了默认的filter表,以及表内默认的input链, forward链, output链。
# iptables -t filter –list
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
查看mangle表:
# iptables -t mangle –list
查看NAT表:
# iptables -t nat –list
查看RAW表:
# iptables -t raw –list
!注意:若是不指定 -t选项,就只会显示默认的 filter表。所以,如下两种命令形式是一个意思:
# iptables -t filter –list
(or)
# iptables –list
如下例子代表在filter表的input链, forward链, output链中存在规则:
# iptables –list
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all — 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all – 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain RH-Firewall-1-INPUT (2 references)
num target prot opt source destination
1 ACCEPT all – 0.0.0.0/0 0.0.0.0/0
2 ACCEPT icmp – 0.0.0.0/0 0.0.0.0/0 icmp type 255
3 ACCEPT esp – 0.0.0.0/0 0.0.0.0/0
4 ACCEPT ah – 0.0.0.0/0 0.0.0.0/0
5 ACCEPT udp – 0.0.0.0/0 224.0.0.251 udp dpt:5353
6 ACCEPT udp – 0.0.0.0/0 0.0.0.0/0 udp dpt:631
7 ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:631
8 ACCEPT all – 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
9 ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
10 REJECT all – 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
以上输出包含下列字段:
3、清空全部iptables规则
在配置iptables以前,你一般须要用iptables –list命令或者iptables-save命令查看有无现存规则,由于有时须要删除现有的iptables规则:
iptables –flush
或者
iptables -F
这两条命令是等效的。可是并不是执行后就万事大吉了。你仍然须要检查规则是否是真的清空了,由于有的linux发行版上这个命令不会清除NAT表中的规则,此时只能手动清除:
iptables -t NAT -F
4、永久生效
当你删除、添加规则后,这些更改并不能永久生效,这些规则颇有可能在系统重启后恢复原样。为了让配置永久生效,根据平台的不一样,具体操做也不一样。下面进行简单介绍:
1.Ubuntu
首先,保存现有的规则:
iptables-save > /etc/iptables.rules
而后新建一个bash脚本,并保存到 /etc/network/if-pre-up.d/目录下:
#!/bin/bash
iptables-restore < /etc/iptables.rules
这样,每次系统重启后iptables规则都会被自动加载。
!注意:不要尝试在.bashrc或者.profile中执行以上命令,由于用户一般不是root,并且这只能在登陆时加载iptables规则。
2.CentOS, RedHat
# 保存iptables规则
service iptables save
# 重启iptables服务
service iptables stop
service iptables start
查看当前规则:
cat /etc/sysconfig/iptables
5、追加iptables规则
可使用iptables -A命令追加新规则,其中 -A表示 Append。所以, 新的规则将追加到链尾。
通常而言,最后一条规则用于丢弃(DROP)全部数据包。若是你已经有这样的规则了,而且使用 -A参数添加新规则,那么就是无用功。
1.语法
iptables -A chain firewall-rule
2.描述规则的基本参数
如下这些规则参数用于描述数据包的协议、源地址、目的地址、容许通过的网络接口,以及如何处理这些数据包。这些描述是对规则的基本描述。
-p 协议(protocol)
-s 源地址(source)
-d 目的地址(destination)
-j 执行目标(jump to target)
-i 输入接口(input interface)
-o 输出(out interface)
3.描述规则的扩展参数
对规则有了一个基本描述以后,有时候咱们还但愿指定端口、TCP标志、ICMP类型等内容。
–sport 源端口(source port)针对 -p tcp 或者 -p udp
–-dport 目的端口(destination port)针对-p tcp 或者 -p udp
-–tcp-flags TCP标志 针对-p tcp
-–icmp-type ICMP类型 针对-p icmp
4.追加规则的完整实例:仅容许SSH服务
本例实现的规则将仅容许SSH数据包经过本地计算机,其余一切链接(包括ping)都将被拒绝。
# 1.清空全部iptables规则
iptables -F
# 2.接收目标端口为22的数据包
iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT
# 3.拒绝全部其余数据包
iptables -A INPUT -j DROP
6、更改默认策略
上例的例子仅对接收的数据包过滤,而对于要发送出去的数据包却没有任何限制。本节主要介绍如何更改链策略,以改变链的行为。
1. 默认链策略
/!\警告:请勿在远程链接的服务器、虚拟机上测试!
当咱们使用-L选项验证当前规则是发现,全部的链旁边都有 policy ACCEPT标注,这代表当前链的默认策略为ACCEPT:
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp – anywhere anywhere tcp dpt:ssh
DROP all – anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
这种状况下,若是没有明确添加DROP规则,那么默认状况下将采用ACCEPT策略进行过滤。除非:
a)为以上三个链单独添加DROP规则:
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
b)更改默认策略:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
糟糕!!若是你严格按照上一节的例子配置了iptables,而且如今使用的是SSH进行链接的,那么会话恐怕已经被迫终止了!
为何呢?由于咱们已经把OUTPUT链策略更改成DROP了。此时虽然服务器能接收数据,可是没法发送数据:
# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp – anywhere anywhere tcp dpt:ssh
DROP all – anywhere anywhere
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
7、配置应用程序规则
尽管5.4节已经介绍了如何初步限制除SSH之外的其余链接,可是那是在链默认策略为ACCEPT的状况下实现的,而且没有对输出数据包进行限 制。本节在上一节基础上,以SSH和HTTP所使用的端口为例,教你们如何在默认链策略为DROP的状况下,进行防火墙设置。在这里,咱们将引进一种新的 参数-m state,并检查数据包的状态字段。
1.SSH
# 1.容许接收远程主机的SSH请求
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
# 2.容许发送本地主机的SSH响应
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
若是服务器也须要使用SSH链接其余远程主机,则还须要增长如下配置:
# 1.送出的数据包目的端口为22
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
# 2.接收的数据包源端口为22
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
2.HTTP
HTTP的配置与SSH相似:
# 1.容许接收远程主机的HTTP请求
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
# 1.容许发送本地主机的HTTP响应
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
3.完整的配置
# 1.删除现有规则
iptables -F
# 2.配置默认链策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# 3.容许远程主机进行SSH链接
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
# 4.容许本地主机进行SSH链接
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
# 5.容许HTTP请求
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
iptables命令是Linux上经常使用的防火墙软件,是netfilter项目的一部分。能够直接配置,也能够经过许多前端和图形界面配置。
iptables(选项)(参数)
-t<表>:指定要操纵的表; -A:向规则链中添加条目; -D:从规则链中删除条目; -i:向规则链中插入条目; -R:替换规则链中的条目; -L:显示规则链中已有的条目; -F:清楚规则链中已有的条目; -Z:清空规则链中的数据包计算器和字节计数器; -N:建立新的用户自定义规则链; -P:定义规则链中的默认目标; -h:显示帮助信息; -p:指定要匹配的数据包协议类型; -s:指定要匹配的数据包源ip地址; -j<目标>:指定要跳转的目标; -i<网络接口>:指定数据包进入本机的网络接口; -o<网络接口>:指定数据包要离开本机所使用的网络接口。
iptables命令选项输入顺序:
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动做
表名包括:
规则链名包括:
动做包括:
清除已有iptables规则
iptables -F iptables -X iptables -Z
开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #容许本地回环接口(即运行本机访问本机) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #容许已创建的或相关连的通行 iptables -A OUTPUT -j ACCEPT #容许全部本机向外的访问 iptables -A INPUT -p tcp --dport 22 -j ACCEPT #容许访问22端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #容许访问80端口 iptables -A INPUT -p tcp --dport 21 -j ACCEPT #容许ftp服务的21端口 iptables -A INPUT -p tcp --dport 20 -j ACCEPT #容许FTP服务的20端口 iptables -A INPUT -j reject #禁止其余未容许的规则访问 iptables -A FORWARD -j REJECT #禁止其余未容许的规则访问
屏蔽IP
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令 iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令 iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令 iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是
查看已添加的iptables规则
iptables -L -n -v Chain INPUT (policy DROP 48106 packets, 2690K bytes) pkts bytes target prot opt in out source destination 5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes) pkts bytes target prot opt in out source destination 5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
删除已添加的iptables规则
将全部iptables以序号标记显示,执行:
iptables -L -n --line-numbers
好比要删除INPUT里序号为8的规则,执行:
iptables -D INPUT 8
前提基础:
一、当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。
二、iptables实现防火墙功能的原理是:在数据包通过内核的过程当中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,iptables这款用户空间的软件能够在这5处地方写规则,对通过的数据包进行处理,规则通常的定义为“若是数据包头符合这样的条件,就这样处理数据包”。
三、iptables中定义有5条链,说白了就是上面说的5个钩子函数,由于每一个钩子函数中能够定义多条规则,每当数据包到达一个钩子函数时,iptables就会从钩子函数中第一条规则开始检查,看该数据包是否知足规则所定义的条件。若是知足,系统就会根据该条规则所定义的方法处理该数据包;不然iptables将继续检查下一条规则,若是该数据包不符合钩子函数中任一条规则,iptables就会根据该函数预先定义的默认策略来处理数据包
四、iptables中定义有表,分别表示提供的功能,有filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪),这些表具备必定的优先级:raw-->mangle-->nat-->filter
一条链上可定义不一样功能的规则,检查数据包时将根据上面的优先级顺序检查
一、目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①--->②;
二、若知足PREROUTING的nat表上的转发规则,则发送给FORWARD,而后再通过POSTROUTING发送出去,流程为: ①--->③--->④--->⑥
主机发送数据包时,流程则是⑤--->⑥
iptables安装配置
linux通常默认都已经安装iptables,只须要开启服务便可
service iptables start //启动
service iptables restart //重启
service iptables stop //关闭
iptables规则书写:
基本语法:iptables [-t 表] [操做命令] [链] [规则匹配器] [-j 目标动做]
表 | 说明 | 支持的链 |
---|---|---|
raw | 通常是为了避免再让iptables对数据包进行跟踪,提升性能 | PREROUTING、OUTPUT |
mangle | 对数据包进行修改 | 五个链均可以 |
nat | 进行地址转换 | PREROUTING、OUTPUT、POSTROUTING |
filter(默认) | 对包进行过滤 | INPUT、FORWARD、OUTPUT |
经常使用操做命令 | 说明 |
---|---|
-A | 在指定链尾部添加规则 |
-D | 删除匹配的规则 |
-R | 替换匹配的规则 |
-I | 在指定位置插入规则(例:iptables -I INPUT 1 --dport 80 -j ACCEPT(将规则插入到filter表INPUT链中的第一位上) |
-L/S | 列出指定链或全部链的规则 |
-F | 删除指定链或全部链的规则 |
-N | 建立用户自定义链[例:iptables -N allowed] |
-X | 删除指定的用户自定义链 |
-P | 为指定链设置默认规则策略,对自定义链不起做用 |
-Z | 将指定链或全部链的计数器清零 |
-E | 更改自定义链的名称[例:iptables -E allowed disallowed] |
-n | ip地址和端口号以数字方式显示[例:iptables -nL] |
经常使用规则匹配器 | 说明 |
---|---|
-p tcp/udp/icmp/all | 匹配协议,all会匹配全部协议 |
-s addr[/mask] | 匹配源地址 |
-d addr[/mask] | 匹配目标地址 |
--sport port1[:port2] | 匹配源端口(可指定连续的端口) |
--dport port1[:port2] | 匹配目的端口(可指定连续的端口) |
-o interface | 匹配出口网卡,只适用FORWARD、POSTROUTING、OUTPUT(例:iptables -A FORWARD -o eth0) |
-i interface | 匹配入口网卡,只使用PREROUTING、INPUT、FORWARD。 |
--icmp-type | 匹配icmp类型(使用iptables -p icmp -h可查看可用的ICMP类型) |
--tcp-flags mask comp | 匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记。(例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT 表示匹配SYN和ACK标记的数据包) |
目标动做 | 说明 |
---|---|
ACCEPT | 容许数据包经过 |
DROP | 丢弃数据包 |
REJECT | 丢弃数据包,而且将拒绝信息发送给发送方 |
SNAT | 源地址转换(在nat表上)例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1 |
DNAT | 目标地址转换(在nat表上)例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102 |
REDIRECT | 目标端口转换(在nat表上)例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80 |
MARK | 将数据包打上标记;例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60 |
PS:
一、目标地址转换通常在PREROUTING链上操做
二、源地址转换通常在POSTROUTING链上操做
保存和恢复iptables规则
使用iptables-save能够保存到特定文件中
iptables-save >/etc/sysconfig/iptables_save
使用iptables-restore能够恢复规则
iptables-restore</etc/sysconfig/iptables_save
iptables的进阶使用
一、limit限制流量:
-m limit --limit 1000/s #设置最大平均匹配速率
-m limit --limit-burst 15 #设置一开始匹配的最大数据包数量
-m limit --limit 5/m --limit-burst 15 #表示一开始能匹配的数据包数量为15个,每匹配到一个,limit-burst的值减1,因此匹配到15个时,该值为0,之后每过12s,limit-burst的值会加1,表示又能匹配1个数据包
例子:
iptables -A INPUT -i eth0 -m limit --limit 5/m --limit-burst 15 -j ACCEPT
iptables -A INPUT -i eth0 -j DROP
注意要点:
A、--limit-burst的值要比--limit的大
B、limit自己没有丢弃数据包的功能,所以,须要第二条规则一块儿才能实现限速的功能
二、time :在特定时间内匹配
-m time | 说明 |
---|---|
--monthdays day1[,day2] | 在每月的特定天匹配 |
--timestart hh:mm:ss | 在天天的指定时间开始匹配 |
--timestop hh:mm:ss | 在天天的指定时间中止匹配 |
--weekdays day1[,day2] | 在每一个星期的指定工做日匹配,值能够是1-7 |
例子:
iptables -A INPUT -i eth0 -m time --weekdays 1,2,3,4 -jACCEPT
iptables -A INPUT -i eth0 -j DROP
三、ttl:匹配符合规则的ttl值的数据包
参数 | 说明 |
---|---|
--ttl -eq 100 | 匹配TTL值为100的数据包 |
--ttl -gt 100 | 匹配TTL值大于100的数据包 |
--ttl -lt 100 | 匹配TTL值小于100的数据包 |
例子:
iptables -A OUTPUT -m ttl --ttl-eq 100 -j ACCEPT
四、multiport:匹配离散的多个端口
参数 | 说明 |
---|---|
--sports port1[,port2,port3] | 匹配源端口 |
--dports port1[,port2,port3] | 匹配目的端口 |
--ports port1[,port2,port3] | 匹配源端口或目的端口 |
例子:
iptables -A INPUT -m multiport --sports 22,80,8080 -j DROP
五、state:匹配指定的状态数据包
参数 | 说明 |
---|---|
--state value | value能够为NEW、RELATED(有关联的)、ESTABLISHED、INVALID(未知链接) |
例子:
iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
六、mark:匹配带有指定mark值的数据包
参数 | 说明 |
---|---|
--mark value | 匹配mark标记为value的数据包 |
例子:
iptables -t mangle -A INPUT -m mark --mark 1 -j DROP
七、mac:匹配特定的mac地址
例子:
iptables -A FORWARD -m mac --mac-source 00:0C:24:FA:19:80 -j DROP