iptables从入门到精通
本文主要围绕以下七点进行阐述:
一、防火墙简介
二、Iptables简介
三、Iptables的四张表及五条链
四、Iptables的filter应用详解
五、Iptables的nat应用详解
一、防火墙简介:
在网络中,所谓的防火墙是指一种将内部网络和公众访问网分开的方法,它实际上一种隔离技术。
防火墙分硬件防火墙和软件防火墙,无论在哪个网络中,防火墙均工作在网络的边缘,我们的任务就是需要定义防火墙在网络中如何进行工作,这就是防火墙的工作策略,规则,以达到让它对出入网络的IP、数据进行检测。
对于TCP/IP的模型来讲,网络层的防火墙会在网络层对原地址和目标地址进行检测,但对于七层的防火墙,不管你源端口或者目标端口,都将会对所有的东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了更低的效率。所以目前市面一般采用三层和七层相结合的防火墙方案。
二、iptables简介
Iptables是Linux系统中的防火墙,用于实现Linux下访问控制的功能,第一版前身是ipfirewall(内核1.x时代),可以将所有规则都需要放在内核中对数据包进行检测的一款简易访问控制工具。第二版更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,现在,他叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制列表。
Iptables定义的规则,可以让在内核空间中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做netfilter(网络过滤器)。
三、iptables的四张表及五条链
Netfilter:功能
Netfilter所规定的五个链规则,任何一个数据包,只要经过本机,必将会经过这五个链中的其中一链。
Filter:input forward output
//定义一般的过滤功能
Nat:prerouting output postrouting
//用于nat功能(端口映射,地址映射)
Mangle:prerouting input forward output postrouting
//用于对特定的数据包进行修改
Raw:prerouting output
//优先级最高,设置raw时一般是为了不再让iptables做数据包 的链接跟踪处理,提高性能。
优先级(有高至低)
Raw—->managle—->nat—–>filter
五条链:这五条链也被成为五个钩子函数(hook functions);
i. PREROUTING //路由前
ii. INPUT //数据包流入入口
iii. FORWARD //转发管卡
iv. OUTPUT //数据包流出出口
v. POSTROUTING //路由后
Iptables/netfilter是工作在用户空间的,它可让规则进行生效的,本身不是一种服务,而且规则是立即生效的。而我们iptables现在被做成了一个服务,可以进行启动,停止的。启动,规则将会直接生效,停止,则将规则撤销。
Iptables支持定义链。自定义链需要跟某种特定的链关联起来。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完之后,在放回。接着在特定的链中继续检查。
Iptables的规则顺序非常关键,谁的规则越严格,应该放的越靠前,而检查的规则的时候,是按照从上向下的方式进行。
在五条链上添加规则时需要遵守以下规则,以达到对规则有优化
1、实现的功能:英语判定将规则添加至哪个表;
2、报文流经位置:用于判断将规则添加至哪个链;
3、报文的流向:判定规则中何为“源”,何为“目标”;
4、匹配条件:用于编写正确的匹配规则;
a) 专用于某些应用的同类规则,匹配范围小的放在前面;
b) 专用于某些应用的不同规则,匹配到的可能性较多的放在前面;同一类别的规则可使用自定义链单独存放;
c) 用于通用目的的规则放在前面;
d) 为了避免本机不能与本机通信一般不采用将默认规则更改为DROP或者REJECT;而在最后添加一条拒绝的策略;如下
Iptables -A INPUT -j DROP
Iptables -A OUTPUT -j DROP
四、iptables的filter用法详解
iptables [-t table] COMMAND [chain] [PARAMETERS] [-m matchname [per-match-options]] [-j [target-options]]
iptables默认使用filter表:
连管理的主要选项:
-N : –new-chain chain 新建一个自定义的规则链;
[root@localhost ~]# iptables -N QQ //新增一个链规则
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 153 packets, 49806 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 138 packets, 49290 bytes)
pkts bytes target prot opt in out source destination
Chain QQ (0 references)
pkts bytes target prot opt in out source destination
-X : –delete-chain 删除用户自定义的引用计数为0的空链;
-F : –flush [chain] 清空指定的规则链上的规则;
-E : –rename-chain old-chain new-chain :重命名链;
-Z :–zero [chain[rulenum]] :置零计数器;
注意:每个规则都有两个计数器:
packets:被本规则所匹配到的所有报文的个数 ;
bytes:被本规则所匹配到的所有报文的大小之和;
-P :–policy chain target 定义规则链中的默认规则;
规则管理的主要选项:
-A : 追加新规则用于制定链的尾部;
-I :插入新规则于指定链的指定位置,默认为首部
-R : 替换指定的规则为新的规则
-D : –delete chain rule-specification 根据规则本身删除规则
-D : –delete chain rulenum 根据规则编号删除规则
规则显示:
-L : –list [chain]:列出规则;
-v :–verbose 详细信息
-vv :更详细的信息
-n :–numeric 数字格式显示主机地址和端口号
-x :–exact 显示计数器的精确值,而非圆整后的数据;
–line-numbers: 列出规则时,显示其在链上的相应编号;
#iptables -vnL //显示当前iptables的策略
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 3604K packets, 600M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3567K packets, 605M bytes)
pkts bytes target prot opt in out source destination
-S : –list-rules [chain] :显示指定链的所有规则
匹配条件:
通用匹配(PARAMETERS):
[!]-s :–source address[/mask][,…]:检查报文的源ip地址是否符合此处指定的范围,或者是否等于此处给定的地址;
[!]-d :–destination address[/mask][…]:检查报文的目标地址是否符合此处指定的范围,或是否等于此处给定的地址;
[!]-p :–protocol protocol:匹配报文中的协议,可用值tcp,udp,udplite,icmp,icmpv6,esp,ah,actp,mh或者all,也可以使用数字格式指名协议;
-m :–match match :调用制定的扩展匹配模块来扩展匹配条件检查机制;
[!]-i :–in-interface name :限定报文仅能够从指定的接口流入;only for pack-ets entering the INPUT, FORWARD and PREROUTING chains
[!]-o :–out-interface name :限定报文仅能够从指定的接口流入;for packets entering the FORWARD, OUTPUT and POSTROUTING chains
跳转目标:
-j targetname [per-target-options]
ACCETP : 允许数据包通过
DROP:直接丢弃数据包,不回应任何信息
REJECT:拒绝数据包通过,会给数据发送端一个响应的信息;
练习~
1、仅允许主机172.16.252.52对172.16.80.72的SSH端口访问,并设置默认策略是DROP;
iptables -I INPUT -s 172.16.252.52 -d 172.16.80.72 -p tcp –dport 22 -j ACCEPT
iptables -A INPUT -d 172.16.80.72 -j DROP
iptables -I OUTPUT -s 172.16.80.72 -p tcp –sport 22 -j ACCEPT
iptables -A OUTPUT -s 172.16.80.72 -j DROP
2、添加并引用自定义链然后再删,规则如下:
添加自定义链名为:NEW_LIAN
NEW_LIAN开放22 80 端口
将NEW_LIAN引用至INPUT,
iptables -I NEW_LIAN -d 172.16.80.72 -p tcp –dport 22 -j ACCEPT
iptables -I NEW_LIAN -d 172.16.80.72 -p tcp –dport 80 -j ACCEPT
iptables -A NEW_LIAN -d 172.16.80.72 -j DROP
iptables -I INPUT -j NEW_LIAN
iptables -D NEW_LIAN 1 //删除NEW_LIAN的第一条规则,
iptables -D NEW_LIAN 1 //上一条规则删除后,第二条规则变成第一
iptables -D NEW_LIAN 1
iptables -X NEW_LIAN
扩展匹配条件:
隐式扩展:在使用-p选项指明了特定的协议时,无需使用-m选项指明模块的扩展机制;
显示扩展:必须使用-m选项要调用的扩展模块的扩展机制;
隐式扩展:
-p tcp:可直接使用tcp协议对应的扩展选项;
[!] –source-port,–sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;
[!] –destination-port,–dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;
[!] –tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH;
mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST
comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0;
–tcp-flags SYN,ACK,FIN,RST SYN
[!] –syn:相当于–tcp-flags SYN,ACK,FIN,RST SYN
-p udp:可直接使用udp协议对应的扩展选项;
[!] –source-port,–sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;
[!] –destination-port,–dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;
-p icmp:可直接使用cimp协议对应的扩展选项;
[!] –icmp-type {type[/code]|typename}
–icmp-type 0/0:匹配对ping请求的响应报文
–icmp-type 8/0:匹配ping请求报文
显示扩展:
1、Multiport
以离散或连续的方式定义的多端口匹配条件;
[!] –source-ports,–sports port[,port|,port:port]…:指定多个源端口;
[!] –destination-ports,–dports port[,port|,port:port]…:指定多个目标端口;
[!] –ports port[,port|,port:port]…:匹配此处指定的源或目标端口;
以下规则允许22,80端口访问;
Iptables -I INPUT -d 172.16.80.72 -p tcp -m multiport –dports 22,80 -j ACCEPT
Iptables -I OUTPUT -s 172.16.80.72 -p tcp -m multiport –sports 22,80 -j ACCETP
Iptables -A INPUT -d 172.16.80.72 -j DROP
Iptables -A OUTPUT -s 172.16.80.72 -j DROP
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 956 packets, 263K bytes)
pkts bytes target prot opt in out source destination
63 6197 ACCEPT tcp — * * 0.0.0.0/0 172.16.80.72 multiport dports 22,80
50 3772 DROP all — * * 0.0.0.0/0 172.16.80.72
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 946 packets, 261K bytes)
pkts bytes target prot opt in out source destination
49 7775 ACCEPT tcp — * * 172.16.80.72 0.0.0.0/0 multiport sports 22,80
100 6472 DROP all — * * 172.16.80.72 0.0.0.0/0
[root@localhost ~]#
2、Iprange
以连续的ip地址范围指明多地址匹配条件;
[!] –src-range from[-to]
[!] –dst-range from[-to]
3、string
对报文中的应用层数据做字符串匹配检测;
[!] –string pattern
[!] –hex-string pattern
–algo {bm|kmp}:字符串匹配检查算法;
–from offset
–to offset
4、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…]
5、connlimit
根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求;
–connlimit-upto n:连接数小于等于阈值;
–connlimit-above n:连接数超出阈值;
Iptables -I INPUT -d 172.16.80.72 -p tcp –dport 80 -m connlimit-upto 10 -J AAEPT
lptables -I INPUT -d 10.1.0.6 -p tcp –dport 22 -m connlimit –connlimit-above 2 -j REJECT
6、limit
基于收发报文的速率进行匹配;
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
iptables -A INPUT -d 10.1.0.6 -p icmp –icmp-type 8 -m limit –limit-burst 3 –limit 20/minute -j ACCEPT
//当ping请求到3个的时候没分钟20个的速度进行控制;
7、state
状态检测:连接追踪机制(conntrack)
NEW:新连接
ESTABLISHED:已建立的连接
RELATED:相关联的连接
INVALID:无法识别的连接
UNTRACKED:未被追踪连接;
相关的内核模块:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp
追踪到的连接:/proc/net/nf_conntrack文件中;
能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max //默认为65535
建议调整至足够大;
不同的协议的连接追踪时长:
/proc/sys/net/netfilter/
[!] –state state
如何开放被动模式的ftp服务:
(1) 装载追踪ftp协议的模块;
# modprobe nf_conntrack_ftp
(2) 放行入站命令连接
# iptables -A INPUT -d SERVER_IP -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT
(3) 放行入站数据连接
# iptables -A INPUT -d SERVER_IP -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT
(4) 放行出站的ESTABLISHED连接
# iptabls -A OUTPUT -s SERVER_IP -m state –state ESTABLISHED -j ACCEPT
扩展target:
REJECT:
–reject-with type
Icmp-net-unreachable,icmp-host-unreachable,icmp-port-unreachable,
Icmp-proto-unreachable,icmp-net-prohibited,icmp-host-prohibited,or
Icmp-admin-prohibited,默认为icmp-port-unreachable
LOG:
Turn on kernel logging of matching packets.
–log-level level
–log-prefix prefix:日志信息的前导信息;
保存和载入规则
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptables-restore < /PATH/FROM/SOME_RULE-file
-n,–noflush:不清除原有规则
-t,–test:仅分析生成规则集,但不予提交;
Centos 6
保存:servicce iptables save
保存规则于:Iptables-save > /path/to/iptables,保存操作会清除文件中原有的内容;
重载:service iptables restart
默认重载/etc/sysconfig/iptables文件中的规则
脚本配置文件 /etc/sysconfig/iptables-config
用于指明要装载的模块
Centos 7开机自动生效规则
(1)firewalld服务;
(2)Shell脚本,直接记录iptables命令;
(3)自定义unit file 或init script;
规则优化的思路:
(1) 优先放行双方向状态为ESTABLISHED的报文;
(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
(3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;
(4) 设置默认策略:白名单机制
(a) 可使用iptables -P设定默认策略;
(b) 建议在规则链的最后定义规则做为默认策略;
练习:基于状态放行telnet, ftp, ssh, http, samba, icmp等服务;
(1) 对本机的ping请求每分钟不得超出20个;
(2) 每客户端对本机的ssh的并发连接数不得超过3个;
(3) 本机的telnet服务仅允许工作时间内访问;
#iptables -I INPUT -d 172.16.80.72 -p tcp –dport 22 -m connlimit –connlimit-above 3 -j DROP
#iptables -I INPUT -d 172.16.80.72 -p icmp –icmp-type 8 -m limit –limit-burst 20 –limit 20/minute -j ACCEPT
#iptables -I INPUT -d 172.16.80.72 -p tcp -m multiport –dports 20,21,22,45,80 -j ACCEPT
#iptables -I INPUT -d 172.16.80.72 -P tcp –dport 23 -m time –weekdays 1,2,3,4,5 -j ACCEPT
#iptabels -A INPUT -d 172.16.80.82 -j DROP
五nat详解
iptables/netfilter网络防火墙:
(1) 网关;
(2) filter表的FORWARD链;
要注意的问题:
(1) 请求–响应报文均会经由FORWARD链,要注意规则的方向性;
(2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接报文;
NAT: Network Address Translation
地址转换协议
请求报文:由管理员进行定义;
响应报文:由NAT的conntrack机制自动实现;
改源地址:SNAT //源地址转换
目标地址不变,重新改写源地址,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机
目前大多都是解决内网用户同一个公网地址上网的情况;
改目标地址:DNAT //目标地址转换
和SNAT相反,源地址不变,重新修改目标数据,在本机建立NAT表项,当书记返回时,根据NAT表将源地址修改为数据发送过来的目标地址,并发送给远程主机;
在DNAT的基础上,可以根据请求数据包的端口做PNAT(端口转换,也成为端口映射),可以将请求数据包不同的端口改写不同的目标地址,从而发送给不同的主机;
这在用一个公网地址做不同服务时用的比较多,而且相对来说,用NAT的方式可以隐藏后端服务器的真实地址,更加的安全
Iptables/netfilter:
NAT定义在nat表:
PREROUTING,INPUT,OUTPUT,POSTROUTING;
SNAT:POSTROUTING
DNAT:PREROUTING
在nat模型里,完成nat的实现,要经过prerouting—-forward—–postrouting这三个链
分析SNAT的数据流向:
首先进入prerouting,发现不是本网段的地址,而后开始查找路由表(查找路由的过程在prerouting和forward之间),于是经过forward链进行转发,在通过postrouting时进行NAT转换。
在这个流程中,NAT转换的步骤在POSTROUTING链上实现,之所以不在prerouting上做nat是因为数据包在进来之前,还不知道是本网段地址还是外网地址;
再分析DNAT的数据流向过程
在DNAT中,NAT要在prerouting链上做。之前提到过,在数据进入主机后,路由选择过程是在prerouting和forword之间的,所以应该先做地址转换之后,再进行路由选择,而后经过forword,最后从postrouting出去
在做nat之前,需要打开forward
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
SNAT
添加nat表项
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 172.16.93.0/24 -j SNAT –to-source 10.0.0.1
表示在postrouting链上,将源地址为172.16.93.0/24网段的数据包的源地址都转换为10.0.0.1
iptables -t nat -A POSTROUTING -s 172.16.93.0/24 -o eth1 -j MASQUEREADE //一般用在目标地址不确定
在DNAT中,要把规则定义在PREROUTING链中
iptables -t nat -A PREROUTING -d 10.0.0.1 -j DNAT –-to-destination 172.16.93.1
此条规则将请求IP为10.0.0.1的数据包转发到后端172.16.93.1主机上
原创文章,作者:guo_ruillin,如若转载,请注明出处:http://www.178linux.com/66625