😱 如何检查iptables规则
3月16日
检查 iptables 规则的常用命令:
查看所有规则
bash
# 查看所有链的规则(最常用)sudo iptables -L
# 显示详细信息(包含包计数、字节数)sudo iptables -L -v
# 显示规则序号(方便删除)sudo iptables -L --line-numbers
# 不解析域名,直接显示 IP(速度更快)sudo iptables -L -n
# 组合使用(推荐)sudo iptables -L -n -v --line-numbers查看特定表
iptables 有四张表:filter(默认)、nat、mangle、raw
bash
# 查看 NAT 表sudo iptables -t nat -L -n -v
# 查看 mangle 表sudo iptables -t mangle -L -n -v
# 查看 raw 表sudo iptables -t raw -L -n -v查看特定链
bash
# 只查看 INPUT 链sudo iptables -L INPUT -n -v
# 只查看 OUTPUT 链sudo iptables -L OUTPUT -n -v
# 只查看 FORWARD 链sudo iptables -L FORWARD -n -v以规则格式输出(便于备份/还原)
bash
sudo iptables-save
# 保存到文件sudo iptables-save > /etc/iptables/rules.v4```
## 输出示例解读```Chain INPUT (policy ACCEPT)target prot opt source destinationACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22DROP tcp -- 10.0.0.1 0.0.0.0/0| 字段 | 含义 |
|---|---|
target | 匹配后的动作(ACCEPT/DROP/REJECT) |
prot | 协议(tcp/udp/icmp) |
source | 来源 IP |
destination | 目标 IP |
dpt | 目标端口 |
推荐日常使用:
bash
sudo iptables -L -n -v --line-numbers这条命令信息最全,且不会因 DNS 解析导致卡顿。
gx@Ali-ECS:~$ sudo iptables -L [sudo] password for gx: Chain INPUT (policy DROP)括号里是什么意思 target prot opt source destination ACCEPT tcp — anywhere anywhere tcp dpt:9009 ACCEPT tcp — anywhere anywhere tcp dpt:8000 ACCEPT tcp — anywhere anywhere tcp dpt
3月16日
(policy DROP) 的含义
括号里的 policy(默认策略) 表示:当数据包不匹配链中任何规则时,默认执行的动作。
Chain INPUT (policy DROP)意思是:所有进入的流量,如果没有匹配到上面任何一条 ACCEPT 规则,就会被直接丢弃。
数据包的匹配流程
incoming packet ↓ACCEPT tcp dpt:9009 ← 匹配到? → 放行 ↓ 否ACCEPT tcp dpt:8000 ← 匹配到? → 放行 ↓ 否ACCEPT tcp dpt:80 ← 匹配到? → 放行 ↓ 否policy DROP ← 没有任何规则匹配 → 丢弃 ✗两种默认策略对比
| policy | 含义 | 适用场景 |
|---|---|---|
ACCEPT | 默认放行,只拦截黑名单 | 宽松环境 |
DROP | 默认拦截,只放行白名单 | 服务器(更安全) ✓ |
你当前的配置解读
你的服务器采用白名单模式,目前只开放了三个端口:
| 端口 | 说明 |
|---|---|
9009 | 自定义服务 |
8000 | 自定义服务 |
80 (http) | HTTP 网页服务 |
⚠️ 注意:如果你还需要 SSH(端口 22)远程连接,要确认是否有放行规则,否则断开后将无法重连!
policy DROP是如何设置的
3月16日
设置 policy 的命令
使用 -P 参数设置默认策略:
bash
# 设置 INPUT 链默认丢弃sudo iptables -P INPUT DROP
# 设置为默认放行sudo iptables -P INPUT ACCEPT⚠️ 操作前的重要警告
在设置 INPUT DROP 之前,必须先放行 SSH(端口22),否则会立刻断开连接且无法找回!
正确的操作顺序:
bash
# 第一步:先放行 SSHsudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 第二步:放行已建立的连接(非常重要)sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 第三步:放行本地回环sudo iptables -A INPUT -i lo -j ACCEPT
# 第四步:最后再设置默认 DROPsudo iptables -P INPUT DROP查看当前所有链的 policy
bash
sudo iptables -L | grep policy```
输出示例:```Chain INPUT (policy DROP)Chain FORWARD (policy ACCEPT)Chain OUTPUT (policy ACCEPT)规则重启后会丢失
iptables 规则默认重启后失效,需要持久化保存:
bash
# Debian/Ubuntusudo apt install iptables-persistentsudo netfilter-persistent save
# CentOS/RHELsudo service iptables save完整的iput链如下:为什么我可以ssh的?gx@Ali-ECS:~$ sudo iptables -L [sudo] password for gx: Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp — anywhere anywhere tcp dpt:9009 ACCEPT tcp — anywhere anywhere tcp dpt:8000 ACCEPT tcp — anywhere anywhere tcp dpt
3月16日
因为你装了 UFW(Uncomplicated Firewall),SSH 的放行规则在 UFW 的子链里,而不是直接写在 INPUT 链上。
数据包实际流程
incoming packet ↓ACCEPT dpt:9009 ← 不匹配 ↓ACCEPT dpt:8000 ← 不匹配ACCEPT dpt:80 ← 不匹配 ↓ufw-before-input ← 跳转进入 UFW 子链 ✓ ↓(在子链里匹配到 SSH 22 端口 → ACCEPT) ↓SSH 放行成功 ✅数据包不会直达 policy DROP,因为中途已经被 UFW 子链处理了。
验证:查看 UFW 子链里的 SSH 规则
bash
# 查看 ufw-before-input 子链sudo iptables -L ufw-before-input -n -v
# 或者直接用 ufw 查看sudo ufw status verbose```
你会看到类似:```ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22```
---
## 你当前环境的结构```iptables INPUT 链├── 手动添加的规则(9009、8000、80)└── UFW 接管的子链 ├── ufw-before-input ← SSH 22 在这里放行 ├── ufw-after-input └── ufw-reject-input ← UFW 的兜底拒绝 ↓ policy DROP ← 几乎不会走到这里💡 你的服务器上同时存在手动 iptables 规则和 UFW 规则,建议统一用一种方式管理,混用容易出现规则冲突或难以维护的问题。
gx@Ali-ECS:~$ sudo iptables -L ufw-before-input -n -v Chain ufw-before-input (1 references) pkts bytes target prot opt in out source destination 5123 453K ACCEPT all — lo * 0.0.0.0/0 0.0.0.0/0 429K 240M ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 346 16561 ufw-logging-deny all — * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID 346 16561 DROP all — * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID 0 0 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 3 0 0 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 11 0 0 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 12 5206 391K ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 0 0 ACCEPT udp — * * 0.0.0.0/0 0.0.0.0/0 udp spt:67 dpt:68 5111K 324M ufw-not-local all — * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT udp — * * 0.0.0.0/0 224.0.0.251 udp dpt:5353 0 0 ACCEPT udp — * * 0.0.0.0/0 239.255.255.250 udp dpt:1900 5111K 324M ufw-user-input all — * * 0.0.0.0/0 0.0.0.0/0
Show more
3月16日
找到了!SSH 能连接的原因在第二条规则:
关键规则
429K 240M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHEDctstate RELATED,ESTABLISHED 的意思是:已经建立的连接,直接放行,不再检查其他规则。
你的 SSH 会话在第一次连接建立后,后续所有数据包都命中这条规则,所以一直保持畅通。
完整的子链逻辑解读
| 规则 | 作用 |
|---|---|
ACCEPT lo | 放行本地回环(127.0.0.1) |
ACCEPT ctstate RELATED,ESTABLISHED | ✅ 已建立的连接直接放行(SSH 靠这条) |
DROP ctstate INVALID | 丢弃异常包 |
ACCEPT icmptype 8 | 放行 ping |
ufw-user-input | 跳转到用户自定义规则子链(SSH 22 的准入规则在这里) |
那新的 SSH 连接怎么进来的?
第一次握手走的是最后一条 ufw-user-input 子链,可以再看看:
bash
sudo iptables -L ufw-user-input -n -vSSH 的 ACCEPT dpt:22 规则应该就在那里。一旦握手成功建立连接,后续就全靠 ESTABLISHED 规则放行了。
那为啥我在加这个前ACCEPT tcp — anywhere anywhere tcp dpt
3月16日
很好的问题!因为 80 端口的请求是新连接,不是已建立的连接,所以走不到 ESTABLISHED 那条规则。
新连接 vs 已建立连接
| 状态 | 说明 | 例子 |
|---|---|---|
NEW | 第一次握手,建立新连接 | 浏览器第一次访问 80 端口 |
ESTABLISHED | 连接已建立,双方正在通信 | SSH 会话持续传输数据 |
为什么 SSH 没问题,80 端口却不行?
因为你 SSH 已经连上了,状态是 ESTABLISHED,直接被放行。
而浏览器访问 80 端口是全新的连接(NEW),需要在规则里找到一条明确的 ACCEPT dpt:80 才能放行。
查看 ufw-user-input 子链
bash
sudo iptables -L ufw-user-input -n -v```
加规则之前,这个子链里很可能**没有 80 端口**的放行规则,而 UFW 也没有开放 80,所以新连接一路走到底,最终被 `policy DROP` 丢弃:```新连接 dpt:80 ↓ESTABLISHED? ✗(新连接,不是已建立的) ↓ufw-user-input ✗(没有 80 的规则) ↓policy DROP ✗ 丢弃```
加了 `ACCEPT tcp dpt:80` 之后:```新连接 dpt:80 ↓ACCEPT tcp dpt:http ✓ 命中!放行 ✅这就是为什么加那条规则之后 80 端口才能访问的原因。
“ 80 端口的请求是新连接,不是已建立的连接”是什么意思?我断开SSH后再从新连上去为什么也可以?
3月16日
好问题!这是 TCP 连接状态的概念,跟”你有没有断开过”无关。
关键理解:每次 TCP 握手都是”新连接”
你的电脑 服务器 | | |--- SYN ----------------> | ← 这一刻状态是 NEW |<-- SYN-ACK ------------- | |--- ACK ----------------> | ← 握手完成,状态变为 ESTABLISHED | | |=== 正常通信 ============= | ← 所有后续包都是 ESTABLISHEDESTABLISHED 不是指”历史上连接过”,而是指”当前这条连接的后续数据包”。
SSH 重连的实际过程
你断开 SSH 再重连,发生了两件事:
第一次握手(NEW):
SYN 包 → ctstate NEW → 走到 ufw-user-input → 命中 ACCEPT dpt:22 → 放行 ✅握手成功后的后续包(ESTABLISHED):
后续数据包 → ctstate ESTABLISHED → 第二条规则直接放行 ✅所以每次重连都能成功,是因为 SSH 22 端口在 ufw-user-input 里有放行规则,新连接握手能通过。
对比 80 端口(加规则前)
浏览器 SYN 包 → ctstate NEW → ufw-user-input 里没有 dpt:80 → policy DROP ✗80 端口的握手第一步就被拦截了,永远到不了 ESTABLISHED 状态,所以怎么试都不通。
一句话总结
ESTABLISHED是实时跟踪当前连接的状态,不是记忆历史。每次新连接都必须先过NEW这一关,SSH 有规则放行,80 端口没有所以不通。
gx@Ali-ECS:~$ sudo iptables -L [sudo] password for gx: Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp — anywhere anywhere tcp dpt:9009 ACCEPT tcp — anywhere anywhere tcp dpt:8000 ACCEPT tcp — anywhere anywhere tcp dpt
Show more
3月16日
UFW 子链的作用
这几条规则是 UFW 自动插入的跳转规则,把数据包依次送入不同职责的子链处理。就像一条流水线:
数据包进入 INPUT ↓ufw-before-logging-input 第1站:连接前记录日志 ↓ufw-before-input 第2站:UFW 核心处理(放行合法流量) ↓ufw-after-input 第3站:处理后的收尾工作 ↓ufw-after-logging-input 第4站:连接后记录日志 ↓ufw-reject-input 第5站:明确拒绝的流量(返回REJECT) ↓ufw-track-input 第6站:连接跟踪统计每条子链的职责
| 子链 | 职责 |
|---|---|
ufw-before-logging-input | 记录进入处理前的日志 |
ufw-before-input | 核心链,放行 ESTABLISHED、lo、ICMP,跳转到 ufw-user-input(你之前看到的那条链) |
ufw-after-input | 丢弃广播、多播等无用流量,减少日志噪音 |
ufw-after-logging-input | 记录最终被拒绝的包的日志 |
ufw-reject-input | 对需要返回错误信息的流量发送 REJECT |
ufw-track-input | 连接跟踪,用于统计流量 |
为什么要拆成这么多子链?
UFW 这样设计是为了职责分离,方便管理:
你执行 sudo ufw allow 22 → UFW 只修改 ufw-user-input 子链 → 不影响其他子链 → 规则互不干扰如果全堆在 INPUT 链里,规则一多就很难维护。
注意你当前的混用问题
你的 INPUT 链顶部有手动添加的规则:
ACCEPT tcp dpt:9009 ← 手动添加ACCEPT tcp dpt:8000 ← 手动添加ACCEPT tcp dpt:http ← 手动添加── UFW 子链 ──────────── UFW 管理这两套规则互不知道对方的存在,建议统一用 UFW 管理:
bash
sudo ufw allow 9009sudo ufw allow 8000sudo ufw allow 80# 然后删除手动添加的规则sudo iptables -D INPUT -p tcp --dport 9009 -j ACCEPT记录最终被拒绝的包的日志,这个怎么查看?
3月16日
查看被拒绝的包的日志
UFW 的日志记录在系统日志里:
bash
# 最常用:直接查看 UFW 日志sudo grep "UFW BLOCK" /var/log/ufw.log
# 实时监控(看有没有新的被拦截的包)sudo tail -f /var/log/ufw.log
# 如果 ufw.log 不存在,从 syslog 里找sudo grep "UFW BLOCK" /var/log/syslog```
---
## 日志格式解读
一条典型的日志长这样:```Mar 16 10:23:11 Ali-ECS kernel: [UFW BLOCK] IN=eth0 OUT= MAC=... SRC=1.2.3.4 DST=你的IP LEN=44 ... PROTO=TCP SPT=54321 DPT=3306 ...| 字段 | 含义 |
|---|---|
UFW BLOCK | 被拦截 |
IN=eth0 | 从哪个网卡进来 |
SRC=1.2.3.4 | 来源 IP |
DST=你的IP | 目标 IP |
PROTO=TCP | 协议 |
SPT=54321 | 来源端口 |
DPT=3306 | 目标端口(比如有人扫你的 MySQL) |
按端口筛选
bash
# 查看有人扫哪些端口sudo grep "UFW BLOCK" /var/log/ufw.log | grep "DPT=22"
# 统计被拦截次数最多的来源 IPsudo grep "UFW BLOCK" /var/log/ufw.log | grep -oP 'SRC=\S+' | sort | uniq -c | sort -rn | head 10
# 统计被探测最多的端口sudo grep "UFW BLOCK" /var/log/ufw.log | grep -oP 'DPT=\S+' | sort | uniq -c | sort -rn | head 10如果没有日志,先开启 UFW 日志
bash
# 查看当前日志级别sudo ufw status verbose | grep Logging
# 开启日志sudo ufw logging on
# 日志级别(low/medium/high)sudo ufw logging medium| 级别 | 记录内容 |
|---|---|
low | 只记录被拦截的包 |
medium | 拦截 + 部分放行 |
high | 所有包(日志量很大) |
Mar 16 11:54:27 Ali-ECS kernel: [252100.423682] [UFW BLOCK] IN=eth0 OUT= MAC=00:16:3e:01:49:10:ee:ff:ff:ff:ff:ff:08:00 SRC=198.235.24.94 DST=172.31.28.241 LEN=44 TOS=0x14 PREC=0x00 TTL=238 ID=54321 PROTO=TCP SPT=54810 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0 这条日志如何解读
3月16日
逐字段解读
基本信息
| 字段 | 值 | 含义 |
|---|---|---|
Mar 16 11:54:27 | 时间 | 今天 11:54 发生 |
Ali-ECS | 主机名 | 你的服务器 |
[252100.423682] | 系统启动后的秒数 | 约开机 2.9 天 |
UFW BLOCK | 动作 | 被拦截 |
网络接口
| 字段 | 值 | 含义 |
|---|---|---|
IN=eth0 | 网卡 | 从外网网卡进来 |
OUT= | 空 | 不是出站流量 |
MAC=00:16:3e:01:49:10:ee:ff:ff:ff:ff:ff:08:00 | MAC地址 | 前6字节是你服务器网卡MAC,后6字节是来源MAC |
IP 信息
| 字段 | 值 | 含义 |
|---|---|---|
SRC=198.235.24.94 | 来源IP | 外部攻击/扫描者的IP |
DST=172.31.28.241 | 目标IP | 你服务器的内网IP |
LEN=44 | 44字节 | 只有包头,没有数据(典型扫描包) |
TTL=238 | 生存时间 | 数值很大,来源较近或伪造 |
ID=54321 | 包ID | 注意!整数54321,高度疑似扫描工具伪造 |
TCP 信息
| 字段 | 值 | 含义 |
|---|---|---|
PROTO=TCP | 协议 | TCP |
SPT=54810 | 来源端口 | 对方随机端口 |
DPT=80 | 目标端口 | 扫你的 80 端口 |
WINDOW=65535 | 窗口大小 | 最大值,典型扫描工具特征 |
SYN | TCP标志 | 第一次握手包,尝试建立新连接 |
URGP=0 | 紧急指针 | 无 |
综合判断
198.235.24.94 正在用扫描工具探测你的 80 端口几个明显的扫描特征同时出现:
ID=54321— 整数,扫描工具惯用伪造值WINDOW=65535— 最大窗口,扫描工具默认值LEN=44— 纯 SYN 包,只探测端口是否开放TTL=238— 非正常操作系统默认值
UFW 已经正确拦截了这个包,你的服务器是安全的。 ✅
可以查一下这个 IP
bash
# 查询 IP 归属whois 198.235.24.94
# 或者直接在线查curl ipinfo.io/198.235.24.94gx@Ali-ECS:~ curl ipinfo.io/198.235.24.94 { "ip": "198.235.24.94", "city": "Chang-hua", "region": "Taiwan", "country": "TW", "loc": "24.0733,120.5628", "org": "AS396982 Google LLC", "timezone": "Asia/Taipei", "readme": "<https://ipinfo.io/missingauth>" }gx@Ali-ECS:\~
3月16日
解读结果
| 字段 | 值 | 含义 |
|---|---|---|
city/region | Chang-hua, Taiwan | 台湾彰化 |
country | TW | 台湾 |
org | AS396982 Google LLC | 归属 Google 的 IP 段 |
关键点:这是 Google 的 IP
这个 IP 属于 Google Cloud(GCP) 的云服务器,不是普通用户。
可能的情况:
1. 有人租用 GCP 服务器在跑扫描工具(最可能)
黑客/研究者 → 租一台 GCP 云主机 → 跑端口扫描 → 扫到你的 80 端口2. 安全研究机构的扫描
- 互联网上有很多安全公司(Shodan、Censys 等)会定期扫描全网开放端口,建立互联网资产数据库
3. Google 自己的爬虫/探测
- 可能性较低,Google 爬虫一般走 443/80 且有明确的 User-Agent
要不要屏蔽它?
不必专门屏蔽,因为:
- UFW 已经拦截了 ✅
- 互联网上这类扫描每天都有很多,是正常现象
- 屏蔽一个 IP 意义不大,换个 IP 继续扫
bash
# 看看你每天被扫了多少次sudo grep "UFW BLOCK" /var/log/ufw.log | wc -l
# 看看都有哪些 IP 在扫你sudo grep "UFW BLOCK" /var/log/ufw.log | grep -oP 'SRC=\S+' | sort | uniq -c | sort -rn | head 10💡 只要不该开放的端口都关着,这些扫描对你毫无威胁,UFW 默默挡住就好了。
看一下这条呢 Mar 16 11:44:31 Ali-ECS kernel: [251504.249512] [UFW BLOCK] IN=eth0 OUT= MAC=00:16:3e:01:49:10:ee:ff:ff:ff:ff:ff:08:00 SRC=39.100.103.42 DST=172.31.28.241 LEN=60 TOS=0x14 PREC=0x00 TTL=53 ID=51080 DF PROTO=TCP SPT=49652 DPT=80 WINDOW=29200 RES=0x00 SYN URGP=0
3月16日
对比解读
| 字段 | 上一条 (198.235.24.94) | 这一条 (39.100.103.42) |
|---|---|---|
SRC | 台湾 Google Cloud | ? |
LEN | 44(纯扫描包) | 60(正常大小) |
ID | 54321(伪造整数) | 51080(正常随机值) |
TTL | 238(异常大) | 53(正常范围) |
WINDOW | 65535(最大值) | 29200(正常值) |
DF | 无 | 有(不分片标志) |
先查一下这个 IP
bash
curl ipinfo.io/39.100.103.42初步判断
这条和上一条明显不同,特征更像一个真实用户在访问你的 80 端口:
LEN=60— 正常 TCP SYN 包大小(Linux 默认就是60)TTL=53— 正常,说明经过了约 11 跳路由(64-53=11)ID=51080— 随机值,非伪造WINDOW=29200— Linux 内核默认初始窗口大小DF— 正常 Linux 系统都会设置
💡 结论:这更像是一个真实的人/服务器在尝试访问你的 80 端口,而不是扫描工具。先查一下 IP 归属再判断是谁。
ufw和iptables什么关系
3月16日
UFW 和 iptables 的关系
UFW 是 iptables 的前端管理工具,底层还是 iptables 在干活。
你执行命令 ↓sudo ufw allow 22 ↓UFW 翻译成 iptables 规则 ↓sudo iptables -A ufw-user-input -p tcp --dport 22 -j ACCEPT ↓Linux 内核 netfilter 执行类比理解
iptables ←→ 汽车发动机(功能强大,但操作复杂)UFW ←→ 方向盘+油门(简单易用的操作界面)对比
| iptables | UFW | |
|---|---|---|
| 定位 | 底层工具 | 高层封装 |
| 语法 | 复杂 | 简单 |
| 开放端口 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT | ufw allow 22 |
| 查看规则 | iptables -L -n -v | ufw status verbose |
| 持久化 | 需要手动保存 | 自动持久化 |
| 适合人群 | 需要精细控制 | 日常使用 |
你的服务器现状
Linux 内核 netfilter ↑ iptables 规则 ┌───────────────────────────┐ │ 手动添加的规则 │ ← 你直接用 iptables 加的 │ ACCEPT dpt:9009 │ │ ACCEPT dpt:8000 │ │ ACCEPT dpt:80 │ ├───────────────────────────┤ │ UFW 管理的规则 │ ← UFW 自动生成的 │ ufw-before-input │ │ ufw-user-input (SSH 22) │ │ ufw-after-input │ └───────────────────────────┘两套规则同时生效,所以建议统一用 UFW 管理,避免混乱:
bash
# 用 UFW 替代手动的 iptables 规则sudo ufw allow 80sudo ufw allow 8000sudo ufw allow 9009
# 删除手动添加的 iptables 规则sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPTsudo iptables -D INPUT -p tcp --dport 8000 -j ACCEPTsudo iptables -D INPUT -p tcp --dport 9009 -j ACCEPTufw是什么
3月16日
UFW 是什么
UFW = Uncomplicated Firewall,直译就是”不复杂的防火墙”,是 Ubuntu/Debian 系统上默认的防火墙管理工具,由 Ubuntu 团队开发。
它解决了什么问题
iptables 虽然强大,但命令太繁琐:
bash
# iptables 开放一个端口要写这么长sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPTsudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTsudo iptables-save > /etc/iptables/rules.v4 # 还要手动持久化
# UFW 只需要一行sudo ufw allow 22常用命令
bash
# 开启/关闭防火墙sudo ufw enablesudo ufw disable
# 查看状态sudo ufw status verbose
# 开放端口sudo ufw allow 22 # 开放 SSHsudo ufw allow 80 # 开放 HTTPsudo ufw allow 443 # 开放 HTTPS
# 只允许特定 IP 访问sudo ufw allow from 192.168.1.1 to any port 22
# 删除规则sudo ufw delete allow 80
# 查看规则编号sudo ufw status numbered# 按编号删除sudo ufw delete 3```
---
## UFW 在 Ubuntu 上的地位```Ubuntu 系统└── 内置 iptables(底层)└── 内置 UFW(管理工具) └── 你安装的应用(如 Docker、Nginx) 会自动往 UFW/iptables 里加规则💡 Ubuntu 上推荐用 UFW 管理防火墙。CentOS/RHEL 系统上对应的工具是 firewalld,底层同样是 iptables。
ubuntu系统,如何连wifi
3月17日
Ubuntu 连 WiFi 有几种方式,取决于你用的是桌面版还是服务器版:
Q: 你的 Ubuntu 是哪种环境? A: 服务器版(纯命令行)
3月17日
服务器版 Ubuntu 连 WiFi
服务器版用 nmcli(NetworkManager 命令行工具)来管理网络。
第一步:确认 WiFi 网卡存在
bash
# 查看网络设备nmcli device status```
输出示例:```DEVICE TYPE STATE CONNECTIONeth0 ethernet connected 有线连接wlan0 wifi disconnected -- ← WiFi 网卡第二步:扫描附近 WiFi
bash
nmcli device wifi list```
输出示例:```SSID MODE CHAN RATE SIGNAL SECURITYMyWiFi Infra 6 54 Mbit 85 WPA2neighbor_wifi Infra 11 54 Mbit 60 WPA2第三步:连接 WiFi
bash
# 连接 WPA2 加密的 WiFi(最常见)sudo nmcli device wifi connect "WiFi名称" password "WiFi密码"
# 例如sudo nmcli device wifi connect "MyWiFi" password "12345678"其他常用命令
bash
# 查看当前连接状态nmcli connection show
# 断开 WiFinmcli device disconnect wlan0
# 重新连接上次的 WiFinmcli connection up "WiFi名称"
# 删除已保存的 WiFinmcli connection delete "WiFi名称"如果 nmcli 不可用
bash
# 检查 NetworkManager 是否运行systemctl status NetworkManager
# 没运行就启动sudo systemctl start NetworkManagersudo systemctl enable NetworkManager # 开机自启💡 注意:阿里云 ECS 服务器是云主机,没有物理网卡,无法连 WiFi。如果你是在本地的 Ubuntu 服务器或虚拟机上操作,以上命令才适用。
PS D:\repo\blog_demo_with_astro\super-sphere> npm run dev > super-sphere@0.0.1 dev > astro dev ‘astro’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
3月17日
这是 npm 依赖没有正确安装或路径问题。
解决方法
第一步:重新安装依赖
bash
npm install第二步:再次运行
bash
npm run dev如果还不行,可能的原因和解决方式
原因1:node_modules 损坏
bash
# 删除 node_modules 和 lock 文件,重新安装rm -rf node_modulesrm package-lock.jsonnpm install原因2:npm 没有把本地 bin 加入路径
bash
# 用 npx 直接运行npx astro dev原因3:node 版本太低(Astro 需要 Node.js 18+)
bash
# 查看当前版本node -v
# 如果版本低,去 https://nodejs.org 下载最新 LTS 版本```
---
## 推荐排查顺序```npm install ↓ 还不行npx astro dev ↓ 还不行node -v 检查版本 ↓ 还不行删除 node_modules 重装通常 npm install 之后就能解决。
如何添加这几条规则到INPUT chain:ACCEPT tcp — anywhere anywhere tcp dpt:9009 ACCEPT tcp — anywhere anywhere tcp dpt:8000 ACCEPT tcp — anywhere anywhere tcp dpt
16:15
对应的 iptables 命令如下:
bash
sudo iptables -A INPUT -p tcp --dport 9009 -j ACCEPTsudo iptables -A INPUT -p tcp --dport 8000 -j ACCEPTsudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT参数解释
| 参数 | 含义 |
|---|---|
-A INPUT | 追加到 INPUT 链末尾 |
-p tcp | 协议为 TCP |
--dport 9009 | 目标端口 |
-j ACCEPT | 动作:放行 |
⚠️ 注意插入位置
-A 是追加到末尾,但你现在的 INPUT 链顶部已经有 UFW 的子链规则。如果想插入到最顶部(在 UFW 规则之前生效),用 -I 代替 -A:
bash
# -I 插入到第1行sudo iptables -I INPUT 1 -p tcp --dport 9009 -j ACCEPTsudo iptables -I INPUT 2 -p tcp --dport 8000 -j ACCEPTsudo iptables -I INPUT 3 -p tcp --dport 80 -j ACCEPT验证是否添加成功
bash
sudo iptables -L INPUT -n -v --line-numbers重启后规则会丢失,记得持久化
bash
# Ubuntu/Debiansudo apt install iptables-persistentsudo netfilter-persistent save不安装那个程序能让规则持久化吗?
16:22
可以,手动保存和加载规则即可。
方法:用脚本开机自动加载
第一步:保存当前规则到文件
bash
sudo iptables-save > /etc/iptables.rules第二步:创建开机自启脚本
bash
sudo nano /etc/rc.local写入以下内容:
bash
#!/bin/bashiptables-restore < /etc/iptables.rulesexit 0第三步:赋予执行权限
bash
sudo chmod +x /etc/rc.local更推荐的方式:systemd service
rc.local 在新版 Ubuntu 上不一定可靠,更稳妥的方式是创建一个 systemd 服务:
第一步:保存规则
bash
sudo iptables-save > /etc/iptables.rules第二步:创建服务文件
bash
sudo nano /etc/systemd/system/iptables-restore.service写入:
ini
[Unit]Description=Restore iptables rulesBefore=network.target
[Service]Type=oneshotExecStart=/sbin/iptables-restore /etc/iptables.rulesRemainAfterExit=yes
[Install]WantedBy=multi-user.target第三步:启用服务
bash
sudo systemctl daemon-reloadsudo systemctl enable iptables-restore.service以后每次修改规则后,记得重新保存
bash
sudo iptables-save > /etc/iptables.rules💡 这两种方法本质一样,都是开机时执行
iptables-restore重新加载规则。systemd 方式更可靠,推荐用第二种。
我还是安装iptables-persistent吧,是不是每次修改了规则,都要运行sudo netfilter-persistent save来持久化?
16:24
是的,每次修改规则后都需要手动运行一次保存命令:
bash
sudo netfilter-persistent save```
---
## 它做了什么```sudo netfilter-persistent save ↓把当前 iptables 规则保存到文件 ↓/etc/iptables/rules.v4 ← IPv4 规则/etc/iptables/rules.v6 ← IPv6 规则 ↓开机时自动从这两个文件恢复规则容易踩的坑
改了规则,忘记 save,然后重启了 → 规则丢失,一切回到上次 save 的状态
所以养成习惯:
bash
# 改完规则,立刻保存sudo iptables -A INPUT -p tcp --dport 9009 -j ACCEPTsudo netfilter-persistent save ← 改完马上存验证规则是否已保存
bash
cat /etc/iptables/rules.v4能看到你的规则说明保存成功了。