当我关闭了除 22 之外的所有端口时,为什么我仍然能够在端口 80 上得到响应?

Que*_*ner 0 ssh iptables port

我的目标是绝对关闭我的 Ubuntu 服务器上的所有端口,端口 22 (SSH) 除外。

我按照服务器故障here上的这个问题的说明,加上herehere的说明

但是,按照说明进行操作后,我的端口似乎仍处于打开状态。以 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
Run Code Online (Sandbox Code Playgroud)

这是我的 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
Run Code Online (Sandbox Code Playgroud)

只是看着它,特别是它说“在任何地方都接受”的地方,似乎我的想法与我想要的相反。看起来我没有关闭端口,而是打开了它们。但是,这些是按照信函的说明进行操作的结果,所以也许我只是不明白这些术语的真正含义。

无论如何,最重要的是,我该怎么做才能关闭除 22 之外的所有端口,然后即使服务器重新启动也能坚持下去。当然它只是命令行中的几个命令?

(请注意,我是接受此任务的网页设计师,所以我根本不是一个超级自信的服务器管理员。请使答案易于理解。谢谢!)

Kha*_*led 5

正如您所期望的那样:

ACCEPT     all  --  anywhere             anywhere            
Run Code Online (Sandbox Code Playgroud)

表示允许所有协议/端口,因为它位于此行之前:

DROP       all  --  anywhere             anywhere            
Run Code Online (Sandbox Code Playgroud)

您不会拒绝任何端口,因为在允许一切DROPACCEPT规则之后只有一个规则。

iptables规则是按顺序匹配的,所以如果你想在 INPUT 链上只允许端口 22,你需要有以下规则:

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

以上两条规则应该足够了,默认INPUT策略设置为DROP如行中所示:

Chain INPUT (policy DROP)
Run Code Online (Sandbox Code Playgroud)

为了使您的规则集持久化,您可以使用iptables-save > rules_file将您的规则集转储到文本文件中。然后,可以在服务器启动期间加载它,方法是使用iptables-restore.