Home » Linux » Linux iptables 防火墙基础教程
  • 02
  • 10月

Linux iptables 防火墙基础教程

本文介绍 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 链才行。也就是说, 其实各个表格的链 结之间是有关系的!简单的关系可以由下图这么看:

iptables 内建各表格与链的相关性

图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 拿掉的话,那就容易看的多了:

iptables 内建各表格与链的相关性(简图)

图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   规则脚本

规则脚本用于快速设置防火墙规则。主要步骤:

  1. 清除规则
  2. 设定默认政策及开放 lo 与相关的设定值
  3. 添加常见服务的规则

脚本参考: https://code.jd.com/pub/pick/wtx358/fbfdab7e3983009e7d488d946a8de066

[鸟哥的Linux私房菜]原文地址: http://vbird.dic.ksu.edu.tw/linux_server/0250simple_firewall_3.php
Tags:   iptables .