概述:
iptables:基于软件的形式实现的一种防火墙的软件程序 Firewall:工作在主机或网络边缘,对进出的报文按事先定义的规则进行检查,并且由匹配到的规则进行处理的一组硬件或软件,甚至可能是两者的组合 主机防火墙:工作于主机边缘,只能对一台主机起到保护作用 网络防火墙:工作于网络边缘,对多台主机起到保护作用 网络层:网络防火墙 应用层:网关 IDS:入侵检测 HIDS:OSSEC NIDS:snort Filesystem:tireware IPS:入侵防御系统 honeypot:蜜罐 系统评估安全工具: Nessus,nmap iptables/netfilter:基于网络层的防火墙,连接追踪(状态检测) ipfw ipchains iptables iptables:防火墙规则编写工具 netfiter:网络过滤器,是一个框架 hook_function INPUT OUTPUT FORWARD POATROUTING PRERROUTING 过滤:做报文筛选 NAT:Network Address Transltion DNAT SNAT mangle: raw: FORWARD: filter mangle INPUT filter mangle OUT filter mangle nat PREROUTING mangle nat POSTOUTING mangle nat 将控制强的放在前面,应用访问频繁的也要放在前面 四表: fileter,net,mangle,raw 五链 PREROUTING(路由前) INPUT FOREARD OUTPUT POSTROUTING(路由后) 表和链的对应关系 filer:INPUT,FORWARD.OUTPUT nat:PREROUTING OUTPUT POSTROUTING mangle:PREROUTING FORWARD POSTROUTING INPUT OUTPUT 规则:检查条件,处理机制, 通:白名单,默认为堵,只对能识别的进行放行 堵:黑名单,默认为通,只对能识别的进行阻截 检查条件: IP:SIP,DIP TCP:SPORT,DPORT,FLags UDP:SPORT,DPORT ICMP:ICMP-TYPE 扩展机制: time string state(connection-tracking) 处理机制: DROP(丢弃), REJECT(拒绝,并返回) ACCEPT(允许) SNAT DNAT RETURN(返回) REDIRECT(端口转发) LOG(只记录日志) mangle:做防火墙标记如何写规则
-t 表 -L 列出 -n 以数值方式显示 iptables [-t table] -N chain 创建一条自定义的空规则链 iptables [-t table] -X chain 产出一条自定义的空规则链 iptables [-t table] -E old-chin-name new-chain-name 为链修改名 iptables [-t table] -P chain—name target 为链指定默认策略,修改默认的属性 iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] -F 清空链中的规则 规则由编号,在链中自上而下,从1开始 -L list 列出表中的所有规则 -n:数字格式显示ip和port -v:显示信息, pkts:packets,被本规则所有匹配到的报文的个数 baytes:被本规则所匹配到的所有报文的大小子和,单位是字节,会执行单位换算 target:目标,即处理机制 port:协议一般为(TCP|UDP|ICMP) opt:可选项 in:数据包的流入端口 out:数据包的流出接口 scource:源地址 destination:目标地址 -vv: -vvv: -x:exactly:精确值,不执行单位换 --line-nambers:显示各规则的行号 -Z:zero,清零: 把规则的计数器清零 打印iptables列表 # iptables -t filter -L -n 建立新的规则mychain # iptables -t filter -N mychain 删除mychain # iptables -X mychain 网络192.168.0.0/16访问192.168.8.40允许 # iptables -t filter -A INPUT -s 192.168.0.0/16 -d 192.168.8.40 -j ACCEPT 主机192.168.8.40访问192.168.0.0/16网段允许 # iptables -t filter -A OUTPUT -s 192.168.8.40 -d 192.168.0.0/16 -j ACCEPT 网段192.168.11.0访问192.168.8.40 icmp协议丢弃 # iptables -A INPUT -i eth0 -s 192.168.11.0/24 -d 192.168.8.40 -p icmp -j DROP 拒绝 # iptables -A INPUT -i eth0 -d 192.168.8.40 -p icmp -j REJECT # iptables -A OUTPUT -o eth0 -s 192.168.8.40 -p icmp -j REJECT iptables [-t table] {-A|-D} chain rule-specification -A:append,附加一条规则 rule-specification 匹配条件 -j 处理机制匹配条件:
通用匹配 -s 匹配原地址,可以IP,也可以网络地址:可以使用!操作符取反,!172.168.0.0/16 相当于 --src,或 --source -d 匹配目标地址,可以IP,也可以网络地址:可以使用!操作符取反,!172.168.0.0/16 -p 匹配协议,通常只能使用{TCP|UDP|ICMP}三者之一 -i 数据报文流入的接口,通常只用于INPUT,FORWARD和PREROUTING -o 数据报文流出的接口,通常只用OUTPUT,FORWARD和POSTROUTING 保存规则: service iptables save 规则会被保存至/etc/sysconfig/iptables文件中: 默认,start时也会读取次文件中的内容以设置规则 iptables-save > /path/to/some_rulefile 保存iptables至别的位置 iptables-restore < /path/to/some_rulefile 从自定义的位置读取并使之生效 规则命令: -A:添加 -D:删除 iptables [-t table] -D chain rulenum 当一条被删除,另外的一条会被补上
删除INPUT和OUTPUT中的第二条规则
# iptables -t filter -D INPUT 2
# iptables -t filter -D OUTPUT 2
插入规则 iptables [-t table] -I chain [rulenum] rule-specification 替换规则(覆盖指定规则) iptables [-t table] -R chain rulenum rule-specification 显示指定链上的规则添加命令 iptables [-t table] -S [chain [rulenum]]扩展匹配
隐含扩展:使用-p {tcp|udp|icmp}指定某特定协议后,自动能够对协议进行的扩展 -p tcp --dport m[-n],匹配的目标端口,可以是连续的多个端口 --sport:m[-n],匹配的源端口,可以是连续的多个端口 --tcp-flagsURG PSH PST SYN ACK FIN
显式扩展:必须要明确指定的扩展模块
-m 扩展模块名称 --专用选项1 --专用选项2 multiport:多端口匹配,一次指定多个离散端口 --source-ports --sport ports{port1 port2} --destination-ports, --dports --ports iprange:ip地址服务 [!] --src-range from [-to] [!] --dst-range from [-to] time 指定时间范围 --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --timestart hh:mm[:ss] --timestart hh:mm[:ss] [!] --weekdays day[,day....] string 字符串匹配 --alog {bm|kmp} :字符匹配查找时使用的算法 --string “STRING” :要查找的字符串 --hex-string "HEX-STRING" 要查找的字符,先编码成16进制格式 connlimit:每IP对指定服务的最大并发连接数 [!] --connlimit-above limit:报文速率控制 --limit #[/second|/minute|/hour|/day] --limit-burst # hping3:安装此包,做测试 state:状态追踪 ip_conntrack,nf_conntrack netfilter:会话 --state NEW ESTABLISHED RELATED INVALID 调整连接追踪功能所能容纳的最大连接数 cat /proc/sys/net/nf_conntrack_max 定义了连接追踪的最大值,因此,建议按需调大此值 cat /proc/net/nf_conntrack 记录了当前追踪的所有连接 cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established 超时时间 法则: 1.对于进入状态为ESTABLISHED都应该放行 2.对于返回状态为ESTABLISHED都应该放行 3.严格检查进入的状态为NEW的链接 4.所有状态为INVALID都应该拒绝 iptable -I lean_in 5 -d 172.16.100.7 -m state --state INVALID -j DROP -j target RETURN:返回调用链常见服务规则案例:
放行来自于网络192.168.11.0/24对本机192.168.8.40 ssh服务的访问: # iptables -t filter -A INPUT -s 192.168.11.0/24 -d 192.168.8.40 -p tcp --dport 22 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.8.40 -d 192.168.11.0/24 -p tcp --sport 22 -j ACCEPT拒绝来自192.168.11.0网段对192.168.8.40 web 80端口的访问
# iptables -A INPUT -s 192.168.11.0/24 -d 192.168.8.40 -p tcp --dport 80 -j DROP
# iptables -A OUTPUT -s 192.168.8.40 -d 192.168.11.0/24 -p tcp --sport 80 -j DROP
-p udp --dport m[-n],匹配的目标端口,可以是连续的多个端口 --sport:m[-n],匹配的源端口,可以是连续的多个端口 放行本机的tftp服务 # iptables -A INPUT -s 192.168.11.0/24 -d 192.168.8.40 -p udp --dport 69 -j ACCEPT # iptables -A OUTPUT -s 192.168.8.40 -d 192.168.11.0/24 -p udp --sport 69 -j ACCEPT 放行本机的DNS服务 # iptables -A INPUT -s 192.168.0.0/16 -d 192.168.8.40 -p udp --dport 53 -j ACCEPT # iptables -A OUTPUT -s 192.168.8.40 -d 192.168.0.0/16 -p udp --sport 53 -j ACCEPT 查询互联网dns # iptables -A OUTPUT -s 192.168.8.40 -p udp --dport 53 -j ACCEPT # iptables -A INPUT -d 192.168.8.40 -p udp --sport 53 -j ACCEPT -p icmp --icmp-type 8:ping请求 0:ping响应 放开本机的ping响应 # iptables -A INPUT -d 192.168.8.40 -p icmp --icmp-type 8 -j ACCEPT # iptables -A OUTPUT -s 192.168.8.40 -p icmp --icmp-type 0 -j ACCEPT 将input、output和forward都禁用 # iptables -P INPUT DROP # iptables -P OUTPUT DROP # iptables -P FORWARD DROP 放行192.168.11.0/24网络对80端口访问 # iptables -t filter -A INPUT -s 192.168.11.0/24 -d 192.168.8.40 -p tcp --dport 80 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.8.40 -d 192.168.11.0/24 -p tcp --sport 80 -j ACCEPT 放行3306端口对所有主机的访问 # iptables -t filter -A INPUT -d 192.168.8.40 -p tcp --dport 3306 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.8.40 -p tcp --sport 3306 -j ACCEPT 放行对本地回环口的访问: # iptables -A INPUT -i lo -j ACCEPT # iptables -A OUTPUT -o lo -j ACCEPT保存规则
# service iptables save
扩展匹配之状态追踪案例
初始化
# iptables -P INPUT ACCEPT # iptables -P OUTPUT ACCEPT # iptables -F
放行对192.168.8.40 新建立、已经建立连接的ssh服务访问
# iptables -A INPUT -d 192.168.8.40 -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s 192.168.8.40 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# iptables -P INPUT DROP # iptables -P OUTPUT DROP
//对每秒2次,高峰5次的ping包给予响应
# iptables -A INPUT -d 192.168.8.40 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 5 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -s 192.168.8.40 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT //放行80端口 # iptables -A INPUT -d 192.168.8.40 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -s 192.168.8.40 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT 验证 # curl -I http://192.168.8.40/index.html HTTP/1.1 200 OK Date: Mon, 28 Dec 2015 15:11:36 GMT Server: Apache/2.4.9 (Unix) Last-Modified: Sun, 27 Dec 2015 19:39:40 GMT ETag: "1c-527e659749c1c" Accept-Ranges: bytes Content-Length: 28 Content-Type: text/html //对输入、输出已经建立的连接放行 # iptables -I INPUT -d 192.168.8.40 -m state --state ESTABLISHED -j ACCEPT # iptables -I OUTPUT -s 192.168.8.40 -m state --state ESTABLISHED -j ACCEPT 对规则进行合并 # iptables -I INPUT 2 -d 192.168.8.40 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT 删除无用规则 # iptables -L -n -v --line-numbers # iptables -D INPUT 3 # iptables -D INPUT 4 # iptables -D OUTPUT 2 # iptables -D OUTPUT 2 # iptables -D OUTPUT 2 # iptables -L -n -v --line-numbers 通过命令观察数据变化 # watch -n .3 "iptables -L -n -v"