Linux内核集成的IP信息包过滤系统,linux的包过滤功能,即linux防火墙,它由netfilter和iptables两个组件组成。
防火墙在做数据包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux内核中。在数据包过滤表中,规则被分组放在我们所谓的链(chain)中。
netfilter/iptables IP 数据包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。
netfilter组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
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 [ -t 表名] 命令选项 [链名] [条件匹配] [-j 处理动作或跳转]
-t 接表名,如果不加-t 默认就是 –t filter
命令选项
-L 列出一个或所有链的规则
-v 显示详细信息,包括每条规则的匹配句数量和匹配字节数
-x 在v的基础上,禁止自动换算单位(K,M)
-n 只显示ip地址和端口号,不显示域名和服务名称
-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会带来安全隐患
查询防火墙状态:
service iptables status
停止防火墙:
service iptables stop
启动防火墙:
service iptables start
重启防火墙:
service iptables restart
永久关闭防火墙:
chkconfig iptables off
永久关闭后启用:
chkconfig iptables on
五、iptables实例
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
#使用filter表
*filter
#下面三条内容定义了内建的INPUT、FORWAARD、ACCEPT链
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
#注意默认的22端口别删掉了,这个是ssh的端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#仅限XXX.XXX.XXX.XXX某个ip访问6379端口
-A INPUT -s XXX.XXX.XXX.XXX -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
#仅限XXX.XXX.XXX.XXX某个网段访问6379端口
-A INPUT -s XXX.XXX.XXX.XXX/24 -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
#仅限某个范围网段访问6379端口
-A INPUT -m iprange --src-range XXX.XXX.XXX.XXX-XXX.XXX.XXX.XXX -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
#允许访问8080端口,这样8080端口就可以对外提供服务了
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8082 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8083 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
注意:配置开放80端口时,需要添加到默认的22端口这条规则的下面
vi /etc/sysconfig/iptables
粘贴:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
重启防火墙
/etc/init.d/iptables restart
添加 ( --permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --add-port=80/tcp --permanent
重新载入
firewall-cmd --reload
查看
firewall-cmd --zone=public --query-port=80/tcp
删除
firewall-cmd --zone=public --remove-port=80/tcp --permanent