iptables 的防火墙正常运行时间和安全性(2)
- UID
- 1066743
|
iptables 的防火墙正常运行时间和安全性(2)
入门 几乎所有 Linux 发行版均提供 iptables,可供随时使用。确保在您的首选 shell 中具备可用的 iptables 命令。本文使用 Debian/Ubuntu 约定配置 iptables。
因为我们要在内核级上进行一些修改,所以要确保您拥有 root 权限。
显示当前应用于服务器的规则。清单 2 将会在本文中重复使用以验证当前所使用的规则内容,以及检验是否成功实现更改。
清单 2. 当前应用的规则1
2
3
4
5
6
7
8
9
| root@desktop:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
|
在 中,我们指示 iptables 列出当前应用于防火墙的所有规则。这是通过 -L 标志实现的。
该输出还提到了 Chain。您可以将 iptable 链视为防火墙的一部分,允许某种类型的网络流量。例如,阻止从专用网络到互联网的所有网络流量,将在 OUTPUT 部分中设置该规则。同样地,将在 INPUT 链中显示影响传入流量的任何规则。
此三个链每个都应用于防火墙中的某一种类型的活动。此时,还未进行任何设置。这表示还未设立任何限制,所有的网络流量均可自由传入传出。
- Chain INPUT
- Chain FORWARD,和
- Chain OUTPUT
继续之前,有必要检查锁定后服务器上的哪些端口处于打开状态以进行比较。如前所述,nmap 是一款功能强大的命令行工具,可提供网络安全信息。 显示网络上远程服务器中 nmap 的输出。
清单 3. 使用 nmap 进行网络扫描1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| ~ $ nmap 10.0.0.120
Starting Nmap 5.35DC1 ( http://nmap.org ) at 2010-11-21 20:44 EST
Nmap scan report for 10.0.0.120
Host is up (0.012s latency).
Not shown: 991 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
53/tcp open domain
80/tcp open http
631/tcp open ipp
3306/tcp open mysql
4001/tcp open unknown
5900/tcp open vnc
8080/tcp open http-proxy
Nmap done: 1 IP address (1 host up) scanned in 6.57 seconds
|
那些均是处于打开状态的端口!仅几个步骤,您就能了解配置 iptables 后如何修改以上这些内容。
虚拟并不一定就是好当您掌握了 iptables,它能更好地帮助您在安装 Linux 的计算机而非虚拟机 (VM) 上执行本文的示例。虚拟主机和虚拟客户端之间的网络策略可能会使调试变得更加困难,并导致一些示例无法工作。先从物理环境开始,然后再不断努力创建一些更高级的虚拟环境。
可通过手动方式在纯文本文件中对防火墙规则进行应用与添加或编辑。我比较喜欢使用文本文件应用更改。在文本文件中进行编写,语法错误往往都能轻易地捕捉到。通过直接添加规则编辑规则带来的另一个问题是,当服务器重启时,无法保存这些规则。因此,在编辑文件前,我们要先告知 iptables 导出当前的规则,以便文件可作为我们的初始模板。请参见 。
清单 4. 将规则保存至一个文件1
2
3
4
5
6
7
8
9
| root@desktop:~# iptables-save > /etc/iptables.rules
root@desktop:~# cat /etc/iptables.rules
# Generated by iptables-save v1.4.4 on Sun Nov 21 14:48:48 2010
*filter
:INPUT ACCEPT [732:83443]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [656:51642]
COMMIT
# Completed on Sun Nov 21 14:48:48 2010
|
使用 iptables-save 命令,并将输出重定向至 "/etc" 目录下的一个文本文件中。我已经对此文件进行连接 (concatenated),所以您能看到我机器上的文件。
首要要求之一是允许创建连接以接收通信。在您希望防火墙(在专用网络中)背后的任何事项均可无限制地发送和接收网络数据时,您需要执行此项操作。在 中,我们将向 iptables 发送一个直接的规则,并验证事后防火墙的状态。
清单 5. 创建的会话规则1
2
3
4
5
6
7
8
9
10
11
| root@desktop:~# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
root@desktop:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
|
要更好地了解发送的内容,让我们将命令拆开,并逐一进行解释:
-A INPUT:将此规则添加至 INPUT 链。
-m conntrack:对下列连接通信与当前的包/连接进行匹配。
-ctstate ESTABLISHED, RELATED:规则将应用到的连接状态。在本例中,ESTABLISHED 连接代表能够看到两个方向数据包的连接,而 RELATED 类型代表,数据包开启一个新连接,但是与现有连接相关联。
-j ACCEPT:告知防火墙接收之前描述的连接。-j 标记的另一个有效设置是 DROP
我还通过 SSH 协议连接至该服务器,所以在锁定防火墙时, 中的一条规则会允许所有传入的 SSH 通信。我指定了网络协议类型 (tcp) 以及方便与此 SSH 服务关联的端口。如果需要,您可以直接指定端口号。
清单 6. 接收入站 SSH 连接1
2
3
4
5
6
7
8
9
10
11
12
| root@desktop:~# iptables -A INPUT -p tcp --dport ssh -j ACCEPT
root@desktop:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
|
最后,让我们设置防火墙以阻止其他事项。在执行下列命令时要特别注意。如果将此放在所有其他规则前,那么它会阻止传入服务器的任何流量。Iptables 会以程序方式(自上而下)读取规则,并且在某条规则匹配后,就不会对其他事项进行评估。
清单 7. 阻止所有的传入流量1
2
3
4
5
6
7
8
9
10
11
12
13
| root@desktop:~# iptables -A INPUT -j DROP
root@desktop:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
DROP all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
|
清单 7 显示规则处于正常顺序,但是为了进行具体更改,让我们将这些规则保存到一个文件中,并对该文件进行连接以检查内容,如 所示。
清单 8. 验证防火墙配置1
2
3
4
5
6
7
8
9
10
11
12
| root@desktop:~# iptables-save > /etc/iptables.rules
root@desktop:~# cat /etc/iptables.rules
# Generated by iptables-save v1.4.4 on Sun Nov 21 15:10:42 2010
*filter
:INPUT ACCEPT [1234:120406]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1522:124750]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j DROP
COMMIT
# Completed on Sun Nov 21 15:10:42 2010
|
iptables-=save 命令有助于我们在纯文本文件中进行更改。它看起来与在命令行中列出规则的命令略有不同,但是实际上是一回事。和以前一样,我们拥有三个部分:INPUT、FORWARD 和 OUTPUT。我们最初指定的规则涉及 OUTPUT 连接,所以这就是我们所添加的规则放置的部分。
此时,服务器被锁定,配置也已保存至一个文件中。但是,当我们执行网络扫描时会发生什么事了?让我们再次在该服务器上运行 nmap,并检查其结果,如 所示。
清单 9. 使用锁定的服务器进行网络扫描1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| ~ $ nmap 10.0.0.120
Starting Nmap 5.35DC1 ( http://nmap.org ) at 2010-11-21 20:56 EST
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.04 seconds
~ $ nmap -Pn 10.0.0.120
Starting Nmap 5.35DC1 ( http://nmap.org ) at 2010-11-21 20:56 EST
Nmap scan report for 10.0.0.120
Host is up (0.017s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 12.19 seconds
|
注意,会尝试根据服务器所在的 IP 进行扫描,但是 nmap 无法列出打开的端口。出现这种情况是因为将防火墙设置为阻止除了打开的 SSH 端口外的任何一切。因为 nmap 使用了一个特定的网络协议来验证主机是否正常运行,所以并不返回任何内容。第二次尝试成功了,并告诉我们只有 SSH 打开。只使用三条规则,我们就可以有效地锁定服务器。 |
|
|
|
|
|