CentOS 7 开启 iptables
一、如何开启安装iptables
1、关闭 CentOS 7 自带的 firewall 防火墙
# 关闭防火墙
systemctl stop firewalld
# 取消开机启动
systemctl disable firewalld
2、安装 iptables-services
iptables 是基于内核的,和 iptables.service 没有关系,不用安装任何工具包就可以使用 iptable 命令添加的防火墙规则,只是添加的规则是临时的,基于内存的,会在系统重启前消失,所以需要 iptables.service 来对添加的规则进行保存,这样在系统重启后重载对应的防火墙规则
# Cetnos 7 默认已经装了 iptables, 只需装 services
yum install iptables-services -y
3、添加 80 端口
# 打开配置文件
vim /etc/sysconfig/iptables
# 内容
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
# 添加一条规则,放行80端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
4、重启生效
# 方法1:因为前面装了 iptables.service, 所以可执行 service 方式重启
service iptables restart
# 方法2:也可以执行centos7自带的 systemctl 方式重启
systemctl restart iptables
5、设置开机启动
# 设置防火墙开机启动
systemctl enable iptables
二、安全加固
当我们在部署内网服务时,有些端口又必须要暴映射外网端口,为了更加安全,我们可以对这些端口做一些安全限制,只允许指定的外网ip和内网才能访问
1、我有一台Centos7服务器,IP地址是10.3.0.207, 内网端口22 做了映射为33322,我现在需要做安全加固,只允许内网访问,还有指定8.212.18.213才能访问
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# 原有的这条需要删除
#-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 22 -s 10.3.0.0/24 -j ACCEPT
-A INPUT -p tcp --dport 22 -s 8.212.18.213 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
2、我想限制10.3.0.223 这台服务器上面的通过docker启动的一个应用。端口号为8081,暴露公网的映射端口为33326,现在只允许 8.212.18.213 这台服务器能访问这个8081,还有就是内网网段10.3.0.0/24允许通过。
核心提醒:直接对 INPUT 链做限制,对 Docker 容器映射的端口是不生效的。
因为 Docker 的端口映射规则在 nat 表中,流量会先经过 DNAT(目标地址转换),然后进入 FORWARD 链,由 DOCKER-USER 链处理。
正确的做法是:在 DOCKER-USER 链上做限制,并且要匹配原始目标端口(映射前的宿主机端口)
🛠️ 解决方案(请在宿主机 10.3.0.223 Ubantu 上执行)
1. 开启允许必要响应的规则
允许已建立的连接和相关连接的响应流量通过,这条规则必须放在所有限制规则之前。
iptables -I DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
2. 添加允许规则(白名单)
先允许内网网段 10.3.0.0/24 和指定公网 IP 8.212.18.213 访问 8081 端口。
iptables -I DOCKER-USER -p tcp -m conntrack --ctorigdstport 8081 -s 10.3.0.0/24 -j ACCEPT
iptables -I DOCKER-USER -p tcp -m conntrack --ctorigdstport 8081 -s 8.212.18.213 -j ACCEPT
参数说明:
-m conntrack --ctorigdstport 8081匹配原始目标端口(即宿主机上的8081),这是匹配 Docker 映射端口的关键。
3. 添加默认拒绝规则
最后拒绝所有其他 IP 对该端口的访问。
iptables -A DOCKER-USER -p tcp -m conntrack --ctorigdstport 8081 -j DROP
4. 保存规则(Ubuntu)
确保重启后规则依然生效。
netfilter-persistent save
🔍 验证规则
执行以下命令,查看 DOCKER-USER 链的规则列表,确认顺序是否正确(允许的规则在拒绝规则之前):
iptables -L DOCKER-USER -n --line-numbers -v
预期输出示例:
Chain DOCKER-USER (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
2 0 0 ACCEPT tcp -- * * 10.3.0.0/24 0.0.0.0/0 ctstate NEW tcp ctorigdstport 8081
3 0 0 ACCEPT tcp -- * * 8.212.18.213 0.0.0.0/0 ctstate NEW tcp ctorigdstport 8081
4 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp ctorigdstport 8081
⚠️ 重要提醒
-
端口号:规则中使用的是
8081(宿主机上 Docker 映射的端口),而不是公网映射的33326。因为流量到达宿主机 iptables 时,已经完成了从公网端口到宿主机端口的转换。 -
规则顺序:
-I是插入到最前面,-A是追加到最后。确保允许规则在拒绝规则之前,否则所有流量都会被拒绝。 -
外网网卡:上述规则没有指定
-i网卡,会作用于所有网卡。如果你需要限制特定的外网网卡(如eth0),可以在规则中添加-i eth0。 -
测试验证:配置完成后,建议从
8.212.18.213和内网10.3.0.x测试是否正常访问,同时从其他公网 IP 测试是否被拒绝。 -
不要动 Docker 自动生成的规则:
DOCKER-USER链是 Docker 官方留给用户修改的地方,重启 Docker 也不会被清空,非常安全。
更多推荐

所有评论(0)