Linux安全-端口管理
环境
系统:Ubuntu 22.04.2 LTS x86_64
防火墙:iptables
1 查看开放的端口
sudo netstat -aptun
-a
:显示所有连接和监听端口。
-p
:显示每个套接字/端口所属的进程。
-t
:仅显示 TCP 连接。
-u
:仅显示 UDP 连接。
-n
:以数字形式显示地址和端口号,而不是尝试确定名称。
有些端口通过netstat查不出来,更可靠的方法是用nmap扫描
nmap -sS -sU -p- -O localhost
-sS
:使用 TCP SYN 扫描,这种扫描方式不会完成 TCP 三次握手,因此速度较快且不易被发现。
-sU
:使用 UDP 扫描。
-p-
:扫描所有端口(1-65535)
-O
:进行操作系统检测。目标主机是
localhost
,即本地主机。
2 查看防火墙开放的端口
iptables -L -n
-L
:列出防火墙规则。
-n
:不进行 IP 地址和端口号的反向解析,直接显示数字形式。
3 修改默认策略
3.1 常见链
INPUT
:处理进入系统的数据包。OUTPUT
:处理离开系统的数据包。FORWARD
:处理转发的数据包。
3.2 策略
ACCEPT
:接受数据包。数据包将被允许通过,不会被进一步处理。DROP
:丢弃数据包。数据包将被静默丢弃,不会发送任何响应给发送方。REJECT
:拒绝数据包,并向发送方发送一个响应(例如,ICMP 端口不可达)。注意,这个策略不能直接用作默认策略,而是可以作为具体规则的目标。
3.3 修改默认策略
iptables -P <链名> <策略>
-P
:代表--policy
,用于指定默认策略。
修改 INPUT 链的注意事项,如果要将 INPUT 链的默认策略修改成 DROP 或者 REJECT ,请在修改之前添加下面几条必要的规则,防止连不上服务器和服务器连不上互联网:
# 允许回环地址的通信
iptables -A INPUT -i lo -j ACCEPT
# 允许现有连接和相关连接
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 允许 SSH 连接(非常重要,避免锁定自己)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 DNS 响应
iptables -A INPUT -p udp --sport 53 -j ACCEPT
# 允许 ICMP(ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
--dport
和 --sport
是 iptables 规则中的两个选项,用于指定数据包的目标端口和源端口。它们的区别在于它们描述的是数据包的不同方面:
--dport
(destination port,目标端口):用于匹配数据包的目标端口。
通常用于描述你希望接收数据包的端口。例如,你想允许所有到达服务器的 HTTP 请求,可以使用
--dport 80
。
--sport
(source port,源端口):用于匹配数据包的源端口。
通常用于描述数据包来自的端口。例如,你希望允许来自 DNS 服务器(源端口通常是 53)的响应数据包,可以使用
--sport 53
。
在 iptables 规则中,-i
和 -o
分别用于指定网络接口(interface),具体含义如下:
-i
(interface input):用于指定数据包进入的网络接口。
典型应用:用于 INPUT 链和 FORWARD 链规则中,指定数据包是从哪个网络接口进入的。
例如:
iptables -A INPUT -i lo -j ACCEPT
,这条规则表示允许所有从回环接口lo
进入的流量。
-o
(interface output):用于指定数据包离开的网络接口。
典型应用:用于 OUTPUT 链和 FORWARD 链规则中,指定数据包是从哪个网络接口离开的。
例如:
iptables -A OUTPUT -o lo -j ACCEPT
,这条规则表示允许所有从回环接口lo
离开的流量。
4 管理端口
注意:如果需要规则永久生效,还需要安装 iptables-persistent
,并使用 netfilter-persistent save
命令来保存
4.1 开启端口
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
-I
:在 INPUT 链中插入一条规则
-I
也可替换为-A
-A
:用于将规则附加到链的末尾
-I
:用于将规则插入到链的指定位置,默认是最前面
-p
:只匹配 TCP 协议的数据包
--dport
:只匹配目标端口为 8080 的数据包
-j
:对匹配的数据包执行 ACCEPT 操作,即允许通过
4.2 关闭端口
iptables -I INPUT -p tcp --dport 8080 -j DROP
-I INPUT
: 在 INPUT 链中插入一条规则
-p tcp
:只匹配 TCP 协议的数据包
--dport 8080
: 只匹配目标端口为 8080 的数据包
-j DROP
:对匹配的数据包执行 DROP 操作,即拒绝通过
4.3 删除规则
iptables -D INPUT -p tcp --dport 8080 -j ACCEPT
-D
:在 INPUT 链中删除一条规则
-p
:只匹配 TCP 协议的数据包
--dport
:只匹配目标端口为 8080 的数据包
-j
:对匹配的数据包执行 ACCEPT 操作,即允许通过
或者
通过命令查看规则编号:
iptables -vL --line-numbers
然后通过编号删除一条规则
iptables -D INPUT 3
最后,千万不要图省事儿,把防火墙给关了