iptables
iptables介绍
linux的包过滤功能,即linux防火墙,它由netfilter 和 iptables 两个组件组成。
netfilter 组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易。
iptables基础
我们知道iptables是按照规则来办事的,规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听的套接字(IP:Port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标终点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点,我们说过,netfilter才是真正的防火墙,它是内核的一部分,所以,如果我们想要防火墙能够达到"防火"的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了input关卡和output关卡,而这些关卡在iptables中不被称为"关卡",而被称为"链"。
其实我们上面描述的场景并不完善,因为客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文转发给其他服务器,所以,这个时候,我们就会提到iptables中的其他"关卡",也就是其他"链",他们就是 “路由前”、“转发”、“路由后”,他们的英文名是
PREROUTING、FORWARD、POSTROUTING
也就是说,当我们启用了防火墙功能时,报文需要经过如下关卡,也就是说,根据实际情况的不同,报文经过"链"可能不同。如果报文需要转发,那么报文则不会经过input链发往用户空间,而是直接在内核空间中经过forward链和postrouting链转发出去的。
所以,根据上图,我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING --> INPUT
由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING
表的概念
我们把具有相同功能的规则的集合叫做"表",所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表
filter表:负责过滤功能,防火墙;内核模块:iptables_filter
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表:关闭nat表上启用的连接追踪机制;iptable_raw
最常用的有三张表:filter,nat,mangle
数据经过防火墙的流程
链的作用
prerouting
数据包进入路由表之前的操作在此进行
input
通过路由表后发现目的地址为本机,则匹配该链中规则
forward
通过路由表后发现目的地址非本机,则匹配该链中规则
output
由本机产生的,向外转发的匹配该链中的规则
postrouting
发送到网卡接口之前,进行该链中规则的匹配
命令格式
iptables [ -t 表名] 命令选项 [链名] [条件匹配] [-j 处理动作或跳转]
-t 接表名,如果不加-t 默认就是 –t filter
命令选项
-L 列出一个或所有链的规则
-v 显示详细信息,包括每条规则的匹配句数量和匹配字节数
-x 在v的基础上,禁止自动换算单位(K,M)
-I 插入到防火墙第一条生效
-A 添加链是添加到最后一条
-D 删除指定链中的某一条规则,按规则序号或内容确定要删除的规则
-F 清空指定链中的所有规则,默认清空表中所有链的内容
-X 删除指定表中用户自定义的规则链
条件匹配
-i 入站请求接口
-o 出站请求接口
-s 入站源地址
-d 目标地址
-p 指定规则协议,如tcp, udp,icmp等,可以使用all来指定所有协议
–dport 目的端口,数据包的目的(dport)地址是80,就是要访问我本地的80端口
–sport 来源端口 数据包的来源端口是(sport)80,就是对方的数据包是80端口发送过来的。
处理动作
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
masquerade:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配
一般不使用REJECT(拒绝)行为.REJECT会带来安全隐患
操作样例:
1 查看iptables规则
iptables -L -n
2 清除默认规则
iptables –F 清除所有规则
iptables –X 删除用户自定义的链
iptables –Z 链的计数器清零
默认情况下,我们的清除规则实际是对filter表的操作,如果是nat表,需要指定表
iptables –t nat –F
3 保存修改
[root@es salt]# /etc/init.d/iptables save
4 禁止ssh 默认22端口
iptables -A INPUT -p tcp --dport 22 -j DROP
5 禁止多端口
iptables -A INPUT -p tcp --dport 80:3306 -j DROP
[root@es ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpts:80:3306
列表形式禁止多端口
iptables -A INPUT -p tcp -m multiport --dport 50,51,60,8888 -j DROP
注:-m multiport 列表禁止多端口的参数
[root@es ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpts:80:3306
DROP tcp – 0.0.0.0/0 0.0.0.0/0 multiport dports 50,51,60,8888
6 删除规则
方法1
iptables -D INPUT -p tcp --dport 22 -j DROP
方法2
[root@es ~]# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpts:80:3306
2 DROP tcp – 0.0.0.0/0 0.0.0.0/0 multiport dports 50,51,60,8888
iptables -D INPUT 1
[root@es ~]# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp – 0.0.0.0/0 0.0.0.0/0 multiport dports 50,51,60,8888
7 禁止10.0.0.0/24网段连入
iptables -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP
注:-i 入站请求接口
-o 出站请求接口
-s 入站源地址
-d 目标地址
[root@es ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all – 10.0.0.0/24 0.0.0.0/0
8 除了192.168.56.1其他IP都不能通过eth0连接
iptables -I INPUT -i eth0 -s ! 192.168.56.1 -j DROP
注:!和IP之间有空格 有提示 不用理会
[root@es ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all – !192.168.56.1 0.0.0.0/0
9 禁 192.168.56.7 ping 本机
iptables -I INPUT -p icmp --icmp-type 8 -s 192.168.56.7 -j DROP
10 对外的WEB服务器,要允许http服务通过,并且不限制IP
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
11 允许FTP服务
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
注:FTP服务有些特殊 说以要允许ftp服务通过防火墙需要上面两步
ESTABLISHED 已经建立连接的数据包允许通过
RELATED 发出去的数据包允许通过
12 端口转发
iptables -t nat -A PREROUTING -d 192.168.52.5 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.1.17:80
注: 访问目标地址是192.168.52.5 端口80的访问都转给172.16.1.17:80