iptables使用介绍
一、iptables包过滤防火墙基本概念
防火墙是工作在主机或者网络边缘的,可以对其所匹配到的报文根据我们事先定义好的规则做匹配检查对于能够被匹配到的报文出相应的处理动作
iptables/netfilter:
实际上iptables防火墙是包括netfilter和iptables两个部分,netfilter是内核中的防火墙框架,iptables是用户空间中的命令程序,所有这两者加起来才是一个完整的iptables。
四表:
raw:关闭NAT的连接追踪机制,防止在高并发的访问下服务器的内存溢出,它由PREROUTTING OUTPUT实现
mangle:可以对匹配到的报文的数据进行拆解,重新封装,它由五个链来实现
nat:网络地址转换,nat表可以由PREROUTING FORWARD POSTROUTING实现
filter:实现包过滤,可以由INPUT FORWARD OUTPUT实现
五链:
PREROUTING:在对数据包作路由选择前,应用此链中的规则
INPUT:当收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则
FORWARD:当收到需要通过防火墙转发给其他地址的数据包(转发)是应用此链中的规则
OUTPUT:当防火墙本周向外发送数据包(出站)时,应用此链中的规则
POSTROUTING:当对数据包做出路由现在后,应用此链中的规则
规则:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作做出处理
匹配条件:
基本匹配条件:netfilter自带的匹配机制
扩展匹配条件:由扩展模块引入的匹配机制
二、iptables基本使用命令介绍
命令格式:iptables [-t table] SUBCOMMAND chain [matches...] [target]
1、管理类的命令操作:
链管理:
-N:新增加一个自定义的链(自定义被内建链上的规则调用才生效,-j 自定义链名称)
-X:删除自定义的空链(引用计数为0的空链)
-P:设置链的默认策略
-E:重命名自定义的未被引用(引用计数为0)的链;
-F:清除
规则管理
-A:追加,默认为最后一个
-I:插入,默认为第一个
-D:删除指定的规则
-R:替换修改,将指定的链规则替换为新的规则
-Z:将packets和bytes计算器给重置为0
查看:
-L:列出规则列表
-n:以数字形式显示地址和端口
-v:显示详细的信息
-x:显示计数器的精确值而非单位换算后的结果
--line-numbers:显示链上的规则编号
实例:
iptables -I 2 INPUT -s 192.168.1.1 -d 192.168.1.2 -j DROP ###将此规则插入在input链的第2条
iptables -vnL ##显示详细信息iptables -vnL --line-number##显示链上的规则编号
iptables -F ##清空所有链上的规则iptables -F INPUT ##清空指定INPUT链上的所有规则iptables -D INPUT 1 ###删除INPUT链上的第一条规则
iptables -R INPUT 2 -s 192.168.22.2 -d 192.168.1.1 -j ACCEPT ###将INPUT链的第2条规则替换
iptables -P INPUT DROP ##设置INPUT链的默认规则为拒绝iptables -P OUTPUT DROP ##设置OUTPUT链的默认规则为拒绝iptables -P FORWARD DROP ###设置FORWARD链的默认规则为拒绝
2、匹配条件规则命令:
基本匹配:netfilter自带的匹配机制
[!] -s, --source address[/mask][,...]:原地址匹配
[!] -d, --destination address[/mask][,...]:目标地址匹配
[!] -i, --in-interface name:限制报文流入的接口,只能用于PREROUTING,INPUT及FORWARD;
[!] -o, --out-interface name:限制报文流出的接口,只能用于OUTPUT,FORWARD及POSTROUTING;
[!] -p {tcp|udp|icmp}:限制协议;
实例:拒绝192.168.1.0网段访问本机192.168.1.1
iptables -A INPUT -s 192.168.0.0/24 -d 192.168.1.1 -j REJECTiptables -A OUTPUT -s 192.168.1.1 -d 192.168.0.0/24 -j REJECT iptables -A INPUT -s 172.16.100.67 -d 172.16.0.0/16 -i eth0 -j DORP
扩展匹配:需要加载扩展模块
隐式扩展:可以不用使用-m选项专门加载相应模块;前提是要使用-p选项可匹配何种协议
显示扩展:必须由-m选项专门加载相应模块
【隐式扩展】
[!] -p 协议:tcp, udp, icmp, icmpv6, esp, ah, sctp, mh or "all"
-p tcp:
[!] --source-port,--sport port[:port]:匹配报文中的tcp首部的源端口;可以是端口范围
[!] --destination-port,--dport port[:port]:匹配报文中的tcp首部的目标端口;可以是端口范围
[!] --tcp-flags mask comp: (其中flags包括:syn,fin,ack,rst syn )
mask:需要检查的标志位列表,以逗号分隔
comp:必须为1的标志位,余下的出现在mask列表中的
-p udp:
[!] --source-port,--sport port[:port]:匹配报文中的udp首部的源端口;可以是端口范围
[!] --destination-port,--dport port[:port]:匹配报文中的udp首部的目标端口;可以是端口范围
-p icmp:
[!] --icmp-type {type[/code]|typename}
0/0:echo reply 回应
8/0:echo request 请求
实例:
允许192.168.1.0网段的访问本机192.168.1.1的ssh服务,其余全部拒绝
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.1 -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -d 192.168.1.0/24 -s 192.168.1.1 -p tcp --sport 22 -j ACCEPT iptables -P INPUT DORP iptables -P OUTPUT DORP iptables -P FORWARD DORP
###仅允许172.16.100.67主机ping任何人iptables -A INPUT -s 0/0 -d 172.16.100.67 -p icmp --icmp-type 0 -j ACCEPTiptables -A OUPUT -d 0/0 -s 172.16.100.67 -p icmp --icmp-type 8 -j ACCEPT
#####允许本机172.16.100.1 ping所有人,同时允许所有人ping本机iptables -A INPUT -s 0/0 -d 172.16.100.1 -p icmp --icmp-type 0 -j ACCEPTiptables -A OUTPUT -d 0/0 -s 172.16.100.1 -p icmp --icmp-type 8 -j ACCEPTiptables -A INPUT -s 0/0 -d 172.16.100.1 -p icmp --icmp-type 8 -j ACCEPTiptables -A OUTPUT -d 0/0 -s 172.16.100.1 -p imcp --icmp-type 0 -j ACCEPT
【显式扩展】:需要使用-m选项
multiport:多端口匹配
[!] --source-ports,--sports port[,port|,port:port]...指定多个原端口
[!] --destination-ports,--dports port[,port|,port:port]...指定多个目标端口
[!] --ports port[,port|,port:port]...指定多个端口,不限定源端口及目标端口
实例:开发本机的ssh Telnet和web服务
iptables -I INPUT -s 0/0 -d 172.18.100.6 -p tcp -m multiport --dports 22,23,80 -j ACCEPT(离散类型指定)iptables -I OUTPUT -d 0/0 -s 172.18.100.6 -p tcp -m multiport --sports 22:23,80 -j ACCEPT(连续及离散指定)
iprange:指明一段连续的ip地址范围做为源地址或目标地址匹配
[!] --src-range from[-to]:源地址范围
[!] --dst-range from[-to]:目标地址范围
实例:允许172.16.100.1到172.16.100.20范围内的主机访问mysql服务
iptables -A INPUT -s 0/0 -d 172.16.1.1 -p tcp --dport 3306 -m iprange --src-range 172.16.100.1-172.16.100.20 -j ACCEPTiptables -A OUTPUT -d 0/0 -s 172.16.1.1 -P tcp --sport 3306 -m iprange --dst-range 172.16.100.1-172.16.100.20 -j ACCEPT
string:对报文中的应用层数据做字符串匹配检测
--algo {bm|kmp}
[!] --string pattern:给定要检查的字符串模式
[!] --hex-string pattern:给定要检查的字符串模式;16进制编码
实例:任何人访问172.18.100.6web服务时候内容字符包含admin的拒绝
iptables -I OUTPUT -s 172.18.100.6 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "admin" -j REJECT
time:根据收到报文的时间/日期与指定的时间/日期范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间
--timestart hh:mm[:ss]:起始时间;
--timestop hh:mm[:ss]:结束时间
[!] --monthdays day[,day...]:匹配一个月中的哪些天;
[!] --weekdays day[,day...]:匹配一个周中的哪些天
实例:允许周一到周五早上9点到下午16点时间内172.16.100.1-172.16.100.100内的主机可以Telnet172.16.100.6
iptables -R INPUT 4 -d 172.16.100.6 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT
connlimit:根据每客户端主机做并发连接数限制,即每客户端最多可同时发起的连接数量
--connlimit-upto n:连接数量小于等于n则匹配;
--connlimit-above n:连接数量大于n则匹配
iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT ##最多可以连接2个
limit:基于令牌桶算法对收发报文的速率做匹配
--limit rate[/second|/minute|/hour|/day]
--limit-burst number 最大速率
iptables -R INPUT 3 -d 172.18.100.6 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT
state:是连接追踪机制的子集,用于对报文的状态做连接追踪,使用前需要装载此模块:modprobe nf_conntrack
[!] --state state
INVALID:无法识别的连接
ESTABLISHED:连接追踪模板当中存在记录的连接
NEW:连接追踪模板当中不存的连接请求
RELATED:相关联的连接
UNTRACKED:未追踪的连接
已经追踪到的并记录下来的连接:/proc/net/nf_conntrack
连接追踪功能所能够记录的最大连接数量(可调整):/proc/sys/net/nf_conntrack_max
实例:
iptables -A INPUT -d 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEP
REDORECT:端口重定向即端口映射
--to-ports port[-port]
实例:将172.16.100.67的80端口映射为8080
iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j REDIRECT --to-ports 8080
SNAT:使用在nat表中,仅可用使用POSTROUTING INPUT链
--to-source [ipaddr[-ipaddr]]
实例: 将内网的地址192.168.1.0/24使用转换为统一的地址与外部地址通信
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.100.6
DNAT:使用在nat表中,仅可用使用PREROUTING OUTPUT链
--to-destination [ipaddr[-ipaddr]][:port[-port]]
实例:将本地网络总的地址使用统一的地址向外发布服务
iptables -t nat -A PREROUTING -s 192.168.1.1/24 -j DNAT --to-destination 172.16.100.1
保存规则:
iptables-save >/PATH/TO/SOME_RULE_FILE
iptables -S >/PATH/TO/SOME_RULE_FILE
重载预存的规则:
iptables-restore < /PATH/FROM/SOME_RULE_FILE