概述
Netfilter/iptables(以下简称iptbales)是unix/linux自带的一款优秀切开放源代码的完全自由的基于包过滤的防护墙工具,他的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。
Iptables是linux2.4以2.6内核中集成的服务。其功能与安全性比其老一辈ipfwadm,ipchains强大的多(长江后浪推前浪),iptable主要是工作在OSI模型的二三四层,如果重新编译内核,iptables也可以支持7层控制(squid代理+iptables)。
专业名词
Netfilter/iptables
可以把Netfilter/iptables看作一栋楼,里面存放着很多的表。
表(tables)
表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables)上,可以把表(iptables)当作一套房子。
表有filter nat mangle raw四个表。
表名 | 作用 |
---|---|
filter表 | I负责过滤功能,内核模块:iptables_filter |
nat表 | 负责网络地址转换功能,内核模块:iptable_nat |
mangle表 | 解析报文,做出修改,重新封装的功能,内核模块:iptable_mangle |
raw表 | 关闭nat表上启用的链接追踪机制,内核模块:iptable_raw |
链(chains)
链(chains)是规则(Policys)的容器。如果把表(tables)当作一套房子,那么链就是里面的房间,卧室,厨房,客厅什么的。
链有INPUT OUTPUT FORWARD PREROUTING POSTROUTING 不同的表有不同的链
规则(Policy)
规(Policy)则就是一条条过滤的语句用来控制流量动作的。
关于表和链
关系
表 | 链 |
---|---|
filter表 | INPUT,FORWARD,OUTPUT |
nat表 | PREROUTING,OUTPUT,POSTROUTING,INPUT(centos6没有) |
mangle表 | PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING |
raw表 | PREROUTING,OUTPUT |
Filter
主要是和自身有关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)。Filter表是iptables默认使用的表,这个表定义了三个链(chains),工作场景主要是作为主机的防火墙。
INPUT链 负责过滤所有目标地址是本机地址的数据。通俗的讲,就是过滤进入主机的数据包。
FORWARD链 负责转发流经主机的数据包。起转发的作用,和nat关系很大,后面会详细介绍。 LVSNAT模式。net.ipv4.ip_forward = 0
OUTPUT链 处理所有源地址是本机地址的数据包。通俗的讲,就是处理从主机发去的数据包。
NAT
负责网络地址转换,即来源与目的ip地址和port的转换。主要应用于局域网共享上网或者特殊的端口转换服务相关。(和主机本身无关)
NAT功能一般用于的场景
- 用于做企业路由或网关,共享上网。
- 做内部IP地址一对一映射,硬件防火墙映射IP到内部服务器,FTP服务。
- Web,单个端口映射,直接映射80端口
OUTPUT链 和主机发出去的数据包有关。改变主机发出数据包的目标地址。
PREROUTING链 在数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址,目的端口等。(通俗的说就是收信时,根据规则重写收件人的地址)
POSTROUTING链 在数据包离开防火墙时进行路由判断之后的规则,作用改变数据包的源地址,源端口等。(通俗的说就是寄信的时候可以改变发件人的地址)
Mangle
主要负责修改数据包中特殊的路由标记,如TTL,TOS,MARK等。这个表定义了5个链
INPUT FORWARD OUTPUT PREROUTING POSTROUTING
这个表基本用不到知道即可
RAW
主要是用来控制数据包是否需要通过iptables来处理的一个表 比如web服务器流量很大80端口默认开着需要filter表的INPUT是否来通过 使用RAW表之后则这条就不需要经过iptables防火墙了直接忽略通 防止流量过高 iptables处理不过来提高服务器性能
链只有两个
PREROUTING和OUTPUT
在表中数据包最早经过就是RAW所以可以让iptables不处理对应的数据包
工作流程
过滤流程
iptables是采取包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析、并根据我们预先设定的规则进行匹配来判断之后进行的动作。下图为过滤的流程图
表链工作流程
下图为较为具体的工作流程图
下图为简易流程图
平常我们其实只需要顾及到nat的prerouting、postrouting和filter的input、forward以他的一般是用不到
命令
注意
- CentOS6自带iptables 往后的版本应该都是改用firewalld防火墙了 使用iptables的话得stop服务或者mask服务 systemctl sotp/mask firwealld才行 之后不管是那个版本iptables应该都是自带的但是还缺一样东西iptables-services这个包安装之后才可以使用service iptables的命令来进行管理服务这个包很重要
- 规则的动作丢弃比拒绝更好一些拒绝会回包丢弃是直接忽略还有一个理由就是说如果别人来判断你的主机是否存货拒绝的话就代表你的服务器存在 忽略的话他就会以为你这个东西不存在因为没有回包。
服务管理
systemctl start iptables //开启服务
systemctl stop iptables //关闭服务
systemctl enable iptables //设置开机自启
systemctl disable iptables //设置开机自动关闭
service iptables save //保存当前设置下次开机之后会生效
Ps:在centos7版本之后默认不会安装iptables-services,如果需要使用服务管理则需要安装一下"yum -y install iptables-services",iptables默认会有一个配置表(/var/sysconfig/iptabels这个文件) 这个表记录这本机的所有的iptables配置 每次开机之后都会找这个文件使其里面的配置生效service iptables save就是把当前临时的配置保存到这个表里使下次重载或者重启时生效 这一步很重要
规则管理
iptables -L //列出表的规则 默认不加任何参数输出的时filter表的规则
iptables -F //清除所有的规则(无法清除默认的规则)
iptables -X //删除用户自定义的链(用的很少)
iptables -N //创建链(用的少)
iptables -Z //把链的计数器清零
规则配置
iptables -t //指定表
iptables -t [表] -A //指定链以及添加规则的方式(在规则低端添加规则)
iptables -t [表] -I //指定链以及添加规则的方式(在规则顶端添加规则)
iptables -t [表] -D //指定链以及删除对应规则
iptables -t [表] -A/I [链] -p //指定ip协议tcp/udp
iptables -t [表] -A/I [链] –p [tcp/udp] --dport //指定目标端口
iptables -t [表] -A/I [链] -i //指定流入网卡
iptables -t [表] -A/I [链] -o //指定流出网卡
iptables -t [表] -A/I [链] -s //指定源地址
iptables -t [表] -A/I [链] [相应参数] -j //指定动作(一共三种通过(ACCEPT) 拒绝(REJECT) 丢弃(DROP))
例
- 丢弃22端口(ssh)的链接
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP - 丢弃某个IP的所有包
iptables -t filter -A INPUT -s [IPADDR] -j DROP - 除了某个IP的数据其他全部丢弃
iptables -t filter -A INPUT ! -s [IPADDR] -j DROP - 禁用整个网卡
iptables -t filter -A INPUT -i [网卡名称] -j DROP - 范围性丢弃端口链接
iptables -t filter -A INPUT -p tcp –dport [最小:最大] -j DROP - 丢弃多个端口的链接
iptables -t filter -A INPUT -p tcp -m multiport –dport [23,24,25...] -j DROP
NAT表
注意
因为NAT是负责网络转换这块,最好是把内核的转发更能打开,不然路由链就不生效
cat /etc/sysctl.conf |grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1
sysctl -p //生效
SNAT
Ip转换 一般用于局域网做网管内网ip转换为可上网的ip 提供内网主机上网使用
命令:
Iptables -t nat -A POSTROUTING -s 源地址 -d 0.0.0.0/0 -j SNAT –to-source 转换的ip
DNAT
端口转发 一般用于端口转发做反向代理 可以防止内网主机完全暴露在公网环境中.
自己的端口转发
IP tables -t nat -A PREROUTING -p tcp –dport 本机端口 -J REDIRECT –to-port 转到端口
主机的端口转发
Iptables -t nat -A PREROUTING -p tcp –dport 本机端口 -J DNAT –to-destination 主机:端口
MASQUERADE
Ip伪装 一般用于局域网做网管内网ip转换为可上网的ip 提供内网主机上网使用
命令:
Iptables -t nat -A POSTROUTING -s 源地址 -d 0.0.0.0/0 -j MASQUERADE