1. IPtables入门简介
-
Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。Iptables主要工作在OSI七层的二、三、四层。
-
Iptables 是Linux 内核集成的 IP 信息包过滤系统。如果Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
-
Iptables防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 信息包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。
-
虽然Netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。
-
Netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
-
Iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
//查询系统是否有filter模块
[root@localhost ~]# lsmod | grep filter
iptable_filter 12810 1
br_netfilter 22256 0
bridge 151336 1 br_netfilter
ip_tables 27126 2 iptable_filter,iptable_nat
2. IPtables表与链功能
- Iptables的规则链分为三种:输入、转发和输出。
- 输入——这条链用来过滤目的地址是本机的连接。例如,如果一个用户试图使用SSH登陆到你的PC/服务器,iptables会首先匹配其IP地址和端口到iptables的输入链规则。
- 转发——这条链用来过滤目的地址和源地址都不是本机的连接。例如,路由器收到的绝大数数据均需要转发给其它主机。如果你的系统没有开启类似于路由器的功能,如NATing,你就不需要使用这条链。
- 输出——这条链用来过滤源地址是本机的连接。例如,当你尝试ping jfedu.net时,iptables会检查输出链中与ping和jfedu.net相关的规则,然后决定允许还是拒绝你的连接请求。
- 注意:当ping一台外部主机时,看上去好像只是输出链在起作用。但是请记住,外部主机返回的数据要经过输入链的过滤。当配置iptables规则时,请牢记许多协议都需要双向通信,所以你需要同时配置输入链和输出链。人们在配置SSH的时候通常会忘记在输入链和输出链都配置它。
3. IPTABLES数据包流程
数据包先经过PREOUTING,由该链确定数据包走向:
- 目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①—>②;
- 若满足PREROUTING的nat表上的转发规则,则发送给FORWARD,然后再经过POSTROUTING发送出去,流程为: ①—>③—>④—>⑥;
- 主机发送数据包时,流程则是⑤—>⑥;
- 其中PREROUTING和POSTROUTING指的是数据包的流向,如上图所示POSTROUTING指的是发往公网的数据包,而PREROUTING指的是来自公网的数据包。
4. IPTABLES四张表&五条链
- iptables具有Filter, NAT, Mangle, Raw四种内建表。
5. Linux下IPtables下Filter表
Filter表是iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
- INPUT链 – 处理来自外部的数据;
- OUTPUT链 – 处理向外发送的数据;
- FORWARD链 – 将数据转发到本机的其他网卡设备上。
6. Linux下IPtables下NAT表
- NAT (网络地址转换) 技术在平时是很多见的,如家庭中在使用路由器共享上网时,一般用的就是 NAT 技术,它可以实现众多内网 IP 共享一个公网 IP 上网。
- NAT 的原理,简单的说就是当内网主机访问外网时,当内网主机的数据包要通过路由器时,路由器将数据包中的源内网 IP 地址改为路由器上的公网 IP 地址,同时记录下该数据包的消息;
- 外网服务器响应这次由内而外发出的请求或数据交换时,当外网服务器发出的数据包经过路由器时,原本是路由器上的公网 IP 地址被路由器改为内网 IP 。
- SNAT 和 DNAT 是 iptables 中使用 NAT 规则相关的的两个重要概念。如上图所示,如果内网主机访问外网而经过路由时,源 IP 会发生改变,这种变更行为就是 SNAT;反之,当外网的数据经过路由发往内网主机时,数据包中的目的 IP (路由器上的公网 IP) 将修改为内网 IP,这种变更行为就是 DNAT 。NAT表有三种内建链:
- PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
- POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
- OUTPUT链 – 处理本机产生的数据包。
7. Linux下IPtables命令图解
8. Linux下IPtables命令剖析
8.1. 命令
参数 | 解释 |
---|---|
-A | 顺序添加,添加一条新规则 |
-I | 插入,插入一条新规则 -I 后面加一数字表示插入到哪行 |
-R | 修改, 删除一条新规则 -D 后面加一数字表示删除哪行 |
-D | 删除,删除一条新规则 -D 后面加一数字表示删除哪行 |
-N | 新建一个链 |
-X | 删除一个自定义链,删除之前要保证次链是空的,而且没有被引用 |
-L | 查看 |
-E | 重命名链 |
-F | 清空链中的所有规则 |
-Z | 清除链中使用的规则 |
-P | 设置默认规则 |
8.2. 匹配条件
- 隐含匹配:
参数 | 内容 |
---|---|
-p | tcp udp icmp |
–sport | 指定源端口 |
–dport | 指定目标端口 |
-s | 源地址 |
-d | 目标地址 |
-i | 数据包进入的网卡 |
-o | 数据包出口的网卡 |
- 扩展匹配:
参数 | 解释 |
---|---|
-m state --state | 匹配状态的 |
-m mutiport --source-port | 端口匹配 ,指定一组端口 |
-m limit --limit 3/minute | 每三分种一次 |
-m limit --limit-burst 5 | 只匹配5个数据包 |
-m string --string --algo bm | kmp --string"xxxx" |
-mtime–timestart 8:00 --timestop 12:00 | 表示从哪个时间到哪个时间段 |
-mtime–days | 表示那天 |
-m mac --mac-source xx:xx:xx:xx:xx:xx | 匹配源MAC地址 |
-m layer7 --l7proto qq | 表示匹配腾讯qq的 当然也支持很多协议,这个默认是没有的,需要我们给内核打补丁并重新编译内核及iptables才可以使用 -m layer7 这个显示扩展匹配 |
8.3. 动作
-j
动作 | 解释 |
---|---|
DROP | 直接丢掉 |
ACCEPT | 允许通过 |
REJECT | 丢掉,但是回复信息 |
LOG --log-prefix | “说明信息,自己随便定义” ,记录日志 |
SNAT | 源地址转换 |
DNAT | 目标地址转换 |
REDIRECT | 重定向 |
MASQUERAED | 地址伪装 |
9. Linux下IPtables企业案例解析
[root@localhost ~]# cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
指令 | 解释 |
---|---|
:INPUT ACCEPT [0:0] | 该规则表示INPUT表默认策略是ACCEP ([ 0:0 ]里记录的就是通过该规则的数据包和字节总数。) |
:FORWARD ACCEPT [0:0] | 该规则表示FORWARD表默认策略是ACCEPT |
:OUTPUT ACCEPT [0:0] | 该规则表示OUTPUT表默认策略是ACCEPT |
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT | 意思是允许进入的数据包只能是刚刚我发出去的数据包的回应,ESTABLISHED:已建立的链接状态。RELATED:该数据包与本机发出的数据包有关。 |
-A INPUT -i lo -j ACCEPT | 意思就允许本地环回接口在INPUT表的所有数据通信,-i 参数是指定接口,接口是lo,lo就是Loopback(本地环回接口) |
-A INPUT -j REJECT –reject-with icmp-host-prohibited | 在INPUT表中拒绝所有其他不符合上述的规则的数据包并且发送一条host prohibited的消息给被拒绝的主机。 |
-A FORWARD -j REJECT --reject-with icmp-host-prohibited | 在FORWARD表中拒绝所有其他不符合上述的规则的数据包并且发送一条host prohibited的消息给被拒绝的主机。 |
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A 添加一条规则
-j 后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)
--dport 限制目标的端口号码。
-p 协议:设定此规则适用于哪种封包格式 主要的封包格式有: tcp, udp, icmp 及 all 。
-m state –state 模糊匹配一个状态,
NEW 用户发起一个全新的请求
ESTABLISHED 对一个全新的请求进行回应
RELATED 两个完整连接之间的相互关系,一个完整的连接,需要依赖于另一个完整的连接。
INVALID 无法识别的状态
- iptables是从/etc/sysconfig/iptables中读取规则的,其中默认规则优先级最低,然后就是从上往下开始匹配规则。使用命令创建规则是临时有效的,重启服务规则就失效了,需要执行service iptables save这条命令把规则保存在/etc/sysconfig/iptables文件里。
10.IPtables命令实战
- WEB服务器,开启80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- 允许icmp包通过,也就是允许ping
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
- 删除WEB服务器,开启80端口这条规则
//查看规则
[root@localhost ~]# iptables -t filter -L -n --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
7 DROP icmp -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DROP icmp -- 0.0.0.0/0 0.0.0.0/0
//删除开启80规则
[root@localhost ~]# iptables -t filter -D INPUT 6
数字6是第六条规则
- 将本机的8080端口转发至其他主机,主机IP:192.168.0.141,目标主机IP和端口:192.168.0.142:80,规则如下
iptables -t nat -A PREROUTING -d 192.168.0.141/32 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.0.142:80
iptables -t nat -A POSTROUTING -d 192.168.0.142/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.141
//开启iptables forward转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
- 上面的操作执行完成后需要把命令保存至/etc/sysconfig/iptables文件,执行service iptables save。