一、前言
什么是iptables?当我们启动iptables时,使用service命令可以启动iptables。但是并非使用service启动的iptables就能说明其是一个服务。Iptables是一个便以我们写规则的工具,真正起作用的是内核中的netfilter一个框架。Netfilter内置了5个hook函数,当一个数据包交由此机器时,经过这5个hook函数的其中某个才能进入用户空间,或者转发出去。
二、netfilter工作原理
当数据包到达目标主机时,经过PREROUTING链,经路由之后决定是否转发,不转发则进入INPUT链,到达用户空间。进程对外通信时,经由OUTPUT链出去,路由之后到达POSTROUTING链,经网卡出去。当一数据包经过PREROUTING链发现其不是到达本主机,那么数据包经过FORWARD链,到达 POSTROUTING链转发出去。本机进程对发送数据时,经由OUTPUT链路由之后进入POSTROUTING链出去。iptables匹配规则时,是自上而下匹配的,匹配到第一条规则时既跳出,否则一直往下匹配,没有则使用默认规则。
五个hook函数分别是PREROUTING,INPUT ,OUTPUT,POSTROUTING,FORWARD,我们把这五个钩子函数称为链,Netfilter实现了几功能,raw ,mangle,nat,filter。我们一般把这几个功能称为表,表之间有优先级关系,从低到高为filter—-nat—-mangle—-raw,表与链之间有对应关系,具体见图表。
filter | INPUT | FORWARD | OUPUT | ||
nat | PREROUTING(DNAT) | POSTROUTING(SNAT) | OUTPUT | ||
mangle | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
raw | PREROUTING | OUTPUT |
iptables规则建立时,首先需要确定功能(表),确定报文流向,确定要实现的目标,确定匹配条件。iptables时,尽量遵循以下规则:尽量减少规则条目,彼此间无关联,访问条目大放上面,有关联(同一功能),规则更严格的放上面
三、基本语法
iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET
-t TABLE : TABLE为nat,mangle,raw,filter中的一个,默认为filter
COMMAND
链 : -F 清空规则链
-N 自建一条链
-X 删除一条自定义空链
-Z 计数器归零
-P 设置默认策略
-E 重命名自定义链
iptables –t nat -F iptables –t filter –N web_services iptables –t filter –X web_services iptables –t filter -Z iptables –t filter –P DROP iptables –t filter –E web_services www_services
规则:
-A 在规则链最后添加一条规则
-I 在规则链中插入一条规则,默认为第一条
-D 删除一条规则链
-R 替换规则链
iptables –t filter –A www_services –p tcp –-dport 80 –j ACCEPT iptables –t filter –I www_services –p tcp –-dport 22 –j ACCEPT iptables –t filter –D www_services –p tcp –-dport 22 –j ACCEPT iptables –t filter –D www_services 1 iptables –t filter –R www_services –p tcp –dport 22 –j DROP
查看:
-L: List
子选项:
-n: numeric
-v, -vv, -vvv
-x: eXactly
–line-numbers
iptables –t filter –L –n –v
CRETIRIA
通用匹配:
-s, –src, –source:
-d, –dst, –destination:
-p {tcp|udp|icmp}:
-i IN_IF:
-o OUT_IF:
扩展匹配:
调用netfilter额外模块实现特殊检查机制,(使用到相关功能,要使用iptables命令的-m选项来指定调用哪个模块)
隐式扩展:
-p tcp [-m tcp]
–sport PORT[-PORT]
–dport
–tcp-flag 要检查标志位列表(用逗号分隔) 必须为1的标志位列表(逗号分隔)
-p icmp [-m icmp]
–icmp-type
0: echo-reply, ping响应
8: echo-request, ping请求
iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP iptables -t filter -A INPUT -p tcp --tcp-flags syn,ack,rst,fin syn -j DROP iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags all none -j DROP
显式扩展:
-m 扩展模块名称
模块:iptables,netfilter各拥有一部分代码
multiport: 多端口匹配,可用于匹配非连续或连续端口;最多指定15个端口;
–source-ports, –sports port[,port,port:port]
–destination-ports, –dports
–ports
iptables -I INPUT -d 192.168.19.128 -p tcp -m multiport --dports 22,80 -j ACCEPT iptables -I OUTPUT -s 192.168.19.128 -p tcp -m multiport --ports 22,80 -j ACCEPT
iprange: 匹配指定范围内的地址,匹配一段连续的地址而非整个网络时有用;
[!] –src-ragne IP[-IP]
[!] –dst-range
iptables -A INPUT -d 192.168.19.128 -p tcp --dport 23 -m iprange --src-range 192.168.19.129-192.168.19.135 -j ACCEPT iptables -A OUTPUT -s 192.168.19.128 -p tcp --sport 23 -m iprange --dst-range 192.168.19.129-192.168.19.135 -j ACCEPT
string: 字符串匹配,能够检测报文应用层中的字符串
–algo {kmp|bm}
–string "STRING"
–hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;
iptables -I OUTPUT -m string –algo bm –string "sex" -j DROP
time: 基于时间做访问控制
–datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
–datestop
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
–weekdays day[,day]
iptables -I INPUT -d 192.168.19.128 -p tcp –dport 80 -m time –timestart 08:20 –timestop 18:00 –weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;
[!] –connlimit-above [n]
iptables -A INPUT -d 172.16.100.7 -p tcp –dport 22 -m connlimit –connlimit-above 2 -j DROP
limit: 速率限制
–limit n[/second|/minute|/hour|/day]
–limit-burst n
iptables -A INPUT -d 192.168.19.128 -p icmp –icmp-type 8 -m limit –limit 20/minute –limit-burst 5 -j ACCEPT
state: 状态检查
–state
连接追踪中的状态:
NEW: 新建立一个会话
ESTABLISHED:已建立的连接
RELATED: 有关联关系的连接
INVALID: 无法识别的连接
iptables -t filter -A OUTPUT -p tcp –sport 22 -m state –state NEW -j DROP
放行被动模式下的FTP服务:
1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
模块:nf_conntrack_ftp
modprobe nf_conntrack_ftp lsmod | grep nf_conntrack_ftp nf_conntrack_ftp 12913 0 nf_conntrack 79758 3 nf_conntrack_ftp,nf_conntrack_ipv6,xt_state
2、放行请求报文:
(1)放行NEW状态对21端口请求的报文;
iptables -A INPUT -p tcp –dport 21 -m –state NEW -j ACCEPT
(2) 放行ESTABLISHED以及RELATED状态的报文
iptables -A INPUT -m –state ESTABLISHED,RELATED -j ACCEPT
3、放行响应报文:
(1) 放行ESTABLISHED以及RELATED状态的报文
iptables -A OUTPUT -m –state ESTABLISHED,RELATED -j ACCEPT
由于系统对调整连接追踪功能所能容纳的连接有最大数目,视具体清空调整最大连接数目,或者不启用此功能
cat /proc/sys/net/nf_conntrack_max
65536
其中当前追踪的所有连接在/proc/net/nf_conntrack中
/proc/net/nf_conntrack
不同协议或连接类型追踪时的属性,/proc/sys/net/netfilter目录:
TARGET: (-j target)
ACCEPT, REJECT, DROP, SNAT, DNAT, MASQERADE, RETURN, LOG, REDIRECT, MARK
SNAT:
–to-source SIP
DNAT
–to-destination
iptables -t nat -A POSTROUTING -p tcp --dport 23210 -j SNAT --to-source 192.168.19.129 iptables -t nat -A PREROUTING -p tcp --dport 23220 -j DNAT --to-destination 192.168.19.129 iptables -A INPUT -d 192.168.19.128 -p tcp --dport 80 -j LOG --log-prefix "from iptables: "
四、 案例
4.1、实验拓扑图
4.2、配置过程
搭建环境
在firewall添加一块网卡,同时网络连接为自定义–VMnet3,webserver和client的网络连接也自定义在VMnet3上
Firewall配置ip,其中eth1网卡ip地址是自动获取的
Webserver
添加网关
Client
添加网关
为了不让已有iptables规则对实验产生影戏,先清空规则链
在所有主机上执行这些命令
此时在webserver或client 上无法ping通外网
当需要使用转发功能时,需要打开网络转发功能
Vim /etc/sysctl.conf
Net.ipv4.ip_forward=1
Sysctl –p
配置SNAT
或者
测试,在webserver上测试
远程主机返回应答的包到目标主机时,没有在防火墙上做地址转换,却依然能把数据包转发给webserver,这是因为防火墙那台主机上维持了一张转换或的IP或端口对应表,故无需人为去添加转换规则。
在防火墙上添加DNAT
在物理机上访问172.16.0.2的网站
五、总结
iptables可做主机防火墙和网络防火墙,做为网络防火墙时需要打开转发功能,iptables规则顺序很重要,其自上而下匹配的规则链,故需要一条一条检查规则链,故常用规则,特别是匹配次数大的放在上边,同一规则更严格的条目放在上面。
原创文章,作者:成吉思汗,如若转载,请注明出处:http://www.178linux.com/8950
评论列表(2条)
赞,已置顶,有机会可以给大家分享写blog经验
@stanley:谢谢,新手不敢造次呀