云服务器python环境
上周偶然看到一个自动签到的python脚本,用于CTF...
由内核态的Netfilter和用户态的iptables两部分组成
Netfilter:工作在Linux内核空间,是防火墙的“核心引擎”。能对TCP/IP数据包进行过滤、地址转换等操作。
iptables:工作在用户空间,是我们直接操作的“管理工具”。位于/sbin/iptables目录下,能帮我们轻松添加、修改、删除防火墙规则。
iptables是包过滤防火墙,主要工作在网络层,针对IP数据包的地址、端口等信息做处理。
iptables使用“表”和“链”的结构来组织规则,就像“文件夹”和“文件”的关系——表里有链,链里有规则。
表名 | 核心作用 | 包含的链 | 适用场景 |
---|---|---|---|
raw | 决定是否对数据包做状态跟踪 | OUTPUT、PREROUTING | 很少用,主要用于特殊场景(如避免跟踪某些数据包) |
mangle | 修改数据包内容(如打标记)、流量整形 | INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING | 较少用,一般用于复杂的流量管理 |
nat | 网络地址转换(修改源/目标IP/端口) | OUTPUT、PREROUTING、POSTROUTING | 常用!比如内网主机通过公网IP上网(SNAT)、外网访问内网服务器(DNAT) |
filter | 过滤数据包(决定是否放行) | INPUT、FORWARD、OUTPUT | 最常用!日常的“允许/拒绝某个端口访问”都在这里配置 |
重点掌握filter表(过滤)和nat表(地址转换)
链名 | 处理时机 | 适用场景 |
---|---|---|
INPUT | 处理入站数据包(目标IP是本机) | 控制外部主机访问本机服务(如禁止ping本机) |
OUTPUT | 处理出站数据包(从本机发往外部) | 一般不建议在这里配置规则,避免影响本机对外访问 |
FORWARD | 处理转发数据包(流经本机但目标不是本机) | 当Linux作为网关时,控制是否转发内网数据包 |
PREROUTING | 路由选择前处理数据包 | 修改目标地址(DNAT),比如把外网访问的80端口映射到内网服务器 |
POSTROUTING | 路由选择后处理数据包 | 修改源地址(SNAT),比如内网主机通过公网IP上网 |
数据包会按这个顺序经过不同的表:raw → mangle → nat → filter(filter表最后生效,因为过滤是最终决策)。
不同类型的数据包(入站、出站、转发)会走不同的链路径:
主机型防火墙(数据包直接到本机)
网络型防火墙(数据包需要转发)
链内的规则是从上到下依次检查,遵循“匹配即停止”原则(除了LOG规则,它只记录日志,不中断匹配)。如果找不到匹配的规则,就按链的“默认策略”处理(默认是允许,即policy ACCEPT)。
通过 yum 包管理器安装 iptables 核心组件及服务管理工具
yum -y install iptables iptables-services #安装 iptables
systemctl start iptables.service #启动 iptables 服务
systemctl enable iptables.service #配置 iptables 开机自启
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
例
iptables -t filter -A INPUT -p icmp -j REJECT #通过拒绝 ICMP 协议实现禁止 ping
各参数含义说明:
表名:iptables 内置 3 张核心表(未指定时默认使用 filter 表):
控制类型决定了数据包匹配后的处理方式,常用类型如下(需全部大写)
控制类型 | 英文含义 | 功能说明 |
---|---|---|
ACCEPT | 允许 | 允许数据包通过,继续向下传递。 |
DROP | 丢弃 | 直接丢弃数据包,不向发送端返回任何响应(如 ping 时显示“请求超时”)。 |
REJECT | 拒绝 | 拒绝数据包通过,并向发送端返回“拒绝响应”(如 ping 时显示“目标不可达”)。 |
LOG | 日志 | 在 /var/log/messages 文件中记录数据包日志,不影响数据包后续处理(需配合其他控制类型使用)。 |
SNAT | 源地址转换 | 修改数据包的源 IP(如内网主机通过网关的公网 IP 访问外网)。 |
DNAT | 目的地址转换 | 修改数据包的目的 IP(如将公网 IP 的某个端口映射到内网主机)。 |
MASQUERADE | 地址伪装 | 类似 SNAT,但适用于公网 IP 不固定的场景(如 ADSL 拨号网络)。 |
注:LOG 是“辅助动作”,不会终止数据包的匹配流程(即“匹配即停止”规则对 LOG 不生效),数据包会继续匹配下一条规则。
管理选项 | 功能描述 | 用法示例 |
---|---|---|
-A | 在指定链的末尾追加一条规则 | iptables -A INPUT -p tcp --dport 80 -j ACCEPT(允许 80 端口 TCP 访问) |
-I | 在指定链的指定位置插入一条规则(默认插在第 1 位) | iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT(在 INPUT 链第 2 位插入 22 端口规则) |
-P | 设置链的默认策略(仅支持 ACCEPT/DROP) | iptables -P INPUT DROP(INPUT 链默认丢弃所有数据包) |
-D | 删除指定链中的一条规则(支持“按序号”或“按内容”删除) | iptables -D INPUT 5(删除 INPUT 链第 5 条规则) |
-R | 修改指定链中的一条规则(按序号替换) | iptables -R INPUT 3 -p udp --dport 53 -j ACCEPT(替换 INPUT 链第 3 条规则为允许 53 端口 UDP) |
-L | 查看指定链或表的规则列表 | iptables -L INPUT(查看 INPUT 链规则) |
-n | 以数字形式显示地址和端口(避免 DNS 解析,加快查询速度) | iptables -nL INPUT(数字形式查看 INPUT 链规则) |
-v | 查看规则时显示详细信息(如匹配的数据包数量、字节数) | iptables -vnL INPUT(详细查看 INPUT 链规则) |
--line-number | 查看规则时显示规则序号(便于按序号删除/修改规则) | iptables -L INPUT --line-numbers(显示 INPUT 链规则序号) |
-F | 清空指定链或表的所有规则(不影响默认策略) | iptables -F INPUT(清空 INPUT 链所有规则) |
-X | 清空自定义链的规则(不影响系统预设链) | iptables -X(清空所有自定义链) |
-Z | 重置链的计数器(清零匹配的数据包数量、字节数) | iptables -Z INPUT(重置 INPUT 链计数器) |
-S | 查看链的规则(以“命令行格式”显示,便于复制复用) | iptables -t nat -S POSTROUTING(查看 nat 表 POSTROUTING 链规则) |
使用 iptables -L 或 iptables -vnL 查看规则时,输出结果包含多个字段
字段名 | 含义说明 |
---|---|
pkts | 该规则匹配到的数据包总数量 |
bytes | 该规则匹配到的数据包总字节数 |
target | 规则匹配后的处理动作(即“控制类型”,如 ACCEPT、DROP) |
prot | 规则适用的网络协议(如 tcp、udp、icmp) |
opt | 规则的扩展选项(如 state 表示连接状态) |
in | 数据包流入的网卡(如 eth0,any 表示所有网卡) |
out | 数据包流出的网卡(如 eth0,any 表示所有网卡) |
source | 数据包的源 IP 或网段(如 192.168.1.0/24 表示内网网段) |
destination | 数据包的目的 IP 或网段(如 10.0.0.1 表示目标主机) |
添加规则使用 -A(追加到末尾)或 -I(插入到指定位置),需结合“匹配条件”(如协议、端口、IP)和“控制类型”
# 在 filter 表 INPUT 链末尾添加规则,拒绝 ICMP 协议数据包
iptables -t filter -A INPUT -p icmp -j REJECT
如果使用-A且规则已经允许了icmp通行则不生效,因为匹配到accept就不会匹配后面的reject,使用-I则可以,因为会插入到第一条。
# 在 INPUT 链第 2 位插入规则,允许 TCP 协议 22 端口访问
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT
# 允许所有 TCP 协议数据包进入
iptables -t filter -A INPUT -p tcp -j ACCEPT
# 允许所有 UDP 协议数据包进入
iptables -I INPUT -p udp -j ACCEPT
查看规则是验证配置是否正确的关键步骤,结合 -n(数字显示)、-v(详细信息(pkts/bytes))、--line-number(规则序号)可提升查看效率
# 查看 filter 表 INPUT 链规则,显示规则序号
iptables -L INPUT --line-numbers
# 数字形式(IP/端口不解析)、详细信息(pkts/bytes)查看 INPUT 链规则
iptables -vnL INPUT
当规则配置错误或需更新时,需删除或清空规则,操作需谨慎(尤其是远程服务器,避免误删 SSH 端口规则导致无法连接)
支持两种删除方式:按规则序号(推荐,更精准)和按规则内容
# 删除 INPUT 链第 2 条规则
iptables -D INPUT 2
# 删除 filter 表 INPUT 链中“拒绝 ICMP 协议”的规则
iptables -t filter -D INPUT -p icmp -j REJECT
使用 -F 清空指定表或链的规则,需注意:-F 仅清空规则,不影响默认策略(如 INPUT 链默认 DROP 仍会生效)。
# 清空 INPUT 链所有规则
iptables -F INPUT
# 清空 filter 表所有链规则(默认表)
iptables -F
# 清空 nat 表所有链规则
iptables -t nat -F
# 清空 mangle 表所有链规则
iptables -t mangle -F
默认策略是链的“最后一道防线”:当数据包未匹配任何规则时,将执行默认策略。生产环境中推荐将默认策略设为 DROP(白名单模式,仅允许指定规则的数据包通过)
iptables [-t 表名] -P <链名> <控制类型> # 控制类型仅支持 ACCEPT 或 DROP
# 设置 INPUT 链默认策略为 DROP(拒绝所有未匹配规则的入站数据包)
iptables -P INPUT DROP
# 设置 FORWARD 链默认策略为 DROP(防火墙默认不转发数据包)
iptables -t filter -P FORWARD DROP
# 设置 OUTPUT 链默认策略为 ACCEPT(允许所有出站数据包,便于服务器主动访问外部)
iptables -P OUTPUT ACCEPT
膜拜老学长
不用膜拜哈哈,学长很普通,一起加油,看好你们新一代。