- 02
- 10月
本文介绍 iptables 的基本概念以及基本的操作。
本文目录
1 基本概念:表格 (table) 与链 (chain)
注解
这部分内容援引 [鸟哥的Linux私房菜] 。
预设的情况下,咱们 Linux 的 iptables 至少就有三个表格,包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少 使用) 。更有甚者,我们还可以自定义额外的链呢! 真是很神奇吧!每个表格与其中链的 用途分别是这样的:
- filter (过滤器): 主要跟进入 Linux 本机的封包有关,这个是预设的 table 喔!
- INPUT: 主要与想要进入我们 Linux 本机的封包有关;
- OUTPUT: 主要与我们 Linux 本机所要送出的封包有关;
- FORWARD: 这个咚咚与 Linux 本机比较没有关系, 他可以『转递封包』到后端的 计算机中,与下列 nat table 相关性较高。
- nat (地址转换): 是 Network Address Translation 的缩写, 这个表格主要在进
行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的局
域网络内计算机较有相关。
- PREROUTING: 在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
- POSTROUTING: 在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
- OUTPUT: 与发送出去的封包有关
所以说,如果你的 Linux 是作为 www 服务,那么要开放客户端对你的 www 要求有响应, 就得要处理 filter 的 INPUT 链; 而如果你的 Linux 是作为局域网络的路由器,那么就 得要分析 nat 的各个链以及 filter 的 FORWARD 链才行。也就是说, 其实各个表格的链 结之间是有关系的!简单的关系可以由下图这么看:

图1: iptables 内建各表格与链的相关性
上面的图示很复杂喔!不过基本上你依旧可以看出来,我们的 iptables 可以控制三种封包 的流向:
- 封包进入 Linux 主机使用资源 (路径 A): 在路由判断后确定是向 Linux 主机要求数据 的封包,主要就会透过 filter 的 INPUT 链来进行控管;
- 封包经由 Linux 主机的转递,没有使用主机资源,而是向后端主机流动 (路径 B): 在 路由判断之前进行封包表头的修订作业后,发现到封包主要是要透过防火墙而去后端,此 时封包就会透过路径 B 来跑动。 也就是说,该封包的目标并非我们的 Linux 本机。主 要经过的链是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。
- 封包由 Linux 本机发送出去 (路径 C): 例如响应客户端的要求,或者是 Linux 本机主 动送出的封包,都是透过路径 C 来跑的。先是透过路由判断, 决定了输出的路径后,再 透过 filter 的 OUTPUT 链来传送的!当然,最终还是会经过 nat 的 POSTROUTING 链。
由于 mangle 这个表格很少被使用,如果将 图1 的 mangle 拿掉的话,那就容易看的多了:

图2: iptables 内建各表格与链的相关性(简图)
透过 图2 你就可以更轻松的了解到,事实上与本机最有关的其实是 filter 这个表格 内的 INPUT 与 OUTPUT 这两条链,如果你的 iptables 只是用来保护 Linux 主机本身的话 ,那 nat 的规则根本就不需要理他,直接设定为开放即可。
2 iptables 基础操作
2.1 安装 iptables
yum install iptables -y
2.2 规则查看与删除
查看已添加的规则:
iptables -L -n
选项与参数:
- -t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
- -L :列出目前的 table 的规则
- -n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!
- -v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等
- --line-numbers :显示行号,删除某条规则时很有用
删除已添加的规则:
将所有 iptables 以序号标记显示,执行:
iptables -L -n --line-numbers
比如要删除 INPUT 里序号为 8 的规则,执行:
iptables -D INPUT 8
2.3 规则清除
如果你在安装的时候选择没有防火墙的话,那么 iptables 在一开始的时候应该是没有规则 的,不过, 可能因为你在安装的时候就有选择系统自动帮你建立防火墙机制,那系统就会 有默认的防火墙规则了!
若这些规则不是我们想要的,那该如何修改规则呢?鸟哥建议,先删除规则再慢慢建立各个 需要的规则! 那如何清除规则?这样做就对了:
iptables -F
iptables -X
iptables -Z
选项与参数:
- -F :清除所有的已订定的规则;
- -X :杀掉所有使用者 "自定义" 的 chain (应该说的是 tables )啰;
- -Z :将所有的 chain 的计数与流量统计都归零
由于这三个指令会将本机防火墙的所有规则都清除,但却不会改变预设政策 (policy) , 所以如果你不是在本机下达这三行指令时,很可能你会被自己挡在家门外 (若 INPUT 设定 为 DROP 时)!要小心啊!
一般来说,我们在重新定义防火墙的时候,都会先将规则给他清除掉。还记得我们前面谈到 的, 防火墙的『规则顺序』是有特殊意义的 ,所以啰, 当然先清除掉规则,然后一 条一条来设定会比较容易一点啦。底下就来谈谈定义预设政策吧!
2.4 定义预设政策 (policy)
清除规则之后,再接下来就是要设定规则的政策啦!还记得政策指的是什么吗?『 当你的 封包不在你设定的规则之内时,则该封包的通过与否,是以 Policy 的设定为准』,在本机 方面的预设政策中,假设你对于内部的使用者有信心的话, 那么 filter 内的 INPUT 链方 面可以定义的比较严格一点,而 FORWARD 与 OUTPUT 则可以订定的松一些!通常鸟哥都是 将 INPUT 的 policy 定义为 DROP 啦,其他两个则定义为 ACCEPT。 至于 nat table 则暂 时先不理会他。
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
选项与参数:
- -P :定义政策( Policy )。注意,这个 P 为大写啊!
- ACCEPT :该封包可接受
- DROP :该封包直接丢弃,不会让 client 端知道为何被丢弃。
2.5 开放指定的端口
#允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT
# 允许访问22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允许访问80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许FTP服务的21和20端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他端口的话,规则也类似,稍微修改上述语句就行
#禁止其他未允许的规则访问
#注意:如果 22 端口未加入允许规则, SSH 链接会直接断开
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT
2.6 屏蔽 IP
#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP
3 规则脚本
规则脚本用于快速设置防火墙规则。主要步骤:
- 清除规则
- 设定默认政策及开放 lo 与相关的设定值
- 添加常见服务的规则
脚本参考: https://code.jd.com/pub/pick/wtx358/fbfdab7e3983009e7d488d946a8de066
[鸟哥的Linux私房菜] | 原文地址: http://vbird.dic.ksu.edu.tw/linux_server/0250simple_firewall_3.php |