参考文章: 朱双印 iptables
防火墙概念
逻辑分类:
- 主机防火墙:对单个主机进行防护
- 网络防火墙:通常处于网络的入口/出口,服务于其背后的局域网
物理分类:
- 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高
- 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低
iptables 概念
iptables 是一个客户端程序,与内核空间的 netfilter 交互。
netfilter 是集成到 linux 内核协议栈中的一套防火墙系统,用户可通过运行在用户空间的 iptables 来把相关配置下发给 netfilter。
netfilter 分为多个模块,各个模块的用户空间配置工具为:
- 链路层:ebtables
- 网络层ipv4:iptables
- 网络层 ipv6:ip6tables
- 专门用于 ARP 协议:arptables
wikipedia 关于 netfilter 中数据包的流图:
网络层部分的流图:
iptables 中的链
从流图的视角,可以看到一共有 5 条链,每条链上会有按顺序串联的表。当数据包到达某条链时,会顺序执行每张表中的规则。
这 5 条链实际上就是 netfilter 提供的在数据包流转路径上的 HOOK。
iptables 中的表
表用于聚合某种类型的规则,从 iptables 客户端的视角,一共有 4 张表,每张表里会有该表可以附加上去的链。
- filter:负责过滤功能,防火墙;内核模块:iptables_filter
- nat:network address translation,网络地址转换功能;内核模块:iptable_nat
- mangle:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
- raw:关闭nat表上启用的连接追踪机制;iptable_raw
所以我们是通过 iptables 对某张表上的某条链的规则进行增删改。
iptables 中的规则
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理。
匹配条件:
- 基本匹配条件:
- 源地址 Source IP
- 目标地址 Destination IP
- 扩展匹配条件:由扩展模块提供,比如 tcp 模块支持端口匹配
处理动作:
- ACCEPT:允许数据包通过
- DROP:直接丢弃数据包,不给任何回应信息
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息
- SNAT:源地址转换,需要指定转换的 ip,解决内网用户用同一个公网地址上网的问题
- MASQUERADE:是 SNAT 的一种特殊形式,适用于动态的、临时会变的 ip 上,指定使用某张网卡上的 ip 用于转换
- DNAT:目标地址转换
- REDIRECT:在本机做端口映射
- LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配
在一张表的某条链上的多条规则会被顺序执行,当有一条规则匹配成功了,且处理工作不是 LOG,之后的规则不会再执行。
在一张表的每条链上可以设置默认的处理动作,即但没有匹配到规则时,执行链的默认处理动作。
iptables 操作
查询:
- iptables -t filter –line-numbers -nvxL
- -t 指定查询的表,默认 filter
- –line-numbers 显示规则编号
- -n 显示 IP 地址,而不是名称解析
- -v 显示详细信息
- pkts: 对应规则匹配到的报文的个数
- bytes: 对应匹配到的报文包的大小总和
- target: 规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施
- prot: 表示规则对应的协议,是否只针对某些协议应用此规则
- opt: 表示规则对应的选项
- in: 表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则
- out: 表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则
- source: 表示规则对应的源头地址,可以是一个IP,也可以是一个网段
- destination: 表示规则对应的目标地址。可以是一个IP,也可以是一个网段
- -x 显示精确的值,而不是经过可读性优化过的计数值
增加:
- iptables -A INPUT -s 192.168.1.3 -j ACCEPT
- iptables -I INPUT -s 192.168.1.3 -j ACCEPT
- iptables -I INPUT 2 -s 192.168.1.3 -j ACCEPT
- 在 filter 表的 INPUT 链位置 2 插入规则
删除:
- iptables -D INPUT 3
- 删除 filter 表的 INPUT 链的规则 3
- iptables -D INPUT -s 192.168.1.3 -j ACCEPT
- 删除 filter 表的 INPUT 链中源地址为 192.168.1.146,动作为 ACCEPT 的规则
- iptables -t 表 -F 链
- iptables -t 表 -F
修改:
- iptables -R INPUT 1 -s 192.168.1.3 -j ACCEPT
- 修改 filter 表的 INPUT 链规则 1
- -s 如果省略的话,默认会修改为 0.0.0.0/0
- iptables -P FORWARD DROP
- 修改 filter 表的 FORWARD 链默认处理动作
保存:
规则匹配
- 匹配 IP 地址:
- -s 192.168.1.3,192.168.1.4
- -s 192.168.1.0/24
- ! -s 192.168.1.3
- 匹配协议
- -p tcp
- 可选的值:tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh, all
- 匹配网卡接口
- 扩展匹配条件,需要相应的协议模块支持
- 端口号:
- -p tcp -m tcp –sports 80 –dports 8080:65535
- -p tcp -m multiport –sports 80,81,82:88 –dports 8080:65535
- multiport 扩展只能用于 tcp 协议与 udp 协议
- iprange:连续 IP 地址范围
- iptables -I INPUT -m iprange –src-range 192.168.1.3-192.168.1.8 -j DROP
- string:字符串匹配
- iptables -I INPUT -m string –algo bm –string “OOXX” -j REJECT
- time:时间相关
- iptables -I INPUT -m time –timestart 09:00:00 –timestop 18:00:00 -j REJECT
- connlimit:连接数
- iptalbes -I INPUT -p tcp –dport 22 -m connlimit –connlimit-above 2 -j REJECT
- limit:速率限制
- iptables -I INPUT -p icmp -m limit –limit 10/minute -j ACCEPT
- iptables -A INPUT -p icmp -j REJECT
- –tcp-flags:根据 TCP 协议头中的 Flags 匹配
- iptables -t filter -I INPUT -p tcp -m tcp –dport 22 –tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
- 拒绝第一次握手请求
- –tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN 可缩写为 –syn
- icmp:
- iptables -t filter -I INPUT -p icmp -m icmp –icmp-type 8/0 -j REJECT
- state:只要两台机器在”你来我往”的通信,就算建立起了连接
- “连接”其中的报文可以分为5种状态:
- NEW:连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW
- ESTABLISHED:我们可以把 NEW 状态包后面的包的状态理解为 ESTABLISHED,表示连接已建立
- RELATED:ftp 中数据连接中的报文与命令连接中的报文关系
- INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是 INVALID,我们可以主动屏蔽状态为 INVALID 的报文
- UNTRACKED:表示报文未被追踪,无法找到相关的连接
- set:ipset 管理的集合
- iptables -I INPUT -m set –match-set setname src -p tcp –destination-port 80 -j DROP
iptables 自定义链
自定义链用于复用规则,以及方便管理大量规则。
- 创建:iptables -t filter -N IN_WEB
- 引用:iptables -t filter -I INPUT -p tcp –dport 80 -j IN_WEB
- 重命名:iptables -E IN_WEB WEB
- 删除:iptables -X WEB
iptables 处理动作
- REJECT:使用–reject-with选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么被拒绝。
- icmp-net-unreachable
- icmp-host-unreachable
- icmp-port-unreachable:默认
- icmp-proto-unreachable
- icmp-net-prohibited
- icmp-host-prohibited
- icmp-admin-prohibited
- LOG:
- –log-level:选项可以指定记录日志的日志级别,可用级别有emerg,alert,crit,error,warning,notice,info,debug
- –log-prefix:选项可以给记录到的相关信息添加”标签”之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤
- –log-prefix 对应的值不能超过29个字符
- NAT:echo 1 > /proc/sys/net/ipv4/ip_forward
- SNAT:
- iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT –to-source 公网IP
- iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE
- DNAT:iptables -t nat -I PREROUTING -d 公网IP -p tcp –dport 公网端口 -j DNAT –to-destination 私网IP:端口号
- REDIRECT:
- iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080
- MARK:
- iptables -t mangle -A INPUT -m state –state NEW-j MARK –set-mark 1
- CONNMARK:
- iptables -t mangle -A INPUT -j CONNMARK –restore-mark