赞
踩
netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,iptables免费开源,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
iptables 是用来设置、维护和检查 Linux 内核的防火墙 IP 报文过滤规则和网络地址转换规则的。
Linux 防火墙通常包含两部分,分别为 iptables 和 netfilter。iptables 是 Linux 管理防火墙规则的命令行工具,处于用户空间。netfilter 执行报文过滤,处于 Linux 内核空间。
iptables由C语言实现,由2部分组成,内核 netfilter 和用户空间工具 iptables。管理员通过 iptables 工具集和内核打交道,将防火墙规则写入内核中。内核 netfilter 执行报文过滤规则。按功能划分为5个表,分别是分别为 filter
、nat
、mangle
、raw
和security
。分别用于实现包过滤,网络地址转换、包重构(修改)、数据跟踪处理和安全处理。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。
filter 是 iptables 的默认表,主要用于报文过滤,在这里根据报文的内容对报文进行丢弃或者接收。它包含有 3 个内置规则链。
注意:
● 经过本机转发的报文经过 FORWARD 链,不经过 IPPUT 链和 OUTPUT 链。
● 本机产生的报文经过 OUTPUT 链,其他的链不经过。
● 去往主机的报文经过该主机的 INPUT 链,其他的链不经过。
nat 用来完成源/目的地址和端口的转换,当一个报文在创建一个新的连接时进入该表。
它也有 3 个内置规则链。
通过目的地址转换,你可以将服务器放在防火墙后面,并使用私有 IP 地址。一些协议通过 nat 转换有困难(例如 FTP 或 SIP),连接跟踪将打开这些协议的数据/媒体流路径。nat表不能用于报文过滤和报文修改,因为每一个连接流仅有一次机会进入该表中的规则链。
网络地址转换在路由功能前后都可能发生,源地址转换是在数据包通过路由之后在POSTROUTING 规则链进行地址转换。目的地址转换是在路由之前,在 PREROUTING 规则链进行地址转换。
这个表主要用来进行报文修改,有 5 个内置规则链。
通常使用该表进行报文修改,以便进行 QoS 和策略路由。通常每一个报文都进入该表,但不使用它来做报文过滤。
这个表很少被用到,主要用于配置连接跟踪相关内容,在 ip_conntrack 之前调用。它提供了两个内置规则链。
这里是能够在连接跟踪生效前处理报文的地方,你可以标记符合某种条件的报文不被连接跟踪处理。一般很少使用。
这个表用于安全 Linux 的防火墙规则,是 iptables 最近的新增表,在实际项目中还很少用到。
防火墙规则检测报文的特征是否符合规则,如果匹配,就进入规则的处理目标(TARGET)中。如果报文不匹配则进入该规则链的下一条规则进行检测。就这样逐条规则进行比较,直到整个规则链比较完成。
规则的处理目标可以自定义,也可以使用系统内置的。
REJECT 和 DROP 一样丢弃报文,但 REJECT 的不同之处在于同时还向发送者返回一个 ICMP 错误消息。REJECT给了发送者一个错误反馈,这样发送者可以不在发送报文,从而在特定条件下减少重复报文。使用DROP的话,发送者只能等待超时处理。例如,禁止访问主机上80 端口的服务,访问者将收到端口不可达的 ICMP 消息。
#>iptables -A IPNUT -p tcp --dport 80 -j REJECT
DROP 和 REJECT 含义的比较
DROP会丢弃报文,可减少暴露更安全,然而在调试网络问题时会遇到困难,应用程序也不知所措。
REJECT将响应一个 ICMP 目的端口不可达消息,这样连接将立即失败。但是这样可能会给不法分子可乘之机,不断尝试访问,产生大量ICMP数据报,导致占用所有的带宽而合法的连接不可用(DOS攻击)。
那么总结起来,DROP和REJECT有以下几点区别:
DROP
REJECT
该目标处理方式用于局域网内的多个服务器需要对互联网的机器提供服务时。
这个目标是用来实现目的网络地址转换的,就是重写报文的目的 IP 地址。
如果一个报文被匹配了,那么和它属于同一个流的所有报文都会被自动转换,然后就可以被路由到正确的主机或网络。
这个处理目标仅可以用在 nat 表中的 PREROUTING
和OUTPUT
链以及被这些链调用的自定义链中。
例如将访问路由器的 80 端口的流量重定向到 192.168.6.100 上:
#>iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination
192.168.6.100
这样 Web 服务器就可以搭建在局域网的主机(192.168.6.100)上对外提供服务。对外仅有路由器的 IP 地址暴露给用户,也节省了 IP 资源。处理流程如下:
(1)报文进入防火墙之后,将目标地址修改为 192.168.6.100,然后离开防火墙到达HTTP 服务器。
(2)HTTP 服务器处理完成后,将源地址改为目标地址,使用自身 IP 作为源地址发送报文。
(3)防火墙收到响应报文后将报文的源地址转换为防火墙的出接口地址,然后返回给请求方。
整个通信流程完成。
这个目标处理方式经常用于仅有少量固定 IP 地址上网的情形,局域网的私有地址在访问因特网时,
源地址被路由器外网地址替换。
仅仅在 nat 表的 POSTROUTING 和 INPUT 链,以及和被这些链调用的自定义链中可以使用。
它指定报文的源地址将被修改,它至少需要一个参数-源地址,报文的源地址将被指定地址替换。
此连接的后续报文并不进入该规则中,连接中的报文源 IP 均被自动替换。
该目标处理方式命令如下:
#>iptables -t nat -A POSTROUTING –s 192.168.6.0/24 –o eth0 \
-j SNAT --to-source 10.0.2.15
该目标处理方式非常常见,它被专门设计用于那些动态获取 IP 地址的连接, 比如拨号上网、DHCP连接等。
这个处理目标和SNAT处理目标作用是一样的 , 区别就是它不需要指定源地址 。
如果你有固定的 IP 地址,还是用 SNAT 处理目标,这样可以节省计算资源。
注意,
MASQUERADE 只能用于 nat 表的 POSTROUTING 链。例如,局域网来自192.168.6.0
网络的报文通MASQUERADE
进行源地址转换:
#>iptables -t nat -A POSTROUTING –s 192.168.6.0/24 –o eth0 -j MASQUERADE
为匹配的报文开启内核记录。它有以下几条选项可以设置。
只适用于 nat 表的 PREROUTING 和 OUTPUT 链,以及它们调用的用户自定义链。
它修改报文的目标 IP 地址来发送报文到机器自身(本地生成的报文被设置为地址 127.0.0.1)。
经常用于 HTTP 代理,例如将 80 端口的 HTTP 请求重定向到 SQUID 的 3128 端口。它包含一个选项:
--to-ports []
指定使用的目的端口或端口范围。不指定的话,目标端口不会被修改。只能用于指定了 TCP 或 UDP 的规则。
注意, iptables 中的所有表都是小写字母表示,内置规则链均大写字母表示,所有处理目标均以大写字母表示。
(1)当一个数据包进入网卡时,它首先进入PREROUTING
链,内核根据数据包目的IP判断是否需要转送出去。
(2)如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT
链。数据包到了INPUT
链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT
链,然后到达POSTROUTING
链输出。
(3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD
链,然后到达POSTROUTING
链输出。
Raw——mangle——nat——filter;规则链之间的优先顺序(分三种情况):
第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。
第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
报文匹配规则通常有多种,常见的有根据数据链路层、IP 层及传输层特征进行匹配,甚至可以根据应用层特征进行匹配,例如用户、域名以及内容匹配等。
#>iptables -I INPUT -m mac --mac-source 28:D2:44:15:D5:A4 -j DROP
-p
用于匹配 IP 层报头所指定的传输层协议。常见的协议为 TCP、UDP、IGMP、ICMP#>iptables -A FORWARD -p UDP --m udp dport 5060 -j DROP
-s
和 -d
用于匹配 IP 报文的源和目标 IP 地址。
案例:禁止 192.168.1.0 网段访问本机
#>iptables -A INPUT -s 192.168.1.0/24 -j DROP
owner 模块用于匹配报文发起者,用于本机进程产生的报文,一般为用户或用户组 ID。
案例:允许 1002 用户进程的报文通过
#>iptables -I OUTPUT -m owner --uid-owner 1002 -j ACCEPT
-i [name]:这是报文经由该接口接收的流入接口名称,报文通过该网卡接口接收
(在规则链 INPUT、FORWORD 和 PREROUTING 中进入的报文)。
-o [name]:这是报文经由该接口发出的流出接口名称,报文通过网卡该口发送(在
规则链 FORWARD、OUTPUT 和 POSTROUTING 中送出的报文)。
当在接口名称前使用“!” 修饰后,指的是不为该接口的报文,如果接口名后面加上“+”,则所有以此接口名开头的接口都会被匹配。如果不指定这个选项,那么将匹配任意网卡接口的报文。
conntrack
连接跟踪是有状态防火墙的核心机制,用于存取这个报文的连接跟踪状态来计算匹配返回的报文。state
是连接跟踪的子集,用于存取连接跟踪的报文状态。可选的状态列表如下。
-j CT -notrack
进行了设置。#>iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables 工具提供了管理防火墙规则的功能,以下将介绍增加、删除、查看规则功能如何使用。
一个防火墙规则包含报文匹配规则和处理目标,匹配规则用于检测报文是否符合该规则标准。一般根据报文的 IP 特征进行匹配,典型根据报文协议、IP 地址和端口进行匹配。
查看iptables使用,请使用iptables -h
命令。
注意:规则在规则链中的规则编号不是固定的,如果删除前面的规则,则后面的规则自动往前移动。
filter
表。iptables -t nat -n -L
,注意经常使用的-n
选项,是为了避免长时间的 DNS 解析。iptables -F
清空所选的规则链中的规则。如果没有指定链,则清空指定表中的所有链的规则。如果什么都没有指定,就清空默认表所有的链规则。当然也可以一条一条地删除,但用这个命令会比较方便。例如清空 filter 表中 INPUT 链的规则。
iptables -t filter -F INPUT
(1)默认策略。
每一条内置链的策略都是用来处理那些在相应的规则链中没有被规则匹配的报文。也就是说,如果有一个报文没有被规则集中的任何规则匹配,那默认策略就会命中,执行默认策略的行为。
一般有两种策略行为,默认通过(ACCEPT)和默认丢弃(DROP),在白名单模式会使用默认丢弃,在黑名单模式下会默认通过。设置命令形式如下:
iptables [-P {chain} {policy}]
例如设置输入链为默认拒绝:
#>iptables -P INPUT DROP。
(2)自定义规则链的创建。
对于复杂的规则链,我们通常需要自定义实现,并将其加入到已有规则链上。这样,方便我们删除和载入。
自定义规则链设置命令如下:
#>iptables -N UDP_FILTER
(3)清空整个防火墙。
通常在设置防火墙规则之前,需要清空之前设置的规则。相关命令如下:
#>iptables -F
#>iptables -t nat -F
#>iptables -t mangle –F
(4)典型的路由器配置。
通常的需求是这样的:从局域网发起的流量均可以通过,从互联网发起的主动流量不能通过,从互联网来的被动报文也允许通过,因为这是局域网主机请求的响应报文。所有局域网的请求转发后均进行网络地址转换,将源地址改为路由器地址。
WAN=eth0
LAN=eth1
iptables -t filter -P FORWARD DROP
#局域网发起的连接进行转发
#所有转发流量均默认禁止。
iptables -t filter -A FORWARD -i $LAN -j ACCEPT
#对所有符合连接跟踪状态的报文进行转发。
iptables -t filter -A FORWARD -m state --state RELATED, ESTABLISHED
-j ACCEPT
#所有去往互联网的流量均进行地址伪装,即源地址改为路由器地址。
iptables -t nat -A -o $WAN -j MASQUERADE
删除防火墙的配置,可以逐条删除规则,也可以直接清空规则,并设置其默认策略。
#恢复内置链默认策略
iptables -t filter -P FORWARD ACCEPT
iptables -t filter -P INPUT ACCEPT
#以下命令清空表中所有的规则
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t raw -F
更多详细的iptables规则,请参考man iptables
iptables 提供了两个很有用的工具用来处理大规则集:iptables-save 和 iptables-restore,它们把规则存入一个与标准脚本代码只有细微差别的特殊格式的文件中,或从中恢复规则。
iptables-save:导出iptables
规则到标准输出(即屏幕)中,我们使用 shell 的重定向命令可以将规则写入文件中。内容格式和 iptables
类似但稍有不同,这个格式便于程序解析。
iptables-restore:用于加载导出的防火墙规则,使用标准输入的内容来导入,一般都是通过 shell 提供的重定向从文件中读取规则之后来向内核导入规则。
一般的 iptables
一次仅执行一条指令,如果对于很大的规则集也采用iptables
来设置,那就需要反复在内核和用户空间进行通信,这样将浪费很多的 CPU 时间,而这两个命令通过一次调用就可以装载和保存整个规则集,这样节省了大量的时间。
删除INPUT链的第一条
iptables -D INPUT
拒绝进入防火墙的所有ICMP协议数据包
iptables -I 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.11 -j REJECT
iptables -A FORWARD -s 192.168.0.0/ -j ACCEPT
说明:注意要把拒绝的放在前面不然就不起作用了啊。
丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包
iptables -A INPUT -i eth1 -s 192.168.0.0/ -j DROP
iptables -A INPUT -i eth1 -s 172.16.0.0/ -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/ -j DROP
封堵网段(192.168.1.0/24),两小时后解封
iptables -I INPUT -s 10.20.30.0/ -j DROP
iptables -I FORWARD -s 10.20.30.0/ -j DROP
at now hours at> iptables -D INPUT at> iptables -D FORWARD
说明:这个策略咱们借助crond计划任务来完成,就再好不过了
只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机
iptables -A INPUT -p tcp --dport -s 202.13.0.0/ -j ACCEPT
iptables -A INPUT -p tcp --dport -j DROP
说明:这个用法比较适合对设备进行远程管理时使用,比如位于分公司中的SQL服务器需要被总公司的管理员管理时
允许本机开放从TCP端口20-1024提供的应用服务
iptables -A INPUT -p tcp --dport : -j ACCEPT
iptables -A OUTPUT -p tcp --sport : -j ACCEPT
允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包
iptables -A FORWARD -s 192.168.0.0/ -p udp --dport -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/ -p udp --sport -j ACCEPT
禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机
iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP
iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包
iptables -A FORWARD -m mac --mac-source :0c::::3F -j DROP
说明:iptables中使用“-m 模块关键字”的形式调用显示匹配。咱们这里用“-m mac –mac-source”来表示数据包的源MAC地址
允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280
iptables -A INPUT -p tcp -m multiport --dport ,,,,: -j ACCEPT
说明:这里用 “-m multiport –dport” 来指定目的端口及范围
禁止转发源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
说明:此处用“-m –iprange –src-range”指定IP范围
禁止转发与正常TCP连接无关的非—syn请求数据包
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
说明:“-m state”表示数据包的连接状态,“NEW”表示与任何连接无关的,新的嘛!
拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包
iptables -A INPUT -p tcp -m state --state NEW -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
说明:“ESTABLISHED”表示已经响应请求或者已经建立连接的数据包,“RELATED”表示与已建立的连接有相关性的,比如FTP数据连接等
只开放本机的web服务(80)、FTP(20、21、20450-20480),放行外部主机发住服务器其它端口的应答数据包,将其他入站数据包均予以丢弃处理
iptables -I INPUT -p tcp -m multiport --dport ,, -j ACCEPT
iptables -I INPUT -p tcp --dport : -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
删除所有现有规则
iptables -F
设置默认的chain 策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
阻止某个特定的 IP 地址
BLOCK_THIS_IP="x.x.x.x"
iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP
允许全部进来的(incoming)SSH
iptables -A INPUT -i eth0 -p tcp --dport -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport -m state --state ESTABLISHED -j ACCEPT
只允许某个特定网络进来的 SSH
iptables -A INPUT -i eth0 -p tcp -s 192.168.200.0/ --dport -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport -m state --state ESTABLISHED -j ACCEPT
允许进来的(incoming)HTTP
iptables -A INPUT -i eth0 -p tcp --dport -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport -m state --state ESTABLISHED -j ACCEPT
多端口(允许进来的 SSH、HTTP 和 HTTPS)
iptables -A INPUT -i eth0 -p tcp -m multiport --dports ,, -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports ,, -m state --state ESTABLISHED -j ACCEPT
允许出去的(outgoing)SSH
iptables -A OUTPUT -o eth0 -p tcp --dport -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport -m state --state ESTABLISHED -j ACCEPT
允许外出的(outgoing)SSH,但仅访问某个特定的网络
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.101.0/ --dport -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport -m state --state ESTABLISHED -j ACCEPT
允许外出的(outgoing) HTTPS
iptables -A OUTPUT -o eth0 -p tcp --dport -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport -m state --state ESTABLISHED -j ACCEPT
对进来的 HTTPS 流量做负载均衡
iptables -A PREROUTING -i eth0 -p tcp --dport -m state --state NEW -m nth --counter --every --packet -j DNAT --to-destination 192.168.1.101:
iptables -A PREROUTING -i eth0 -p tcp --dport -m state --state NEW -m nth --counter --every --packet -j DNAT --to-destination 192.168.1.102:
iptables -A PREROUTING -i eth0 -p tcp --dport -m state --state NEW -m nth --counter --every --packet -j DNAT --to-destination 192.168.1.103:
NAT、SNAT、DNAT以及基于iptables的DNAT和SNAT将web服务器发布的搭建
iptables之实现DNAT对内网web服务器的发布
Linux 常用工具iptables
智能路由器开发指南.pdf
欢迎关注我的公众号“虎哥 LoveDroid”,原创技术文章第一时间推送。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。