一、概述
iptables是一个防火墙的配置命令,用来设置规则,进而过滤网络数据包。
iptables操作的是一个叫做netfilter的安全框架,这个框架的主要功能是:
- 网络地址转换
- 数据包内容修改
- 网络数据包的过滤
本篇文章主要讨论如何通过iptables来配置netfilter安全框架来达到保护系统安全的目的。
二、iptables原理
2.1 表和链的概念
因为是数据包是按照规则办事的,所以我们先谈谈支持规则所需要的数据结构。在内核中维护了表(table),每张表都包含了一连串的链(chain),链中包含了一连串的规则(rules)。数据包通过规则的检测,看是否符合规则,如果符合,就按照规则指定的行为进行下一步的操作,这些操作可以包含跳转到用户定义的规则处,或者一些特殊的值: ACCEPT, DROP 或者 RETURN。如果不符合规则,则顺序的按照链条往下寻找规则,继续匹配。
其实我们的命令iptables主要的任务就是对这些规则进行增删改查。
2.2 表
内核共维护了四张独立的表,使用选项: -t, --table table 可以指定查找表。表分别是:
- raw:高级功能,如:网址过滤。
- mangle:数据包修改(QOS),用于实现服务质量。
- net:地址转换,用于网关路由器。
- filter:包过滤,用于防火墙规则。
2.3 链
一般来说,包含五条链:
- INPUT链:处理输入数据包。
- OUTPUT链:处理输出数据包。
- PORWARD链:处理转发数据包。
- PREROUTING链:用于目标地址转换(DNAT)。
- POSTOUTING链:用于源地址转换(SNAT)。
每条链都有多个真正用于过滤数据包的规则。数据包就是通过这种链上的规则的方式,最终被转发到用户空间或者其他的主机。
也许会感到很奇怪,为什么要有这么多张表呢。其实是因为每张表有自己的功能,例如nat表主要负责地址的转换,而filter表主要用于包的过滤,两者结合起来才能实现功能。如下图所示:
每张表有不同的链。raw只有PREROUTING和OUTPUT链,filter表则有INPUT、FORWORD和OUTPUT链。经过这些表上的链的规则的过滤,最终达到防火墙的功能。
三 iptables的基本命令
上面说过,其实iptable就是增删改查规则。其主要的命令如下:
-A 在指定链的末尾添加(append)一条新的规则 -D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除 -I 在指定链中插入(insert)一条新的规则,默认在第一行添加 -R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换 -L 列出(list)指定链中所有的规则进行查看 -E 重命名用户定义的链,不改变链本身 -F 清空(flush) -N 新建(new-chain)一条用户自己定义的规则链 -X 删除指定表中用户自定义的规则链(delete-chain) -P 设置指定链的默认策略(policy) -Z 将所有表的所有链的字节和数据包计数器清零 -n 使用数字形式(numeric)显示输出结果 -v 查看规则表详细信息(verbose)的信息 -V 查看版本(version) -h 获取帮助(help)
四 应用场景
4.1 ping的开放
ping可以用来测试网络的连通性,可以通过iptables的来开发对外的ping。通过如下命令:
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
4.2 防范DOS攻击
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
其中limit 25/minute指示了一分钟最多有25个连接
limit-brust 100 指示了只有连接达到了100,才会强制执行limit 25/minute规则。
4.3 端口转发
将端口转发到其他的端口去。例如将422端口转发到22端口,这意味着ssh连接请求可以连接到22号端口和422端口。
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
需要开放422端口
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
4.4 允许ssh连接
首先安装ssh服务,使用命令ps -aux | grep ssh 查看。
若没有安装,则使用apt-get install openssh-server
下列的规则开放22号端口,使用网卡eth0。
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables命令的应用非常的广泛,这里仅仅列出几个常用的应用。
本次操作的环境为:iptables v1.6.1、unbuntu 18.04