iptables
五表五链
链:INPUT OUTPUT FORWARD PREROUTING POSTROUTING
表:filter、nat、mangle、raw、security
数据报文刚进网卡,还没有到路由表的时候,先进行了prerouting,进入到路由表,通过目标地址判断出来,如果是给自己发的,就直接INPUT,如果是通过自己到转发别的目标的,就进行forward。如果是访问本机的,那么经过INPUT之后,需要往外出,那么就会用到OUTPUT链。OUTPUT出去之后就要查询路由表,就和forward chain汇总到一个出口上,经理最后的过程就是POSTROUTING CHAIN。
三条路径:
-
进入本机:PREROUTING --> INPUT
-
穿过本机的:PREROUTING --> FORWARD --> POSTROUTING
-
从本机往外走的:OUTPUT --> POSTROUTING
实验环境准备
-
Centos7:systemctl stop firewalld.service && systemctl disable firewalld. service
-
Centos6:service iptables stop && chkconfig iptables off && checonfig --list iptables
卸载虚拟网卡 yum info libvirt-deamon yum remove libvirt-deamon
看看iptables来自于那个包
rpm -ql `which iptables`
iptables规则
组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理
- 匹配条件:默认为与条件,同时满足 基本匹配:IP,端口,TCP的Flags(SYN,ACK等) 扩展匹配:通过复杂高级功能匹配
- 处理动作:称为target,跳转目标 内建处理动作: ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG… 自定义处理动作:自定义chain,利用分类管理复杂情形
- 规则要添加在链上,才生效;添加在自定义上不会自动生效
- 链chain: 内置链:每个内置链对应于一个钩子函数 自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有 Hook钩子调用自定义链时,才生效
iptables命令
cent6和centos7查看帮助的方式不同,centos7把拓展分出去了
centos6: man iptables
centos7:man iptables && man iptables-extendisions
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 old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
-t=table -A=appentd -s=source ip -j=jump
input=INPUT
暴力ping
ping -f 192.168.63.3
iptables -t filter -A INPUT -s 192.168.63.3 -j DROP
iptables -t filter -A INPUT -s 192.168.63.3 -j REJECT
iptables -t filter -A INPUT -s 192.168.63.0/24 -j REJECT
drop是丢弃 REJECT是不回应
对于ping而言 reject收到unreachable ,drop无显示
liunx小型抓包工具
tcpdump -i eth0 -nn
tcpdump -i eth0 -nn src 192.168.63.3
tcpdump -i eth0 -nn host 192.168.63.3
iptables -L (英文)
iptables -nL(包的字节数)
iptables -nvL (更为详细的包的字节数)
iptables -nxvL(精确)
iptables -nvL --line-number编号,先后顺序
iptables -D INPUT 1 删除
iptables -t filter -I `--line-number` INPUT -s 192.168.63.0/24 -j ACCEPT
规则管理
-A:append,追加
-I:insert, 插入,要指明插入至的规则编号,默认为第一条
-D:delete,删除 (1) 指明规则序号 (2) 指明规则本身
-R:replace,替换指定链上的指定规则编号
-F:flush,清空指定的规则链
-Z:zero,置零
iptables的每条规则都有两个计数器
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
全禁用 && 本地回环网络
iptables -t filter -A INPUT -s 0.0.0.0 -j DROP
iptables -p INPUT DROP
iptables -I INPUT 6 -s 127.00.1,192.168.663.250 -j ACCEPT
iptables -r INPUT 5 -i lo -j ACCEPT
iptables -P INPUT DROP
备份
n分钟之后执行任务
echo wall warning | at now+1 minutes
iptables命令拓展
管理端口号
ss -tnl
ss -tn
-
查看帮助 CentOS 6: man iptables CentOS 7: man iptables-extensions
-
muiltport拓展
multiport扩展 以离散方式定义多端口匹配,最多指定15个端口 --source-ports,--sports port[,port|,port:port]... 指定多个源端口 --destination-ports,--dports port[,port|,port:port]... 指定多个目标端口 --ports port[,port|,port:port]...多个源或目标端口 示例: iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT iptables -I INPUT 3 -s 192.168.37.6 -p tcp --dport 80 -j ACCEPT iptables -I INPUT 3 -s 192.168.37.6 -p tcp --dport 330:335 -j ACCEPT muiltport 当不连续端口号 可以使用拓展模块 muiltport iptables -A INPUT -s 192.168.37.6 -p tcp -m multiport --dports 139,445,11001:11032 -j ACCEPT
-
iprange拓展
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
icmp协议在网络层 网络层没有端口
iptables -A INPUT -s 192.168.37.6 -p tcp --syn -j REJECT
(curl 就用不了了,因为curl走的时候tcp协议)
tcp协议有端口
icmp协议中 编号中 0是返回报文 8是请求报文
iptables -I INPUT 6 -s 192.168.63.251 -p icmp --icmp-type 0 -j ACCEPT
250可以ping通251 251ping不通250
-
mac扩展 指明源MAC地址 适用于:PREROUTING, FORWARD,INPUT chains
–mac-source XX:XX:XX:XX:XX:XX
示例: iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT iptables -A INPUT -s 172.16.0.100 -j REJECT
-
string拓展
string拓展 前62个应该是不会出现google字样了 、在传输层往后了
数据帧:8个字节前导信息,6个字节目的mac06个字节目的mac、再加上两个字节type类型、然后到了ip头有固定了20个字节,tcp头又有20个
对报文中的应用层数据做字符串模式匹配检测 --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
-
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指定本地时区(默认) 示例:本地时-8个小时 例如本地要写早9点就写1:00
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
-
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
yum install -y gcc gcc xxx.c -o flood.out##如果不输就是a.out file flood
-
limit扩展
基于收发报文的速率做匹配
令牌桶过滤器
–limit #[/second|/minute|/hour|/day]
–limit-burst number
示例: iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT
-
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
或者写在内核参数的配置文件上
vi /etc/sysctl.conf net.nf_conntrack_max = 6666 sysctl -p #生效 lsmod | grep conn
不同的协议的连接追踪时长 /proc/sys/net/netfilter/
注意:CentOS7 需要加载模块: modprobe nf_conntrack
yum install -y vsftp ftp服务器被动模式端口不固定 可以通过此模块解决 modprobe nf_conntrack_ftp iptables -t filter -I INPUT 3 -m statr --state ESTABLISH,RELATED -j ACCEPT iptables -t filter -I INPUT 3 -p tcp -dport 21 -j ACCEPT 开放被动的ftp服务器 yum install vsftpd systemctl start vsftpd modprobe nf_conntrack_ftp iptables -F iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -vnL
-
Target:
ACCEPT, DROP, REJECT, RETURN
LOG, SNAT, DNAT, REDIRECT, MASQUERADE,…
LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前 并将日志记录在/var/log/messages系统日志中
–log-level level 级别: debug,info,notice, warning, error, crit, alert,emerg
–log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
示例: iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections:
-
策略
任何不允许的访问,应该在请求到达时给予拒绝
规则在链接上的次序即为其检查时的生效次序
基于上述,规则优化
1 安全放行所有入站和出站的状态为ESTABLISHED状态连接
2 谨慎放行入站的新请求
3 有特殊目的限制访问功能,要在放行规则之前加以拒绝
4 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
5 不同类的规则(访问不同应用),匹配范围大的放在前面
6 应该将那些可由一条规则能够描述的多个规则合并为一条
7 设置默认策略,建议白名单(只放行特定连接)
1) iptables -P,不建议
2) 建议在规则的最后定义规则做为默认策略
12 规则有效期限: 使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
保存规则: 保存规则至指定的文件 CentOS 6
service iptables save 将规则覆盖保存至/etc/sysconfig/iptables文件中
CentOS 7 iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS 6: service iptables restart 会自动从/etc/sysconfig/iptables 重新载入规则
CentOS 7 重新载入预存规则文件中规则:
iptables-restore < /PATH/FROM/SOME_RULES_FILE
-n, --noflush:不清除原有规则 -t
–test:仅分析生成规则集,但不提交
-
开机自启动
开机自动重载规则文件中的规则:
(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
(3)自定义Unit File,进行iptables-restore