iptables命令的使用格式:
iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]
匹配条件:
基本匹配条件
扩展匹配条件
隐式扩展
显式扩展
注意:多重条件之间的隐含逻辑为“与”操作;
基本匹配条件:
条件之前的!表示可以对条件进行取反
(1)[!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或地址范围;
iptables -I INPUT -s 10.1.0.71 -j REJECT //拒绝来自10.1.0.71的访问 iptables -I INPUT -s 10.1.0.0/16 -j ACCEPT //放行10.1.0.0/16网络中的主机访问 iptables -R INPUT 1 -s 10.1.0.71 -j DROP //来自10.1.0.71的访问的包丢掉 iptables -D INPUT 1 //删除INPUT链中的第一条规则 iptables -D INPUT -s 10.1.0.71 -j DROP //删除明确给出规则的INPUT链规则
(2)[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或地址范围;
(3)[!] -p, --protocol protocol:检查报文中传输层的协议类型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all";
iptables -A INPUT -s 10.1.0.0/16 -d 10.1.0.6 -p tcp -j ACCEPT //开放来自10.1.0.0/16网络中的主机访问10.1.0.6网卡的tcp协议报文
(4)[!] -i, --in-interface name:检查报文进入本机时的接口是否符合本处指定的接口;INPUT, FORWARD and PREROUTING ;
(5)[!] -o, --out-interface name:检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING;
-m, --match match:显式指明要使用的扩展模块;
-j, --jump target:跳转目标;
扩展匹配条件:
(1)隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;
也可以在给定协议之后使用 -m tcp , -m udp ...显式扩展必须给定-m指定
-p tcp:可直接使用tcp协议对应的扩展选项;
(1)[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;
iptables -A INPUT -s 10.1.0.0/16 -d 10.1.0.67 -p tcp --dport 22 -j ACCEPT //进站
iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.0.67 -p tcp --sport 22 -j ACCEPT
//开放本网段的进入本机22端口的请求报文
(2)[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;
(3)[!] --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
(4)[!] --syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:可直接使用udp协议对应的扩展选项;
(1)[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;
(2)[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;
-p icmp:可直接使用icmp协议对应的扩展选项;
[!] --icmp-type {type[/code]|typename}
--icmp-type 0/0:匹配对ping请求的响应报文
--icmp-type 8/0:匹配ping请求报文
(2)显式扩展:必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项;
1、multiport
以离散或连续的方式定义的多端口匹配条件; Up to 15 ports can be specified.
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口;
iptables -A INPUT -d 10.1.0.6 -p tcp -m multiport --dport 22,23,80 -j ACCEPT //开放本地的22,23,80端口进站请求
iptables -A INPUT -s 10.1.0.6 -p tcp -m multiport --sport 22,23,80 -j ACCEPT //允许22,23,80端口回应客户请求
2、iprange
以连续的ip地址范围指明多地址匹配条件;
[!] --src-range from[-to]
-m iprange --src-range from 10.1.68.1 to 10.1.68.10
[!] --dst-range from[-to]
3、string
对报文中的应用层数据做字符串匹配检测;
[!] --string pattern
[!] --hex-string pattern
--algo {bm|kmp}:字符串匹配检查算法;
--from offset
--to offset
过滤过过程中遇到的问题:当使用httpd启动80端口时回应报文中的敏感词汇可以过滤
但是当使用nginx启动80端口回应报文时对字符过滤时没有效果
4、time
根据报文到达的时间与指定的时间范围进行匹配度检测;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
时间无法取反
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
iptables -I INPUT -d 10.1.68.15 -p tcp --dport 23 -m time --timestart 16:00:01 --timestop 09:59:59 --weekdays wed -j REJECT //限制telnet服务在周三的下午四点到早上九点五十九不提供访问
使用可以起始时间大于开始时间
-A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri --datestop 2038-01-19T11:14:07 -j ACCEPT //telnet服务只在工作时间提供服务
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
5、connlimit
根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求;
--connlimit-upto n:连接数小于等于阈值;
--connlimit-above n:连接数超出阈值;
--connlimit-mask 24 :prefix_length
~]# 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 -I INPUT -p icmp --icmp-type 8 -m limit -j ACCEPT
//不指定速率则会第一次由令牌桶中的五个令牌响应请求,之后每小时放行三个请求
~]# 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
状态检测:连接追踪机制(conntrack)
相当于有一个链接追踪的表,有新请求过来,看表中有没有,没有就加进去。如果表满了,会使一些访问被拒绝
NEW:表中没不存在的条目,新连接
ESTABLISHED:已建立的连接,即表中已经存在此条目
RELATED:相关联的连接
INVALID:无法识别的连接 //不像新的也不是已经连接的表中没条目但是又有相关信息
UNTRACKED:未被追踪连接;
相关的内核模块:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp//想追踪相关连的链接,需要开启此模块
追踪到的连接:/proc/net/nf_conntrack文件中;
能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max
建议调整至足够大;如果连接请求超过此值,访问会被拒绝。如果服务器是调度器负载均衡器 ,最好不要开启此功能
不同的协议的连接追踪时长:
/proc/sys/net/netfilter/
如:我们的服务器由80端口连接别人,正常情况下这种状态是不存在的,如果服务器中木马,控制我们的80端口发出连接出去;我们设置80端口只允许进来为new的请求,出去ESTABLISEHD。;如果OUTPUT规则设置为DROP,我们可以让出去的是ESTABLISEHD状态的放行,可以安全的放行所有连接进入的服务。如果设置ftp能出去,设置RELATED状态的服务准许出去。就能基于状态放行ftp服务
INPUT链默认规则为为DROP
iptables -A INPUT -d 10.1.68.15 -p tcp -m multiport --dports 22,80,23 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -d 10.1.68.15 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
OUTPUT链默认规则为DROP
iptables -A OUTPUT -s 10.1.68.15 -m state --state ESTABLISHED -j ACCEPT
[!] --state state
如何开放被动模式的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
处理动作(跳转目标):
-j tagetname [per-target-options]
简单target:
ACCEPT,DROP
扩展target:
REJECT:
--reject-with type
icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默认为icmp-port-unreachable;
LOG:
Turn on kernel logging of matching packets.
--log-level level
--log-prefix prefix:日志信息的前导信息;即给定日志记录的描述字符串。
保存和载入规则:
保存: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
用于指明要装载的模块;
CentOS 7开机自动生效规则:
(1) firewalld服务;
(2) shell脚本,直接记录iptables命令;
(3) 自定义unit file或init script;
规则优化的思路:
(1) 优先放行双方向状态为ESTABLISHED的报文;
(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;//相对服务来说就是服务被访问的比较多的放前面
(3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;
(4) 设置默认策略:白名单机制
(a) 可使用iptables -P设定默认策略;
(b) 建议在规则链的最后定义规则做为默认策略;//使用这种方式相对于a方案的好处是不需要针对本机访问再做额外定义
练习:基于状态放行telnet, ftp, ssh, http, samba, icmp等服务;
(1) 对本机的ping请求每分钟不得超出20个;
(2) 每客户端对本机的ssh的并发连接数不得超过3个;
(3) 本机的telnet服务仅允许工作时间内访问;
# Generated by iptables-save v1.4.7 on Thu Oct 20 09:32:28 2016 *filter :INPUT ACCEPT [28:2389] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -m limit --limit 3/hour --limit-burst 1 -j DROP -A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri --datestop 2038-01-19T11:14:07 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p tcp -m state --state NEW,ESTABLISHED -m multiport --dports 22,80,21,3306,139,445 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 3 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 3 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT //这一条可以放到最前面,可以去掉上边规则中的ESTABLISEHD状态,加快匹配规则 -A INPUT -d 10.1.68.9/32 -j DROP -A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 80 -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 2049 -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 22 -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -p icmp -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -m state --state ESTABLISHED -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -j DROP COMMIT # Completed on Thu Oct 20 09:32:28 2016
对OUTPUT做一定调整后:
*filter :INPUT ACCEPT [87:7149] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -m limit --limit 3/hour --limit-burst 1 -j DROP -A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri --datestop 2038-01-19T11:14:07 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p tcp -m state --state NEW,ESTABLISHED -m multiport --dports 22,80,21,3306,139,445 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 3 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 3 -j ACCEPT -A INPUT -d 10.1.68.9/32 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -d 10.1.68.9/32 -j DROP -A OUTPUT -s 10.1.68.9/32 -m state --state NEW,ESTABLISHED -j ACCEPT -A OUTPUT -s 10.1.68.9/32 -j DROP COMMIT # Completed on Thu Oct 20 22:44:31 2016