hg8*_*hg8 5 security debian nmap tcp-ip icmp
我正在使用一些 Nmap 端口扫描测试我的 Debian 服务器。我的 Debian 是在桥接连接上运行的虚拟机。
使用 TCP SYN 请求的经典端口扫描工作正常并检测端口 80 为打开(这是正确的):
nmap -p 80 192.168.1.166
Starting Nmap 6.47 ( http://nmap.org ) at 2016-02-10 21:36 CET
Nmap scan report for 192.168.1.166
Host is up (0.00014s latency).
PORT STATE SERVICE
80/tcp open http
MAC Address: xx:xx:xx:xx:xx:xx (Cadmus Computer Systems)
Nmap done: 1 IP address (1 host up) scanned in 0.51 seconds
Run Code Online (Sandbox Code Playgroud)
但是当运行 UDP 端口扫描时,它失败了,我的 Debian 服务器回答一个ICMP : Port unreachable错误:
nmap -sU -p 80 192.168.1.166
Starting Nmap 6.47 ( http://nmap.org ) at 2016-02-10 21:39 CET
Nmap scan report for 192.168.1.166
Host is up (0.00030s latency).
PORT STATE SERVICE
80/udp closed http
MAC Address: xx:xx:xx:xx:xx:xx (Cadmus Computer Systems)
Nmap done: 1 IP address (1 host up) scanned in 0.52 seconds
Run Code Online (Sandbox Code Playgroud)
Wireshark 记录:
这怎么可能?我的 80 端口是开放的,Debian 怎么回答ICMP : Port unreachable错误?那是安全问题吗?
Rui*_*iro 10
虽然 TCP 和 UDP 是 TCP/IP 的一部分,但都属于相同的 TCP/IP 或 OSI 层,并且都是 IP 之上的一层,它们是不同的协议。
http://www.cyberciti.biz/faq/key-differences-between-tcp-and-udp-protocols/
传输控制协议 (TCP) 和用户数据报协议 (UDP) 是 Internet 协议套件的两个核心协议。TCP 和 UDP 都在传输层 TCP/IP 模型上工作,并且两者都有非常不同的用法。TCP 是一种面向连接的协议。UDP 是一种无连接协议。
(来源:ml-ip.com)
某些服务确实同时响应 TCP 和 UDP 端口,就像 DNS 和 NTP 服务的情况一样,但是 Web 服务器肯定不是这种情况,它们通常只默认响应端口 80/TCP(并且做在 UDP 中根本不工作/收听)
您可以使用以下命令列出 Linux 系统中的 UDP 侦听端口:
$sudo netstat -anlpu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:1900 0.0.0.0:* 15760/minidlnad
udp 0 0 0.0.0.0:5000 0.0.0.0:* 32138/asterisk
udp 0 0 0.0.0.0:4500 0.0.0.0:* 1592/charon
udp 0 0 0.0.0.0:4520 0.0.0.0:* 32138/asterisk
udp 0 0 0.0.0.0:5060 0.0.0.0:* 32138/asterisk
udp 0 0 0.0.0.0:4569 0.0.0.0:* 32138/asterisk
udp 0 0 0.0.0.0:500 0.0.0.0:* 1592/charon
udp 0 0 192.168.201.1:53 0.0.0.0:* 30868/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 30868/named
udp 0 0 0.0.0.0:67 0.0.0.0:* 2055/dhcpd
udp 0 0 0.0.0.0:14403 0.0.0.0:* 1041/dhclient
udp 17920 0 0.0.0.0:68 0.0.0.0:* 1592/charon
udp 0 0 0.0.0.0:68 0.0.0.0:* 1041/dhclient
udp 0 0 0.0.0.0:56417 0.0.0.0:* 2055/dhcpd
udp 0 0 192.168.201.1:123 0.0.0.0:* 1859/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 1859/ntpd
udp 0 0 192.168.201.255:137 0.0.0.0:* 1777/nmbd
udp 0 0 192.168.201.1:137 0.0.0.0:* 1777/nmbd
udp 0 0 0.0.0.0:137 0.0.0.0:* 1777/nmbd
udp 0 0 192.168.201.255:138 0.0.0.0:* 1777/nmbd
udp 0 0 192.168.201.1:138 0.0.0.0:* 1777/nmbd
udp 0 0 0.0.0.0:138 0.0.0.0:* 1777/nmbd
udp 0 0 192.168.201.1:17566 0.0.0.0:* 15760/minidlnad
Run Code Online (Sandbox Code Playgroud)
使用以下命令监听 TCP 端口:
$sudo netstat -anlpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5060 0.0.0.0:* LISTEN 32138/asterisk
tcp 0 0 192.168.201.1:8200 0.0.0.0:* LISTEN 15760/minidlnad
tcp 0 0 192.168.201.1:139 0.0.0.0:* LISTEN 2092/smbd
tcp 0 0 0.0.0.0:2000 0.0.0.0:* LISTEN 32138/asterisk
tcp 0 0 192.168.201.1:80 0.0.0.0:* LISTEN 7781/nginx
tcp 0 0 192.168.201.1:53 0.0.0.0:* LISTEN 30868/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 30868/named
tcp 0 0 192.168.201.1:22 0.0.0.0:* LISTEN 2023/sshd
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1919/perl
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 30868/named
tcp 0 0 192.168.201.1:445 0.0.0.0:* LISTEN 2092/smbd
tcp 0 224 192.168.201.1:22 192.168.201.12:56820 ESTABLISHED 16523/sshd: rui [pr
Run Code Online (Sandbox Code Playgroud)
现在通常 NMAP 确实会向正在扫描的端口发送 SYN,并且根据 TCP 协议,如果守护进程/服务绑定到该端口,它将以 SYN+ACK 响应,并且 nmap 会将其显示为打开。
为了建立连接,TCP 使用三向握手。在客户端尝试与服务器连接之前,服务器必须首先绑定并侦听端口以打开连接:这称为被动打开。一旦建立了被动打开,客户端就可以发起主动打开。要建立连接,会发生三向(或 3 步)握手:
SYN:主动打开是由客户端向服务器发送一个 SYN 来执行的。客户端将段的序列号设置为随机值 A。 SYN-ACK:作为响应,服务器回复 SYN-ACK。
但是,如果服务没有在那里运行,TCP/IP 定义内核将向回发送一条 ICMP 消息,其中包含用于 UDP 服务的“端口无法访问”消息和用于 TCP 服务的 TCP RST 消息。
Destination unreachable 是由主机或其入站网关生成的[3],以通知客户端由于某种原因目的地不可达。作为 TCP、UDP 或其他 ICMP 传输的结果,可能会生成 Destination Unreachable 消息。不可达的 TCP 端口特别以 TCP RST 响应,而不是像预期的那样使用目标不可达类型 3。
因此,确实,您扫描到端口 80/UDP 的 UDP 只会收到一条 ICMP 无法访问的消息,因为没有服务侦听该组合或协议/端口。
出于安全考虑,如果您定义防火墙/iptables 规则默认丢弃所有消息,并且只允许您的机器对外服务的端口,则肯定可以阻止那些 ICMP 目标不可达消息。这样,nmap 扫描所有开放端口,尤其是在网络中,会更慢,服务器将使用更少的资源。
作为一个额外的优势,如果守护进程/服务打开了额外的端口,或者错误地添加了一个新服务,它不会为请求提供服务,直到新的防火墙规则明确允许。
请注意,如果不是在 iptables 中使用 DROP,而是使用 REJECT 规则,内核将不会忽略扫描/TCP/IP 协商尝试,并会以 Destination unreachable 的 ICMP 消息回答,代码 13:“管理禁止通信(管理过滤防止数据包被转发)”。
在 ipchains 和 iptables 中阻止除 SSH/HTTP 之外的所有端口