Firewall:防火墙,工作于主机或网络的边缘处,对于进出本主机或网络的报文根据事先定义好的检查规则左匹配检测,对于能够被规则所匹配到的报文进行相应的处理的组件。
防火墙可分为:硬件防火墙,在硬件级别实现部分功能的防火墙;软件防火墙,应用软件处理逻辑运行于通用硬件平台之上的防火墙;主机防火墙,服务范围为当前主机;网络防火墙,服务范围为局域网。
在设置防火墙时建议设置白名单,这样要更加稳妥。
iptables的组成,四表五链:
功能(表):
raw:关闭nat表上启用的连接追踪机制;
mangle:拆解报文,做出修改,并重新封装;
nat:network address
translation,用于修改源IP或目标IP,也可以修改端口;
filter:过滤,防火墙;
链Chain:
PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
功能–链:
raw:PREROUTING、OUTPUT
mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat:PREROUTING、OUTPUT、POSTROUTING
filter:INPUT、FORWARD、OUTPUT
报文流向:
流入本机:PREROUTING–>INPUT
由本机流出:OUTPUT–>POSTROUTING
转发:PREROUTING–>FORWARD–>POSTROUTING
规则:
组成部分—根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作做出处理;
查看规则:
iptables -L :list,列出指定链上的所有规则;
–line-numbers:显示规则在当前链上的序号;
注意:下边的是选项用来修饰命令的放在前边
-n:numberic,以数字格式显示地址和端口号,跳过反解;
-v:verbose,详细信息;pkts包数量 bytes字节数
-vv, -vvv
-x:exactly,显示计数器结果的精确值;
查看某个特定的链后边直接加上链名即可:iptables -vnL INPUT
定义规则的格式:
iptables [-t
table] COMMAND chain [-m matchname [per-match-options]] –j targetname [per-target-options]
[-t table] :默认是filter
COMMAND:
-N:new,自定义一条新的规则链
-X:delet,删除自定义的规则链;注意:若是有引用、规则、不是自定义链的都删不掉;
-P:policy,设置默认策略;对于filter表中的链而言,默认的策略有:ACCEPT:接受;DROP:丢弃;REJECT:拒绝,立即回应;
-E:重新命名自定义链;引用记数不为0的自定义链不能够重命名。
规则管理:
-A:append,追加;
-I:insert, 插入,要指明位置,省略时表示第一条;
-D:delete,删除;
(1)指明规则序号;
(2)指明规则本身;
-R:replace,替换指定链上的指定规则,要替换整个规则本身;
-F:flush,清空指定的规则链;
-Z:zero,置零;后加上指定置零的链,不加默认为将指定表上的链的规则全部置零
匹配条件:
基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供
-s:源地址;
-d:目标地址;
-p:协议tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh or “all”
-i,–in-interface name(网卡名):数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
-o,–out-interface name(网卡名):数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链
扩展匹配条件:需要加载扩展模块,方可生效;
隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;
tcp:
–source-port, –sport port[:port]:匹配报文的源端口;可以是端口范围;
–destination-port,–dport port[:port]:匹配报文的目标端口;可以是端口范围;
–tcp-flags mask comp
mask是我们应该检查的flag,写成逗号分隔的列表: SYN,ACK,FIN,RST
comp是以逗号分隔的必须设置的标志列表 :SYN
例如:“–tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;
–syn:用于匹配第一次握手,相当于”–tcp-flags SYN,ACK,FIN,RST SYN“;
udp:
–source-port, –sport port[:port]:匹配报文的源端口;可以是端口范围;
–destination-port,–dport port[:port]:匹配报文的目标端口;可以是端口范围;
icmp (ping)用来探测网络通信的
–icmp-type {type[/code]|typename}
echo-request:8
echo-reply:0
eg:
允许其他主机ping通本机:
iptables -A INPUT -d 172.16.250.31 -p icmp -j ACCEPT
iptables -A OUTPUT -s 172.16.250.31 -p icmp -j ACCEPT
允许自己ping别人而别人无法ping自己:
iptables -I OUTPUT 2 -s 172.16.250.31 -p tcp icmp –icmp-type 8 -j ACCEPT
iptables -I INPUT 2 -s 172.16.250.31 -p tcp icmp –icmp-type 0 -j ACCEPT
显式扩展:必须要手动加载扩展模块, [-m matchname [per-match-options]];
1、multiport扩展,以离散或连续的方式定义多端口匹配条件;最多指定15个端口;
–source-ports,–sports port[,port|,port:port]…:指定多个源端口;
–destination-ports,–dports port[,port|,port:port]…:指定多个目标端口;
–ports port[,port|,port:port]…:指明多个端口;
eg:iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport –dports 22,80 -j ACCEPT
2、iprange扩展指明连续的ip地址范围;
–src-range from[-to]:源IP地址;
–dst-range from[-to]:目标IP地址;
eg: iptables -A INPUT -d 172.16.100.67 -p tcp –dport 80 -m iprange –src-range 172.16.100.5-172.16.100.10 -j DROP
3、string扩展,对报文中的应用层数据做字符串模式匹配检测;
–algo {bm|kmp}:字符串匹配检测算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
–string pattern:要检测的字符串模式;
–hex-string pattern:要检测的字符串模式,16进制格式;
eg: iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp –sport 80 -m string –algo bm –string “gay” -j REJECT
4、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…]
–kerneltz:使用内核上的时区,而非默认的UTC;
eg: iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp –dport 80 -m time –timestart 14:30 –timestop 18:30 –weekdays Sat,Sun –kerneltz -j DROP
5、connlimit扩展,根据每客户端IP做并发连接数数量匹配限制;
–connlimit-upto n:连接的数量小于等于n时匹配;
–connlimit-above n:连接的数量大于n时匹配;
eg:iptables -A INPUT -d 172.16.100.67 -p tcp –dport 21 -m connlimit –connlimit-above 2 -j REJECT
6、limit扩展,基于收发报文的速率做限制;
令牌桶过滤器;
–limit rate[/second|/minute|/hour|/day]
–limit-burst number 最多能有多少报文
eg: iptables -I INPUT -d 172.16.100.67 -p icmp –icmp-type 8 -m limit –limit 3/minute –limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT
限制本机某tcp服务接收新请求的速率:–syn ,-m limit
7、state扩展,根据”连接追踪机制“去检查连接的状态;
conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;要想开放ftp功能需要手动装载 nf_conntrack_ftp
INVALID:无效的连接;
UNTRACKED:未进行追踪的连接;
–state STATE
eg:
iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport –dports 22:23,80,139,445,3306 -m state –state NEW -j ACCEPT
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 ACCEPT
iptables -A INPUT -d 172.16.100.67 -j REJECT
iptables -A OUTPUT -s 172.16.100.67 -j REJECT
这一套下来,将IP地址为172.16.100.67的主机的基于tcp的22,23,80,139,445,3306端口开放,其他主机都可以访问,而其他未开放的端口无法访问。
这里对于规则优化提出一些建议:
服务器端规则设定:任何不允许的访问,应该在请求到达时给予拒绝;
(1)优先放行双方向状态为ESTABLSHED的报文
(2)服务于不同类别的功能的规则,匹配到报文可能性更大的放前面
(3)服务于同一类别的功能的规则,匹配条件较严格的放在前面
(4)设置默认策略:白名单机制
(a)iptables -P,不建议;
(b)建议在规则的最后定义规则作为默认策略;
处理动作:
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回调用链;
REDIRECT:端口重定向;
LOG:记录日志;
MARK:做防火墙标记;
DNAT:目标地址转换;
SNAT:源地址转换;
MASQUERADE:地址伪装;
…
添加规则时要考虑:1、实现哪种功能:判断添加到那个表上;
2、报文流经的路径:判断添加到哪个链上;
链上的规则次序,即为检查的顺序,要注意:
1、同类规则(访问同一应用),范围小的要放在上面;
2、不同类的规则(访问不同规则),匹配到报文频率较大的放在上面;
3、将那些可由一条规则描述的多个规则合并起来;
4、设置默认策略。
规则读取优先级:由上到下,所以编写规则先小范围再大范围
eg1:
设置白名单,将所有的链置为DROP
允许172.16.网段的ip地址以tcp协议的服务访问本机(能够放行ssh服务,注意在做测试时先放行自己的ssh服务)
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.250.31 -p tcp -j ACCEPT
iptables -A OUTPUT -s 172.16.250.31 -d 172.16.0.0/16 -p tcp -j ACCEPT
(为防止不小心清空规则后,无法通过ssh连接主机)
之后可以设置:iptables -P INPUT DROP;
iptables -P OUTPUT DROP ;
iptables -P FORWARD DROP
将其他规则都设置为DROP(默认规则是ACCEPT)
eg2:
加入一条只开放ssh服务的规则:
iptables I INPUT -s 172.16.0.0/16 -d 172.16.250.31 -p tcp –dport 22 -j ACCEPT
iptables I OUTPUT -s 172.16.250.31 -d 172.16.0.0/16 -p tcp –sport 22 -j ACCEPT
加入上一条规则后,可以加入 :iptables -A INPUT -d 172.16.250.31 -j REHECT
iptables -A OUTPUT -s 172.16.250.31 -j REJECT
(或者修改网卡<一般用这个>:iptables -A INPUT -i ens33 -j REJECT
iptables -A OUTPUT -i ens33 -j REJECT,
因为此规则范围很大,将其放在最后,之后再添加规则要放在其前面)
若是默认规则修改过,则将默认规则修改为:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
规则的用效期限:
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限;
保存规则:
保存规则至指定的文件:
CentOS 6:
service iptables save
将规则保存至/etc/sysconfig/iptables文件中;
iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS 7:
iptables-save > /PATH/TO/SOME_RULES_FILE
重新载入预存规则文件中规则:
CentOS 7:
iptables-restore < /PATH/FROM/SOME_RULES_FILE
-n,–notfush:不清除原有规则
–他,-test:仅分析生成规则集,但不提交
CentOS 6:
service iptables restart
默认重载/etc/sysconfig/iptables文件中的规则
配置文件:/etc/sysconfig/iptables-config
自动生效规则文件中的规则:
(1) 用脚本保存各iptables命令;让此脚本开机后自动运行;
/etc/rc.d/rc.local文件中添加脚本路径;
/PATH/TO/SOME_SCRIPT_FILE
(2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则;
/etc/rc.d/rc.local文件添加:
iptables-restore
< /PATH/FROM/IPTABLES_RULES_FILE
原创文章,作者:Immortals、zcy,如若转载,请注明出处:http://www.178linux.com/78268