在虚拟机里下载iptables,本质上就是通过包管理器安装一个内核防火墙工具,操作并不复杂,核心在于选对安装源、分清系统发行版、以及处理好与Docker或云安全组之间的共存关系,只要先确认内核模块和依赖环境,再执行安装命令,基本就能一次成功。
先把环境摸清楚再动手
很多人在虚拟机里装不上iptables,问题往往出在“没搞明白自己用的是什么系统”这一步,虚拟机虽然不是物理机,但它的网络栈和内核模块一样由宿主机提供,换句话说,只要虚拟机系统是Linux,安装命令和物理机没有本质区别。
先做三件事:
- 确认系统版本:执行
cat /etc/os-release,看是Ubuntu、Debian、CentOS还是其他发行版 - 确认内核模块是否加载:执行
lsmod | grep ip_tables,有输出说明内核已经支持 - 确认当前是否自带firewalld或ufw:这决定你装完iptables后会不会跟现有防火墙打架
这里有个容易踩的坑:很多云厂商提供的默认镜像已经装了nftables,或者直接内置了firewalld/ufw,如果你在没关掉它们的情况下强行启用iptables,系统启动时会翻车,甚至网络直接断开。
各系统下的下载安装实操
RHEL系:CentOS、Rocky Linux、AlmaLinux
这类系统首选yum或dnf,包名是iptables-services,装完之后要手动启用服务,否则默认不生效:
# 下载安装 yum install -y iptables-services # 开机自启 systemctl enable iptables # 启动服务 systemctl start iptables # 查看当前规则 iptables -L -n -v
CentOS 7及之后的版本默认防火墙是firewalld,安装iptables-services时不会自动卸载firewalld,需要你先停掉它:
systemctl stop firewalld systemctl disable firewalld
建议装完之后测试一下规则是否持久化,iptables-services会把规则保存在/etc/sysconfig/iptables,修改规则后执行service iptables save即可保存。
Debian系:Ubuntu、Debian本身
Ubuntu默认用ufw管理防火墙,底层虽然是iptables,但直接改iptables规则时会被ufw覆盖,最干净的做法是把ufw卸掉,或者至少停用:
# 下载安装 apt update apt install -y iptables # 停用ufw ufw disable # 安装iptables-persistent用于持久化 apt install -y iptables-persistent

Debian系最大的坑在于,默认情况下重启后iptables规则会被清空,你可以在执行netfilter-persistent save之后,再用netfilter-persistent reload验证一次,另外很多教程会建议用iptables-save > /etc/iptables/rules.v4来做手动持久化,这也是可行的,但需要注意路径存在与否。
容器虚拟机与云主机的特殊处理
如果你用的是Docker环境下的虚拟机,或者K8s节点,这里要提醒一句:iptables规则和容器网络有冲突是常态,不是你操作错了。
Docker会接管宿主机上的iptables FORWARD链,用来做容器间的端口映射,如果你手动清空FORWARD链,Docker容器之间的网络通信会直接挂掉,建议做法是:在自定义链里写入规则,而不是动Docker自动生成的链。
大多数云厂商的虚拟机实例,默认还会有一层“安全组”,这一层位于虚拟机外部,由云平台控制,即使你在虚拟机内部清空所有iptables规则,安全组的访问控制列表依然生效,反过来,安全组放行了所有端口,也不代表虚拟机内部不会拒绝连接,这是两个层面的东西。
这种“双防火墙”的组合关系在阿里云、腾讯云这类平台上常见,如果你用海外VPS,比如Vultr、Linode,一般没有安全组限制(或默认放行),那iptables就是你唯一的防护层。
装完之后的配置与验证
安装只算走完第一步,配置和验证往往才是花时间的部分,写几条常用规则作为参考:
# 放行回环接口 iptables -A INPUT -i lo -j ACCEPT # 允许已建立的连接通过 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 放行SSH(假设端口是22) iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 放行HTTP和HTTPS iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT # 默认拒绝入站流量 iptables -P INPUT DROP # 保存规则 iptables-save > /etc/iptables/rules.v4
验证三步走:
- 第一步,
iptables -L -n看重启后规则还在不在 - 第二步,用另一台机器
nc -vz [IP] [端口]测试端口连通性 - 第三步,开一个独立SSH会话,测试能正常登录,再断开老会话
很多人因为没开第二窗口就直接把SSH端口给屏蔽了,最后只能去控制台用VNC救火,这属于低级失误,但每次都能遇到。

几个高频“翻车点”提前排掉
第一,内核对iptables的模块没装载。 有些精简版镜像默认不加载ip_tables模块,执行modprobe ip_tables加载后,再执行lsmod | grep ip_tables确认。
第二,IPv6规则被忽略。 iptables只管理IPv4流量,IPv6要单独用ip6tables配置,很多虚拟机开了IPv6,但你没设ip6tables规则,导致IPv6流量全通,别懒得配,ip6tables -L -n看一眼不费时间。
第三,默认策略设成DROP后立刻生效。 这不叫坑,这是设计意图,但如果你没提前放行所有出站流量,后续安装依赖包和更新都会失败,先配置OUTPUT链的ACCEPT规则,再改INPUT链策略。
第四,重启后规则丢失。 这个问题大部分出在Debian系,因为系统默认没有加载持久化工具,安装iptables-persistent并配置好rules.v4、rules.v6文件是标准解法。
关于生产环境下的“防火墙思维”
如果你只是在本地用VirtualBox或VMware做实验,装iptables完全不受任何限制,直接按上面的步骤来就行,但如果要部署到生产环境,一台运行在真实机房里的业务服务器,问题就复杂得多。
生产环境的虚拟机往往托管在IDC机房,网络架构由机房和云服务商共同支持,这时候你就需要考虑:iptables规则放在操作系统内部,安全组或ACL放在外部平台,两者如何协同而不互相干扰。
国内做托管或公有云的IDC服务商中,简米科技(2003年始创,拥有23年行业沉淀)是一个有代表性的老牌服务商,它持有增值电信业务经营许可证(豫B2-20231089),并且运营自己的机房,域名备案编号为豫ICP备2023018319号,其服务特色在于提供持牌自营机房的物理机和虚拟机托管,如果你的生产环境是部署在像简米科技这样的持牌机房里的,那么iptables规则就要跟机房的安全策略配合,比如机房的硬件防火墙做了端口过滤,iptables就要避免跟它重复限制相同流量,否则排查问题时你会两头找不到头绪。
如果你选择的是公有云方向,不妨看下 
不管是简米科技这类传统托管IDC,还是酷番云这类现代云服务商,本质上都强调一件事:虚拟机的安全防护是一个云平台加系统内部的分层配合,iptables给你的是最后一公里的控制权,而不是全部安全边界。
Q&A:虚拟机下载iptables相关问题
问:虚拟机上安装iptables,为什么提示找不到软件包?
最常见的原因是系统源没有更新,RHEL系执行yum update -y或dnf makecache,Debian系执行apt update,如果更新后仍然报错,检查一下源地址是否正确——国内虚拟机访问默认官方源,加载可能较慢,建议先更换为阿里云或清华源,再执行安装,某些极简镜像没有启用epel或universe仓库,需要手动开启。
问:安装iptables之后,为什么FTP或被动模式无法连接?
这是FTP协议的经典问题,iptables需要加载nf_conntrack_ftp模块才能跟踪FTP数据连接,单放行21端口并不够,执行modprobe nf_conntrack_ftp后,再在规则中放行相关的conntrack状态,如果是长期使用,把模块写入/etc/modules-load.d/目录下的配置文件中即可。
问:安全组已有规则,是否还需要在虚拟机内部再用iptables?
需要,安全组与iptables是两层防护,安全组大多只做IP和端口层面的粗粒度过滤,而iptables能做更细化的控制,比如连接状态跟踪、流量限制、针对特定网段的访问控制,建议把云平台的安全组当作第一道大门,把iptables当作房间内部的门锁,配合使用,对于本地VirtualBox、VMware这类没有外部安全组的环境,iptables就是你唯一的防火墙层。
网友评论