【学习笔记】
Iptables规则:
匹配条件:默认为与条件,自上而下的检查 匹配条件更精确的放到上面
基本匹配:IP,端口,TCP的Flags
扩展匹配:通过复杂高级功能匹配
隐式扩展:tcp,udp,icmp
显式扩展:必须明确指定扩展模块进行的扩展
处理动作:跳转目标
内建处理动作:ACCEPT(一票通过) DROP(一票否决,直接丢弃) REJECT(一票否决,发送回应报文,然后立即断开) SNAT DNATMASQUERADE MARK LOG ……
自定义处理动作:自定义chain,利用分类管理复杂情形
规则要添加在链上才能生效;添加在自定义链上不会自动生效
链chain:
内置链:每个内置链对应一个钩子函数
自定义链:对内置链进行补充扩展,只有Hook钩子函数调用时,才生效
Iptables命令
man 8 iptables 手册
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(0重命名) old-chain-name new-chain-name
-L的专用选项:
-n选项:如果不加,则会将ip地址反解为主机名,将端口反解为服务名。使用-nL选项可以加速
-v -vv -vvv选项:显示更详细的信息
--line-numbers :显示规则编号
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
匹配条件:
基本:通用的,PARAMETERS
扩展:需要加载模块,MATCH EXTENTIONS
1.、基本匹配条件:无需加载模块,由iptables/netfilter自行提供
[!] -s, --source address[/mask][,...]:源IP地址或范围
[!] -d, --destination address[/mask][,...]:目标IP地址或范围
[!] -p, --protocol protocol:指定协议,可使用数字如0(all)
protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“参看: /etc/protocols
[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、 FORWARD、 PREROUTING链
[!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、 OUTPUT、 POSTROUTING链
示例:完成只开放80端口
iptables -t filter -A INPUT -s 192.168.36.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -d 192.168.36.0/24 -p tcp -m tcp --sport 22 -j ACCEPT
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --sport 80 -j ACCEPT
Iptables --> netfilter 立即生效
Iptables [-t table] [subcommand] [chain] [rulenum] [rule-specifiacation]
Subcommand
规则:-A -I -R -L -D
链:-N增 -X删 -F清 -Z置零 -E重命名 -P重置策略
rule- specification
rule spec
基本匹配:-s源地址 -d目标地址 -p四层协议类型 -i流入接口 -o流出接口
扩展匹配:隐式扩展 显式扩展
target
-p tcp 专用选项
--tcp-flags mask comp:
SYN(=1,tcp三次握手的第一次或第二次) ACK(=1,确认之前发送的报文生效) FIN(=1,连接要断开) RST(连接重置) URG(紧急) PSH()
mask:要检查的标志位列数,以逗号分隔
comp:必须为1的标志位,余下的出现在mask列表中的标志位则必须为0
--syn:用于匹配第一次握手,相当于: --tcp-flags SYN,ACK,FIN,RST SYN
udp
[!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围
icmp
[!] --icmp-type {type[/code]|typename}
type/code | icmp应答 |
8/0 echo-request | icmp请求 |
1、Multiport扩展:以离散或连续的方式定义多端口匹配条件
--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地址范围
示例:
iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --srcrange 172.16.1.5-172.16.1.10 -j DROP
3、 set扩展:实现不连续ip地址,使用set扩展,依赖于ipset命令行工具
4、String扩展:对报文中的应用层数据做字符串匹配检测
--algo {bm|kmp} 字符串匹配检测算法
bm: Boyer-Moore
kmp: Knuth-Pratt-Morris
--from offset 开始偏移
--to offset 结束偏移
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式, 16进制格式
示例:
iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT
5、 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...] 星期几, 1 – 7 分别表示星期一到星期日
--kerneltz:内核时区,不建议使用, CentOS7系统默认为UTC
注意: centos6 不支持kerneltz , --localtz指定本地时区(默认)
示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
6、 connlimit扩展
根据每客户端IP做并发连接数数量匹配
可防止CC(Challenge Collapsar挑战黑洞)攻击
--connlimit-upto #:连接的数量小于等于#时匹配
--connlimit-above #:连接的数量大于#时匹配
通常分别与默认的拒绝或允许策略配合使用
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
7、 limit扩展
基于收发报文的速率做匹配
令牌桶过滤器
--limit #[/second|/minute|/hour|/day]
--limit-burst number
示例:
iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit10/minute --limit-burst 5 -j ACCEPTiptables -I INPUT 2 -p icmp -j REJECT
8、 state扩展
根据”连接追踪机制“去检查连接的状态,较耗资源
conntrack机制:追踪本机上的请求和响应之间的关系
状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED: NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
[!] --state state
示例:
iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport --dports 22,80-m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
已经追踪到的并记录下来的连接信息库
/proc/net/nf_conntrack
调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max
不同的协议的连接追踪时长
/proc/sys/net/netfilter/
iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各种状态的超
时链接会从表中删除;当模板满载时,后续连接可能会超时
解决方法两个:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
(2) 降低 nf_conntrack timeout时间
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
注意: CentOS7 需要加载模块: modprobe nf_conntrack