我的目标是关闭我的 Ubuntu 服务器上除端口 22(SSH)之外的所有端口。
我按照Server Fault 上的这个问题以及说明这里和这里。
但是,按照说明操作后,似乎我的端口仍处于打开状态。例如,以下是端口 80:
$ nmap -p 80 ###.###.###.###
Starting Nmap 5.21 ( http://nmap.org ) at 2012-05-09 15:36 JST
Nmap scan report for ###-###-###-###.name.name.com (###.###.###.###)
Host is up (0.0065s latency).
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 1.63 seconds
以下是我的 iptables 的内容:
# sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
DROP all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
仅看它,尤其是它说“接受任何地方的所有内容”,似乎我得到的与我想要的相反。看起来我没有关闭端口,而是打开了它们。但是,这些都是严格按照说明进行操作的结果,所以也许我只是不明白这些术语的真正含义。
无论如何,最重要的是,我该怎么做才能关闭除 22 之外的所有端口,然后让它即使服务器重新启动也能继续。这肯定只是命令行上的几个命令?
(请注意,我是一名承担这项任务的网页设计师,所以我并不是一个非常自信的服务器管理员。请让答案易于理解。谢谢!)
答案1
正如你所期望的那样:
ACCEPT all -- anywhere anywhere
表示所有协议/端口都被允许,因为它位于此行之前:
DROP all -- anywhere anywhere
您没有拒绝任何端口,因为在允许所有端口的规则DROP
之后只有一条规则。ACCEPT
iptables
规则是按顺序匹配因此,如果您希望在 INPUT 链上仅允许端口 22,则需要有以下规则:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
上述两个规则应该足够了,默认INPUT
策略设置为DROP
如下行所示:
Chain INPUT (policy DROP)
要使规则集持久化,您可以使用iptables-save > rules_file
将规则集转储到文本文件。然后,可以在服务器启动期间通过使用 将其包含在任何脚本中来加载它iptables-restore
。