一、Iptables概念
iptables是隔离主机以及网络的工具,通过自己设定的规则以及处理动作对数据报文进行检测以及处理
iptables 是 Linux 中比较底层的网络服务,它控制了 Linux 系统中的网络操作,firewalld不仅仅是对 iptables 上层封装那么简单,还有 ipv6 支持等功能。同时,iptables 不仅仅是防火墙这么简单,它基本上能实现你在 linux 上对于网络的所有需求
linux的防火墙由netfilter和iptables组成。用户空间的iptables制定防火墙规则,内核空间的netfilter实现防火墙功能。
netfilter(内核空间)位于Linux内核中的包过滤防火墙功能体系,称为Linux防火墙的“内核态”。
iptables(用户空间)位于/sbin/iptables,是用来管理防火墙的命令的工具,为防火墙体系提供过滤规则/策略,决定如何过滤或处理到达防火墙主机的数据包,称为Linux防火墙的“用户态”。
防火墙的发展史就是从墙到链再到表的过程,也即是从简单到复杂的过程。为什么规则越来越多,因为互联网越来越不安全了,所有防火墙的的规则也越来越复杂。防火的工具变化如下:
ipfirewall(墙)-->ipchains(链条)--iptables(表)
2.0版内核中,包过滤机制是ipfw,管理工具是ipfwadm;
2.2 版内核中,包过滤机制ipchain,管理工具是ipchains;
2.4版及以后的内核中,包过滤机制是netfilter,管理工具iptables
二 、ptables原理
三、Iptables命令
定义默认策略
iptable -t filter --policy forward DROP
iptable -t filter -P forward DROP
规则管理
-A --append 在规则最后追加
-I INPUT 2 --insert 2 在指定位置插入,不指定位置在最上面
-D --delete 删除一个规则
-R --replace
-F --flush
-Z 清空计数器 匹配的最大报文个数 匹配所有报文大小之和
-L --list
-i --in-interface
-o --out-interface
-p --protocol udp tcp icmp
-s --source
-d --destination
链管理
-N new自定义一条新的链规则 -X delete 删除一条自定义的链规则
-E 重命名自定义的链,引用计数不为0不能重命名,也不能删除
动作
-j reject ---reject-with tcp-reset return 返回调用链 redirect 重定向端口 LOG --log-prefix "IPtables" 记录日志
drop 丢弃 accept 接受
dnat 目的地址转换 snat 源地址转换 mark防火墙标记 masquerade 地址伪装
扩展模块,需要加载扩块, 才可以生效
隐式扩展:不需要手动加载模块,因为他们是对协议的扩展,但凡使用-p 指明了协议,就表示已经指明了扩展的模块
tcp --source-port --sport 起始端口:结束端口 --dport 起始端口:结束端口
--tcp-flags MARK comp
--syn --tcp-flags SYN,RST,ACK,FIN SYN 必须为1,其余为0,用于匹配第一次握手
udp
icmp icmp --icmp-type echo-reply 8 echo-request 0
显示扩展:必须手动加载模块,
-m multiport 离散方式多个端口 最多15个 --ports --sports --dports
iprange 连续ip --src-range --dst-range
string 对报文中应用层数据做字符串模式匹配检测
--algo 字符串检测算法 bm kmp
--string 要检测的字符串模式 --hex-string 16进制
time --datestart --datestop --timestart --timestop
-m state NEW ESTABLISHED RELATED INVALID
-m connlimit --connlimit above 链接个数
-m limit --limit /second /hours /day
--limit-burst 瞬间流量控制
-m mac --mac-source 不能用于output和postrouting
-m mark --mark 用来比对封包是否被标识某个号码,当封包被比对成功时,我们可以通过mark处理动作,将该标识标示一个号码,号码最大为4294967296
recent模块
--name 设定名称列表 默认default --resource 源地址,默认 --rdest 目的地址 --seconds 指定时间内 --hitcount 命中次数
--set 将地址添加进列表并更新信息,含地址加入的时间戳
--recheck坚持地列表,以第一个匹配开始计算时间
--update 以最后一个计算时间 --remove 在列表里面删除相应地址,后跟列表名称以及地址
ssh链接60秒内只允许链接两次
iptables -t filter -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --rcheck --seconds 60 --hitcount 2 -j drop
iptables -t filter -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j accept
防止cc以及非伪造的ip的syn flood
iptables -t filter -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --recheck --seconds 60 --hitcount 10 -j LOG --log-prefix 'dos' --log-ip-options
iptables -t filter -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --recheck --seconds 60 --hitcount 10 -j DROP
iptables -t filter -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j accept
设置打开端口的钥匙
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -m length --length 1078 -j LOG --log-prefix 'sss'
指定数据包1078 ip头部20 ICMP头部8字节
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -m length --length 1078 -m recent --set --name sshopen --rsource -j accept
检查sshopenbiao表中60秒内记录如果有源地址则允许访问tcp22端口
iptables -t filter -A INPUT -p tcp --dport 22 -syn -m recent --rcheck --seconds 60 --name sshopen -rsource -j accept
发送ping包指定数据1178 将客户端从sshopen中移除,客户端将不能使用tcp22的端口建立链接
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -m length --length 1178 -m recent --set --name sshopen --remove -j accept
mangle 修改数据包首部
iptables -t mangle -A prerouting -i eth0 -j TTL --ttl-dec 10
iptables -t mangle -A prerouting -i eth0 -j TTL --ttl-inc 1
iptables -t mangle -A prerouting -i eth0 -j TTL --ttl-set 45