Linux系统防火墙与iptables开放出战入站配置

在 Linux 系统中,防火墙iptables 是密切相关但又不完全相同的概念

一、概念

1. iptables

  • iptables 是 Linux 内核中实现防火墙功能的一个 用户空间工具,它用于配置内核中的 Netfilter 框架
  • 它直接操作内核的网络规则,可以设置 数据包过滤、NAT、地址转换、端口转发等功能
  • iptables 是较早的标准防火墙工具,广泛使用于传统的 Linux 发行版中。

2. 防火墙(Firewall)

  • “防火墙”是一个更广义的概念,指的是用来控制进出网络流量的一套机制。
  • 在 Linux 中,“防火墙”通常是指一个 服务或守护进程,它通过调用底层的 iptables 或其他工具来管理网络规则。
  • 常见的现代防火墙工具包括:
    • firewalld(常见于 CentOS/RHEL)
    • ufw(常见于 Ubuntu/Debian)

二、关系

工具 类型 是否基于 iptables
iptables 基础工具 直接操作 Netfilter
firewalld 高级防火墙服务 使用 iptables 作为后端
ufw 高级防火墙工具 使用 iptables 作为后端

也就是说:

firewalldufw 这些“防火墙服务”其实是对 iptables 的封装,最终还是通过 iptables 来生效。


Q: 为什么关闭防火墙并没有清除 iptables 规则?

你可能执行了如下命令:

systemctl stop firewalld
systemctl disable firewalld

发现规则依然存在!

A: Linux关闭防火墙不像Windows那般使防火墙内的出入站规则失效

  • firewalld底层是iptables,可根据网卡分区管理防火墙规则, 是管理iptables 的上层工具, 关闭了firewalld只是没法通过firewall-cmd 命令动态管理这些规则

  • iptables 规则是内核层面的,关闭防火墙(如firewalld / ufw)服务不会自动清空规则,需要手动清空或重启。

  • 只是关闭还不够, 还需要

    sudo ufw allow 22
    sudo ufw allow 80
    sudo ufw allow 443
    sudo ufw enable
    

警告!!!:

  1. 所有操作完毕后, 务必测试 SSH 是否还能连接,以免被锁在SSH外面。

  2. iptables-save > /etc/iptables/rules.v4 保存之前一定要确定当前SSH连接是否正常, 否则重启后, 无法连接SSH

  3. 如果发现自己被挡在 SSH 之外, 则需要去云控制台或者物理机 登入后 开放tcp 22 INPUT端口

三、彻底清空 iptables 规则

# 列出 iptables 的防火墙规则,包括允许和拒绝的流量规则, 操作前查看对应新端口新部署的服务访问情况
iptables -L -n -v

# 清空所有现有规则
sudo iptables -F
sudo iptables -X
sudo iptables -Z

# 设置默认策略为 ACCEPT(允许所有)
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -L -n -v

iptables -F # 清空所有链中的规则
iptables -X # 删除所有自定义规则
iptables -Z # 清空(归零)所有链的流量计数器

iptables -P INPUT ACCEPT # 允许所有端口入站流量
iptables -P FORWARD ACCEPT # 允许所有端口转发流量
iptables -P OUTPUT ACCEPT # 允许所有端口出战流量

虽然 “所有端口开放” 在测试环境中可能有用,生产环境中 强烈不建议 这样做:

  1. 会暴露系统给外部攻击(如端口扫描、漏洞利用等)
  2. 应该只开放必要的端口(如 80、443、22)
  3. 使用防火墙工具(如 firewalldiptables)进行细粒度控制

四、重新制定 iptables 规则

1. 允许本地回环接口(lo)通信

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

2. 允许已建立的连接和相关数据包(保持已有连接不断开)

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

3. 开放特定 TCP 端口:22(SSH)、80(HTTP)、443(HTTPS)

也可以使用vim编辑 vim etc/iptables/rules.v4 文件

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 如果需要开放输出方向(一般不需要出口方向):
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -j ACCEPT

22, 80, 443 端口应用不需要UDP

4. 设置默认策略(安全起见,INPUT 默认拒绝)

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

5. 保存 iptables 规则,以便重启后仍生效

# 持久化当前配置(重启不会被重置)
iptables-save > /etc/iptables/rules.v4
iptables -F > /etc/iptables/rules.v4
iptables -F > /etc/sysconfig/iptables

# 重启防防火墙规则服务
service iptables restart

支持 IPv6,需要使用 ip6tables 做类似的配置。

6. 启动并启用 iptables 服务开机自启

systemctl start iptables
systemctl enable iptables
systemctl status iptables

# Ubuntu防火墙启用
systemctl start ufw
systemctl status ufw

7. 验证规则是否生效

查看当前规则列表:

iptables -L INPUT -n -v
iptables -L OUTPUT -n -v
iptables -L -n -v

类似如下内容(简化版):

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443

Chain FORWARD (policy DROP)
...

Chain OUTPUT (policy ACCEPT)
...

8. 重启系统, iptables 服务开机自启, 配置是否生效

9. Ubuntu相关命令

lsb_release -a [显示系统的发行版信息]
uname -m [显示处理器信息 ,aarch64:arm架构, x86_64:amd架构]
systemctl stop ufw [停止 UFW 防火墙服务]
systemctl disable ufw [禁用 UFW 防火墙服务,使其在系统启动时不自动启动]
systemctl status ufw [检查 UFW 防火墙服务的状态]
iptables -L -n -v [列出 iptables 的防火墙规则,包括允许和拒绝的流量规则]
iptables -L INPUT -n -v [列出 iptables 的 INPUT 链规则,用于检查入站流量控制策略]
iptables -X [删除所有用户自定义的链]
iptables -F [清空(Flush)所有链中的规则]
ls /etc/iptables/rules.v4 [列出 /etc/iptables/rules.v4 文件, 无法访问会提示]
cat /etc/iptables/rules.v4 [查看 /etc/iptables/rules.v4 文件的内容,该文件通常保存 iptables 规则]
iptables-save > /etc/iptables/rules.v4 [将当前的 iptables 规则保存到 /etc/iptables/rules.v4 文件中]
reboot [重启系统]
posted @ 2024-11-29 16:02  Journey&Flower  阅读(81)  评论(0)    收藏  举报