iptables
Firewall:防火墙
隔离工具;Packets Filter Firewall;工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件;
分类:
硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现;
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;
主机防火墙:服务范围为当前主机;
网络防火墙:服务范围为防火墙被的局域网;
iptables/netfilter:
netfilter:防火墙框架,framework;位于内核空间; iptables:命令行工具程序,位于用户空间;规则管理工具;
iptables实现功能:hook function:钩子函数 内部内建了五个钩子
input:接收 output:本机发送 forward:本机转发 prerouting:路由之前 postrouting:路由发生之后
ptables:CHAINS:在iptables中将钩子成为链,必须大写,在iptables中写规则到链上时会被送到相应的钩子上进行处理
链:数据包传播路径,规则的检查清单,可以由一条或多条规则组成 当数据包到达一个链时,iptables就会从链中第一条规则开始检查,查看该数据包是否满足规则所定义的条件,决定是否按预定义的方法处理该数据包,如果包头不符合链中的规则,iptables就会根据该链的默认策略来处理数据包。多个链柔和起来成为表;
tables:表:功能划分(表的优先级由低到高如下)
filter:过滤,防火墙; nat:network address translation,网络地址转换; mangle:拆解报文,做出修改,并重新封装; raw:关闭nat表上启用的连接追踪机制; 功能和钩子的对应关系 raw:PREROUTING,OUTPUT mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING nat:PREROUTING,INPUT,OUTPUT,POSTROUTING filter:INPUT,FORWARD,OUTPUT
内置链:对应于hook function
PREROUTING刚进入本机、INPUT送往、FORWARD转发、OUTPUT输出、POSTROUTING离开本机报文
INPUT:过滤所有目标地址是本机的数据包(对进入本机数据包的过滤) OUTPUT:过滤所有本机产生的数据包(对源地址的数据包的过滤) FORWARD:过滤所有经过本机的数据包(源地址和目标地址都不是本机的数据包) PREROUTING:数据包到达防火墙时改变数据包的目标地址 POSTROUTING:在数据包离开防火墙时改变数据包的源地址
自定义链:
需要用户自定义并指明调用,用于内置链的扩展和补充,实现灵活规则管理机制;
表所包含的链
raw:PREROUTING,OUTPUT mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING filter:INPUT,FORWARD,OUTPUT
链检查顺序
链:链上的规则次序,即为检查的次序; 1) 同类规则(访问同一应用),匹配范围小的放上面; 2) 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面; 3) 将那些可由一条规则描述的多个规则合并起来; 4) 设置默认策略;
报文流向:
到本机某进程的报文:PREROUTING --> INPUT 由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING 由本机的某进程发出报文:OUTPUT --> POSTROUTING
iptables规则的组成部分:
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理; 匹配条件: 基本匹配条件:源地址,目标地址,传输层协议 扩展匹配条件:需要借助于扩展模块进行指定的匹配条件 隐式扩展:已经在基本匹配条件中指明的协议相关的扩展; 显式扩展:隐式扩展之外的其它扩展匹配条件; 处理动作: 基本动作:ACCEPT,DROP,... 扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作; 添加规则时需要考量的问题: (1) 报文流经的位置:用于判断将规则添加至哪个链; (2) 实现的功能:用于判断将规则添加至哪个表; (3) 报文的方向:用于判断哪个为“源”,哪个为“目标”; (4) 匹配条件:用于编写能够正确匹配目标报文的规则;
iptabls命令的使用格式:
程序包:iptables, iptstate iptables [-t table] {-A|-C|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new-chain-name rule-specification = [matches...] [target] match = -m matchname [per-match-options] target = -j targetname [per-target-options] 规则格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]]-j targetname [per-target-options] iptables [-t 表] [操作命令] [链] [[- m] 规则匹配] [-j 目标动作] 注意:链名和目标动作一定要大写
-t table:
指明表明,类型raw、mangle、nat、filter,默认为filter,可以省略
COMMANDS:
1)链管理:
-P:iptables [-t table] -P chain target,定义链的默认策略;其target一般可使用ACCEPT或DROP; -N:iptables [-t table] -N chain,自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数; -X:iptables [-t table] -X [chain],删除自定义的空的引用计数为0的链; -F:iptables [-t table] -F [chain [rulenum]] [options...],清空指定的链,或删除指定链上的规则 ; -E:iptables [-t table] -E old-chain-name new-chain-name,重命名自定义的引用计数为0的链; -Z:iptables [-t table] -Z [chain [rulenum]] [options...]:置零指定链的计数器
2)规则管理:
-A:append, iptables [-t table] -A chain rule-specification,追加规则到指定的链尾部; -I:insert, iptables [-t table] -I chain [rulenum] rule-specification,插入规则到指定的链中的指定位置,默认为链首; -D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum,删除指定的链上的指定规则; -R:replace,iptables [-t table] -R chain rulenum rule-specification,将指定的链上的指定规则替换为新的规则;
3)查看:
-L:list, iptables [-t table] -L [chain [rulenum]] [options...] -n:数字格式; -v:verbose,详细格式信息;-vv, -vvv --line-numbers:显示链上的规则的编号; x:exactly,显示计数器的精确值;
计数器:
每条规则以及链的默认策略分别有各自的两个计数器: (1) 匹配到的报文的个数:pkts (2) 匹配到的所有报文的大小之积:bytes
匹配条件:
1)基本匹配条件
注意:多重条件之间的隐含逻辑为“与”操作; [!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或地址范围; [!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或地址范围; [!] -p, --protocol protocol:检查报文中传输层的协议类型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all"; [!] -i, --in-interface name:检查报文进入本机时的接口是否符合本处指定的接口;INPUT, FORWARD and PREROUTING ; [!] -o, --out-interface name:检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING; -m, --match match:显式指明要使用的扩展模块; -j, --jump target:跳转目标;
2)扩展匹配条件:需要加载扩展模块,方可生效;
隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展; -p tcp:可直接使用tcp协议对应的扩展选项; [!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口; [!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口; [!] --tcp-flags mask comp SYN,ACK,FIN,RST,URG,PSH; mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0; 例如:“--tcp-flags SYN,ACK,FIN,RST SYN” 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0; [!] --syn:用于匹配第一次握手,相当于--tcp-flags SYN,ACK,FIN,RST SYN -p udp:可直接使用udp协议对应的扩展选项; [!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口; [!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口; -p icmp:可直接使用icmp协议对应的扩展选项; [!] --icmp-type {type[/code]|typename} --icmp-type 0/0:匹配对ping请求的响应报文 --icmp-type 8/0:匹配ping请求报文 显式扩展:必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项; 1、multiport 以离散或连续的方式定义的多端口匹配条件; 最多指定15个端口;. [!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口; [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口; [!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口; 2、iprange 以连续的ip地址范围指明多地址匹配条件; [!] --src-range from[-to]:源IP地址 [!] --dst-range from[-to]:目标IP地址; 3、string 对报文中的应用层数据做字符串匹配检测; [!] --string pattern:要检测的字符串模式; [!] --hex-string pattern:要检测的字符串模式,16进制格式; --algo {bm|kmp}:字符串匹配检查算法; --from offset --to offset 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...] 5、connlimit 根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求; --connlimit-upto n:连接数小于等于阈值; --connlimit-above n:连接数超出阈值; 示例:~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT 6、limit 基于收发报文的速率进行匹配; --limit rate[/second|/minute|/hour|/day] --limit-burst number 示例:~]# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT 7.state扩展 根据”连接追踪机制“去检查连接的状态,内核中的netfilter记录实现:[!] --state state conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种: NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求; ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态; RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系; INVALID:无效的连接; UNTRACKED:未进行追踪的连接; 实例:~]# iptables -A INPUT -d172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --stateNEW,ESTABLISHED -j ACCEPT ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports22,80 -m state --state ESTABLISHED -j ACCEPT 调整连接追踪功能所能够容纳的最大连接数量:/proc/sys/net/nf_contrack_max 已经追踪到到的并记录下来的连接:/proc/net/nf_conntrack 不同的协议的连接追踪时长:/proc/sys/net/netfilter/ iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时 解決方法一般有两个: (1)加大nf_conntrack_max 值 vi/etc/sysctl.conf net.ipv4.nf_conntrack_max= net.ipv4.netfilter.nf_conntrack_max= (2) 降低 nf_conntrack timeout时间 vi/etc/sysctl.conf net.ipv4.netfilter.nf_conntrack_tcp_timeout_established= net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait= net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait= net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait=
处理动作:-j targetname
-jtargetname [per-target-options] ACCEPT:允许数据包通过 DROP:丢弃数据包 REJECT:拒绝数据包,同时给发送者发送没有接受的通知 RETURN:结束当前返回调用链; REDIRECT:端口重定向; LOG:记录日志; MARK:做防火墙标记; DNAT:目标地址转换; SNAT:源地址转换; MASQUERADE:地址伪装;关闭 ... 自定义链:
NAT:network addresstranslation,网络地址转换
NAT将局域网内每台计算机的私网IP地址转换成一个公网合法的IP地址,使局域网计算机能访问Internet资源,节约地址空间。NAT和防火墙技术结合,把局域网内部的IP隐藏起来不被公网容易访问,能够有效避免来自外部网路的攻击。
需要开启内核路由核心转发功能:/etc/sysctl.conf = 1
snat:source nat 源地址转换 静态转换 动态转换 dnat:destination nat 目标地址转换 pnat:port nat 端口地址转换 (1)snat:POSTROUTING, OUTPUT;让本地网络中的主机通过某一特定地址访问外部网络时; 2)dnat:PREROUTING;把本地网络中的某一主机上的某服务开放给外部网络中的用户访问时;
nat表的target:
(1)SNAT --to-source[ipaddr[-ipaddr]][:port[-port]] --random (2)DNAT --to-destination[ipaddr[-ipaddr]][:port[-port]] (3)MASQUERADE 源地址转换:当源地址为动态获取的地址时,MASQUERADE可自行判断要转换为的地址; --to-portsport[-port] --random (4)REDIRECT:端口重定向;
示例
SNAT示例: ~]#iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to-source172.16.100.67 MASQUERADE示例: ~]#iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE DNAT示例: ]#iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT--to-destination 192.168.12.77 ~]#iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT--to-destination 192.168.12.77:8080 ~]#iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 22012 -j DNAT--to-destination 192.168.12.78:22 REDIRECT示例: ~]# iptables -t nat -A PREROUTING -I eth0 -ptcp -s 192.168.0.0/24 --dport 80 -j REDIRECT --to-ports 443
保存和载入规则:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE 重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE -n, --noflush:不清除原有规则 -t, --test:仅分析生成规则集,但不予提交; 注意:重载文件中的规则,会清除已有规则; CentOS 6: 保存规则:service iptables save 保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容; 重载规则:server iptables restart 默认重载/etc/sysconfig/iptables文件中的规则 脚本配置文件:/etc/sysconfig/iptables-config 用于指明要装载的模块; 设置开机自动生效:用脚本保存各iptables命令;让此脚本开机后自动运行; /etc/rc.d/rc.local文件中添加脚本路径; /PATH/TO/SOME_SCRIPT_FILE CentOS 7开机自动生效规则: (1) firewalld服务; (2) shell脚本,直接记录iptables命令; (3) 自定义unit file或init script;
规则优化的思路:
(1) 优先放行双方向状态为ESTABLISHED的报文; (2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面; (3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面; (4) 设置默认策略:白名单机制 (a) 可使用iptables -P设定默认策略; (b) 建议在规则链的最后定义规则做为默认策略;
如何开放被动模式的ftp服务:
(1) 装载追踪ftp协议的模块; # modprobe nf_conntrack_ftp (2) 放行入站命令连接 # iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT (3) 放行入站数据连接 # iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT (4) 放行出站的ESTABLISHED连接 # iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/58119