防火墙之iptables工具
防火墙之IPTABLES
防火墙分类(实现划分、范围划分、协议划分)
- 硬件防火墙
- 软件防火墙
- 主机防火墙
- 网络防火墙
- 下四层防火墙
- 应用层防火墙
linux内核集成于2.4往后版本
- 由Netfilter组件提供
- 实现功能的软件之一:Iptables
netfilter 中的hook
- input
- outpu
- forword
- prerouting
- postrouting
数据流向
- 流入:到本地用户空间
- 流出:访问外部web
- 穿过:转发数据包
iptables对应hook的表chain
- filter、nat、mangle、raw、security
- filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
- nat表:network address translation 地址转换规则表
- mangle:修改数据标记位规则表
- raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
- security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如 SELinux)实现
动作
- ACCEPT、DORP、REJECT...
详细动作:
RETURN:#返回调用链
REDIRECT:#端口重定向
LOG:#记录日志,dmesg
MARK:#做防火墙标记
DNAT:#目标地址转换
SNAT:#源地址转换
MASQUERADE:#地址伪装
自定义链
规则rule
- 语法:
-t filter 默认可省略,故后面未填写的都为 -t filter
iptables -t [filter] -A [INPUT] -s [192.168.47.106] -j [DORP]
iptables -t [表] -A 附加链 -s 规则 -j 满足规则的处理动作
# 指定表
-t table #指定表raw, mangle, nat, [filter]默认
# 子命令
N:#new, 自定义一条新的规则链
-E:#重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
-X:#delete,删除自定义的空的规则链
-P:#Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:#接受
DROP:#丢弃
# 查看选项
-L:#list, 列出指定鏈上的所有规则,本选项须置后
-n:#numberic,以数字格式显示地址和端口号
-v:#verbose,详细信息
-vv #更详细
-x:#exactly,显示计数器结果的精确值,而非单位转换后的易读值
--line-numbers:#显示规则的序号
-S #selected,以iptables-save 命令格式显示链上规则
# 规则管理类
A:#append,追加
-I:#insert, 插入,要指明插入至的规则编号,默认为第一条
-D:#delete,删除 (1) 指明规则序号(2) 指明规则本身
-R:#replace,替换指定链上的指定规则编号 然后添加修改后的规则
-F:#flush,清空指定的规则链
-j:#targetname [per-target-options] 前面的**动作**
-Z:#zero,置零包大小, iptables的每条规则都有两个计数器,(1) 匹配到的报文的个数 (2) 匹配到的所有报文的大小之和
例:
iptables -A INPUT -s 192.168.47.119 -j REJECT
iptables -I INPUT -s 192.168.47.120 -j ACCEPT
iptables -D INPUT 2 ,第二种 (iptables -D INPUT -s 192.168.47.120 -j ACCEPT)
iptables -R INPUT 2 -i lo -j REJECT
基本匹配条件
- 基本匹配条件:无需加载模块,由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链
例:
iptables -A INPUT -s 192.168.47.119 -j REJECT
iptables -A INPUT -p tcp/icmp... -j REJECT
iptables -A INPUT -i lo/eth0... -j REJECT
扩展的匹配规则(使用模块)
- 使用帮助 man iptables-extensions
- 模式: 隐式扩展,显示扩展,且如果没有该模块,需要自己加载模块才能生效
- 隐式: 使用特定协议,即可不使用-m 指定特定模块
例如: tcp udp ...协议
tcp:
--tcp-flags SYN,ACK,FIN,RST SYN #表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
--tcp-flags SYN,ACK,FIN,RST SYN,ACK
--tcp-flags ALL ALL
--tcp_flags ALL NONE
实例:iptables I INPUT 2 -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP (第一次握手的包)
- 显式:使用-m 后调用模块,然后更上模块需要的参数
例如: time,string...等
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 分别表示星期一到星期日
实例:
iptabes -I INPUT 3 -m time --timestart 4:00 --timestop 6:00 -j ACCPET #(在中午午休时间允许访问12点到2点,这里使用TUC时区,需要减8个小时)
关于设置白名单机制
- iptables -I INPUT (最后一条的位置例5) -j DROP (设置除了已允许的能够访问之外,其余都不能访问)
防Dos 攻击:
- iptables -A INPUT -d 172.16.100.10 -p tcp --dport 80 -m connlimit --connlimit-above 1000 -j REJECT ( 在访问数量超过1000次80 端口后就拒绝访问 )
优化
1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条
2. 谨慎放行入站的新请求
3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
4. 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
5. 不同类的规则(访问不同应用),匹配范围大的放在前面
6. 应该将那些可由一条规则能够描述的多个规则合并为一条
7. 设置默认策略,建议白名单(只放行特定连接)
规则保存
- 默认生命周期 :kerenl存活期间
- iptables-save > /etc/iptables.conf (保存规则方法)
- iptables-restore < /etc/iptables.conf (添加文件的规则方法,-n 不清除原有规则)