首页 > 代码库 > iptables
iptables
iptables: 包过滤型的防火墙
防火墙,字面理解做好一堵墙预防火灾。在计算机中什么代表火? 那就是危险以及任何和安全相关的不确定的因素。那在这里iptables就是那堵墙。那我们要提前建好一个墙,做好防患于未然,把危险过滤在墙外。
而且在传输协议中所有的传输都要把传输的内容封装为一个一个的包传送,iptables就是基于这种情况下做过滤,所以又称为包过滤型防火墙。
过滤方式(四表五链)
什么是四表五链?
简单来说就是实现iptables的管理,根据报文流入流出的原理而设置的一套详细的过滤配置,看下图每个表和链的对应关系;
四个表:
表优先级的对应关系:Raw——>mangle——>nat——>filter
filter :(过滤规则表)过滤防火墙,该表根据管理员预定义的一组规则过滤符合条件的数据报。
nat :(地址转换规则表)用于修改源IP或目标IP,也可以改端口;
mangle :(修改数据标记位规则表)拆解报文,做出修改,并重新封装起来;
raw :(跟踪数据表规则)关闭nat表上启用的连接追踪机制;
链处理规则位置:
每个表基于不同的规则对应处理不同链上的数据,每个链对应的添加规则的位置如下图;
五个链:
PREROUTING :(目的地转换)负责把公网IP转换为内网IP,可以保护内网“主机|服务器”不被外网发现,增加“主机|服务器”的安全性。以及判断传输的数据是否需要转发还是本机需要的。
INPUT :接收数据。
FORWARD :访问目标不是本机,服务器使用路由功能实现转发。(当然也有专门的路由服务器)。
OUTPUT :请求数据。
POSTROUTING :(源地址转换)把内网IP转换为公网IP。同样起到了保护内网“主机|服务器”的安全的作用。
添加规则时的考量点:(规则添加之后是立即送往内核并且生效的)
(1) 要实现哪种功能:判断添加到哪个表上;(2) 报文流经的路径:判断添加到哪个链上;
(1) 同类规则(访问同一应用),匹配范围小的放上面;(2) 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;(3) 将那些可由一条规则描述的多个规则合并起来;(4) 设置默认策略;
那该怎么处理规则呢?
防火墙服务:service iptables {start|stop|restart|status} ##CentOS6及以下
systemctl {start|stop|restart|status} firewalld.service ##CentOS7
语法格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
举例: iptables -R INPUT 1 -d 172.16.251.124 -p tcp --dport 80 -m iprange --src-range 172.16.250.25-172.16.250.30 -m time ! --weekdays 7 -j REJECT(如果不指定表默认是filter)
配置filter表上的流入的第一条规则,(原本的第一条规则此时变成了第二条这里需要注意)目标主机是172.16.251.124 扩展模式指定目标地址范围172.16.250.25-172.16.250.30 指定时间 (!取反)不是周日的时候拒绝访问tcp协议的80端口。
-j 来指定对包的处理 ##选项有很多,这里只介绍常用的几个ACCEPT:接受DROP:丢弃REJECT:拒绝REDIRECT:端口重定向
? 加油加油! ? 看起来比较麻烦,但是把下面的几个基础选项掌握就so easy了。
ミ ミ ( ??? )ミ゛ミ
゛゛ \ /゛゛
i⌒ヽ |
(_) ノ
∪
匹配条件:
隐式扩展[-m]
基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供; ##!为取反
[!] -s:指定源IP
[!] -d:指定目标IP
[!]--sport port[:port]:匹配报文的源端口;可以是端口范围;
[!] --dport port[:port]:匹配报文的目标端口;可以是端口范围;
[!] --syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“的简写;
[!] --sport port[:port]:匹配报文的源端口;可以是端口范围;
[!] --dport port[:port]:匹配报文的目标端口;可以是端口范围;
[!] --icmp-type {type[/code]|typename}
echo-request:8
echo-reply:0
比如此时想要访问web网站,那针对这个怎么配置防火墙呢?
iptables -I INPUT 1 -s 192.168.186.126 -p tcp --sport 80 -j ACCEPT
iptables -I OUTPUT 1 -d 192.168.186.126 -p tcp --dport 80 -j ACCEPT
这里使用tcp协议如果不加-p默认所有协议 因为访问80端口需要发送数据,服务器也要给我们回发我们请求的数据,所以要配置INPUT和OUTPUT两个链。()
显式扩展:-m
- 1、multiport扩展
- 2、iprange扩展
- 3、string扩展
- 4、time扩展
5、connlimit扩展
6、limit扩展
7、state扩展
根据”连接追踪机制“去检查连接的状态;
conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
INVALID:无效的连接;
UNTRACKED:未进行追踪的连接;
[!] --state state
iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
Nat表介绍
nat :(地址转换规则表)用于修改源IP或目标IP,也可以改端口,看下图;
这里介绍介绍nat是因为比较有代表性,重复一下对应的链规则有;
- prerouting
- output
- postrouting
nat表主要用来隐藏局域网内主机或者服务器,主机访问外网,路由负责把局域网内主机IP转换成为自己的,目标地址不变,把访问记录记录在一个表,服务器响应的时候会把数据丢给路由,路由接受到数据会检查自己的表是否是自己局域网内的主机请求的,如果不是会把数据丢弃,如果有记录会把目标地址改为局域网内的主机源地址不变(此时因为是响应报文所以源地址是web服务器)。
原理相同,同样可以把服务器隐藏起来,事实上现在的服务器都已经被隐藏,没有哪个公司的服务器暴露在公网之下,这样风险太大。
并且因为IPV4地址比较稀缺,并不能做到每个主机一个IP,也算是无心插柳节约了一部分地址,而且每个主机配一个IP也算一笔不菲的费用。
nat表的target:
SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围;
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围;
--to-destination [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -A POSTROUTING -s 192.168.217.0/24 -j SNAT --to-source 172.16.0.6(网卡的另外一个地址图上没有画出来)
因为局域网内所有的主机访问的资源各不相同,协议也不一样所以这里省略指定,默认为所有端口所有协议,这样就配置好了。有没有感觉很简单?
总结:只要知道语法配置起来事半功倍。只是改个选项而已命令都差不多,iptables也很简单。
iptables