iptables规则初步
1.iptables基础:
iptables是包过滤型防火墙,对于防护主要是基于对于数据包的分析,然后与规则进行对比,对于规则外的进行防护,对于规则内的给与放行。iptables的规则是表与链的形式,而且遵循模块化开发的原则,方便进行管理。
1.1 表的分类:
防火墙表分类:每一种功能都是一张表(table)
filter:过滤,防火墙;主要跟进入linux本机的数据包有关,是默认的table
mangle:拆解报文,按需修改,并重新进行封装
nat:network address translation,网络地址转换。用于修改源ip或目标ip,也可以修改端口。与linux主机无关,主要与linux主机后的局域网内计算机有关。
raw:关闭nat表上启用的连接追踪机制。
1.2 链的分类:
内置链,每个链对应一个钩子
PREROUTING
INPUT
OUPUT
FORWARD
POSTROUTING
自定义链:用于内置链的扩展与补充,可实现更灵活的规则组织管理机制,需要手动添加关联关系
1.3 表与链的联系
filter:INPUT,FORWARD,OUTPUT
mangle:PROROUTING,INPUT,FPRWADR,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSROUTIING,nat一般只转换地址
raw:PREROUTING,OUTPUT
2.iptables的规则管理:
格式:
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table:指表的分类,包括filter、nat、mangle、raw四种,常用的只有filter、nat
2.1 规则链管理:
-N:new,新定义一条新的规则链
-X:delete,删除新定义的规则链。注意:内置规则链是无法删除的,只能删除自己设置的
-P:Policy,设置默认策略,对filter表中的链而言,其默认策略有
ACCEPT:接收,设置白名单
DROP:丢弃,较常用
REJECT:拒绝,一般不使用
-E:重命名自定义链,自定义的未被引用的链,即引用次数为0的链才能被重命名,被删除
iptables -F
iptables -Z
iptables -X
2.2 规则管理:
-A:append,追加
-I:insert,插入,要指明位置,省略时表示第一条
-D:delete,删除
1.指明规则序号
2.指明规则本身
-R:replace,替换指定链上的指定规则
-F:flush,清空指定的规则链
-Z:zero,置零
iptables的每条规则都有两个计数器
1.匹配到的报文的个数
2.匹配到的所有报文的大小之和
-S:selected,选择显示
iptables -P INPUT DROP #将所有来自外界的请求全部丢弃
iptables -P OUTPUT ACCEPT #将来自本机的请求全部接收
iptables -P FORWARD ACCEPT
iptables -t nat -P PROROUTING ACCEPT
iptables-save #查看设置的规则
iptables-save -t filter #仅查看filter相关规则
2.3 查看:
-L:list,列出指定链上的所有规则
-n:以数字格式显示地址和端口号
-v:verbose,详细信息,-vv更详细的
-x:exctly,精确值,显示计数器结果的精确值而非单位换算后的结果
--line-number:显示规则的序号
chain:指明是哪个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
iptables -tnL
iptables -nvL
iptables -nvvL
2.4处理动作:
-j targetname [per-target-options]
ACCEPT, DROP, REJECT
RETURN:返回调用的链
REDIRECT:端口重定向
LOG:日志
MARK:防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQERADE:地址伪装
3.规则设置与相应的匹配条件
3.1基本匹配条件
基本匹配:无需加载任何模块,由iptables或nefiter自行提供
[!]-s,--sorce address[/mask][,....]:对于进入的信息做匹配,检测报文中的源ip地址是否符合此处指定的地址或范围
[!]-d,--destination address[/mask][,...]:对于输入的信息做匹配,检查输出的目的ip地址是否符合
[!]-p,--protocol protocol,限定指定的协议,是一种扩展匹配,每一种协议都有相应的扩展
protocol:常用的有tcp,udp,icmp
[!]-i,--in-interface name:限制数据报文流入的接口,只能应用于数据报文流入的环节,即只能应用于PREROUTIG,INPUT,FORWARD链
[!]-o,--out-interface name:限制数据报文流出的接口;只能应用于数据报文流出的环节,即只能应用于FORWARD,OUTPUT,POSTROUTING
3.2 隐式扩展匹配条件
经由扩展模块引入的机制,需要加载扩展模块,方可生效;分为显式匹配与隐式匹配,-m matchname
隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块
3.2.1 tcp相关
[!] --source-port,--sport port [:port]:匹配报文的源端口,也可以指定端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端端口,也可以指定端口范围
[!] --tcp-flags mask comp
cpmp:SYN,ACK,FIN,RST
例:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;
[!] --syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“;
3.2.2 udp相关
[!] --source-port,--sport port[:port]:匹配报文的源端口,可以是端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端口,可以是端口范围
3.2.3 icmp相关
[!] --icmp-type {type[/code][typename]}
echo-request:8,请求
echo-reply:0,回应
3.3 显式扩展匹配条件
显示匹配:必须要手动加载扩展模块,-m matchname [per-match-options]
3.3.1 multiport扩展
以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,--sport port[,port|,port:port]...:指定多个源端口
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口
[!] --ports port[,port|,port:port]...:指明多个端口
例:来自172.18.0.0/16的网络中有关tcp/80,tcp/22端口的,发往172.18.100.67(本机)的数据包全部接收
iptables -A INPUT -s 172.18.0.0/16 -d 172.18.100.67 -p tcp -m multiport -dports 22,80 -j ACCEPT
3.3.2 iprange扩展
指明连续的(但不为整个网络的)ip地址范围
[!] --src-range from[-to]:源ip地址
[!] --dst-range from[-to]:目标ip地址
例:对于来自172.18.100.5-172.18.100.10的tcp/80的web访问,172.18.100.67(本机)全部丢弃
iptables -A INPUT -d 172.18.100.67 -p tcp --dport 80 -m iprange --src-range from 172.18.100.5-172.18.100.10 -j DROP
3.3.3 string扩展
对于报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore,BM算法在移动模式串的时候是从左到右,而进行比较的时候是从右到左的。
kmp:
[!] --sring pattern:给定要检测的字符串模式
[!] --hex-string pattern:要检测的字符串模式,16进制格式
例:对于172.18.100.67而言,从tcp/80端口发往外部的,发出的的信息中含有old内容的全部不允许发出
iptables -I OUPUT -s 172.18.100.67 -d 0/0 -p tcp ---sport 80 -m string --algo bm --string "old" -j REJECT
3.3.4 time扩展
根据报文到达的时间日期与指定的时间日期范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
可以做网络连接访问控制,限制网络连接等服务
[!] --mouthdays day[,day...]
[!] --weekdays day[,day...]
--kerneltz:使用内核上的时区,而非默认的UTC
例:限制172.18.200.67对于172.18.0.0/16区域的web访问(通过tcp/80端口),每周的周六,周日的14:30-18:30连接访问直接丢弃
iptables -A INPUT -s 172.18.0.0/16 -d 172.18.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
iptables -R INPUT -d 172.18.100.6 -p tcp --dport 23 -m iprange --src-range 172.18.100.1-172.18.100.100 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT
来自172.18.100.0-172.18.100.100的对于172.18.100.6主机的tcp/23号端口的访问,当时间为每周的周一到周五的9:00-16:00时允许访问,其他时间拒绝
3.3.5 connlimit扩展
根据每客户端主机做并发连接数限制,即每客户端最多可同时发起的连接数量;
--connlimit-upto n:连接的数量小于等于n时匹配;
--connlimit-above n:链接的数量大于n时匹配
例:对于172.18.100.67的tcp/21号端口的访问,每个客户端最多发起两个请求,多的拒绝
iptables -A INPUT -d 172.18.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJEC
iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
3.3.6 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
iptables -I INPUT 2 -p icmp -j REJECT
3.3.7 state扩展
根据连接追踪机制去检查链接的状态
conntrack(连接追踪)机制:最终本机上的请求和响应之间的关系。状态有如下几种:
NEW:新发出的请求;连接追踪模版中不存在此连接的相关信息条目,因此,将此识别为第一次发出的请求
ESTABLISHED:NEW状态以后,连接追踪模板当中存在记录的连接
RELATED:无法识别的连接
UNTRACKED:未追踪的连接
INVALID:无法识别的连接
[!] --state state
例:
iptables -A INPUT -d 172.18.100.67 -p tcp -m multiport --dport 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUPUT -s 172.18.100.67 -p tcp -m multiport --sport 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
已经追踪到的并记录下来的连接:/porc/net/nf_conntrack
连接追踪功能所能记录的最大连接数量(可调整):/proc/sys/net/nf_conntrack_max
sysctl -w net.nf_conntrack_max=300000
echo 300000 > /proc/sys/net/nf_conntrack_max
conntrack所能追踪的连接数量的最大值取决于/proc/sys/net/nf_conntrack_max的设定,已经追踪到的并记录下来的连接位于/proc/net/nf_conntrack文件中,超时的连接将会被删除;当模版满载时,后续的型连接有可能会超时,解决办法:
(1) 加大nf_conntrack_max的值;
(2) 降低nf_conntrack条目的超时时长;
不同协议的连接追踪时长:/proc/sys/net/netfilter/
3.4 如何放行被动模式的ftp服务?
1.内核加载nf-conntrack_ftp模块:modporbe nf_conntrack_ftp
2.放行命令连接:$sip为Sever的ip地址
iptables -A INPUT -d $sip -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s $sip -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
3.放行数据连接:
iptables -A INPUT -d $sip -p tcp -m stte --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -s $sip -p tcp -m state --state ESTABLISHED -j ACCEPT
4.规则的其它设置
4.1 规则的添加注意事项
添加规则时的考量点(例:应该注意哪些功能):
(1) 要实现哪种功能:判断添加到哪个表上;
(2) 报文流经的路径:判断添加到哪个链上;
设定规则一定要考虑清楚,所写规则是为客户端还是服务端,数据流入流出
4.2 规则的检查次序
链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:
(1) 同类规则(访问同一应用),匹配范围小的放上面;
(2) 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;
(3) 将那些可由一条规则描述的多个规则合并起来;
(4) 设置默认策略;
4.3 规则的有效期及如何保存规则使之一直生效
规则的有效期:iptables命令添加的规则,手动删除前,其生效期限为kernel的生命周期
保存规则:
对于centos6:
service iptables save
iptables-save > /etc/sysconfig/iptables
iptables-save > /PATH/TO/SOME_RULE-FILE
对于centos7:
iptables -S > /PATH/TO/SOME-FILES
iptables-save > /PATH/TO/SOME-FILES
重载预存的规则:
iptabels-restore < /PATH/FROM/SOME-FILES
对于centos6:service iptables restart
会自动从/etc/sysconfig/iptables文件中重载规则
自动生效文件中的规则:
1.把iptables命令放在脚本文件中,让脚本文件开机自动启动
/etc/rc.d/rc.local
或把规则存放在/uar/bin/iptables.sh文件中,开机启动脚本
2.用规则文件保存规则,开机自动重载命令;
/etc/rc.d/rc.local
iptables-restore < /PATH/FROM/SOME_RULE_FILE
5.练习:
5.1.设置INPUT和OUTPUT默认策略为DROP;
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
iptables -A OUPUT -s 172.18.250.251 -p tcp --dport 80 -m time --weekdays 2,3,4,5,6,7 -m --limit 100/second -j ACCEPT
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.18.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
iptables -A OUTPUT -s 172.18.250.251 -d 172.18.0.0/16 -p tcp --dport 21 -m time --timestart 8:30 --timestop 18:30 -m 1,2,3,4,5 -m --limit 5/minute -j ACCEPT
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的学号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
iptables
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
iptables
5、允许本机ping别的主机;但不开放别的主机ping本机;
iptables
5.2:判断下述规则的意义:
# iptables -N clean_in
# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
# iptables -A clean_in -d 172.16.100.7 -j RETURN
# iptables -A INPUT -d 172.16.100.7 -j clean_in
# iptables -A INPUT -i lo -j ACCEPT 对于所有通过网卡lo进入本机的数据包全部接收
# iptables -A OUTPUT -o lo -j ACCEPT 对于通过网卡lo进入本机的数据包全部接收
lo网卡代表127.0.0.1,代表的是本地,上面表示对于本地主机的进程间通信,全部接收
# iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
# iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
# iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
iptables -A OUTPUT -s 172.18.17.129 -d 172.18.250.251 -p tcp --sport 22 -j DROP
iptables -A INPUT -s 172.18.0.0/16 -d 172.18.17.129 -p tcp --dport 22 -j DROP