一、如何开启安装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

⚠️ 重要提醒

  1. 端口号:规则中使用的是 8081(宿主机上 Docker 映射的端口),而不是公网映射的 33326。因为流量到达宿主机 iptables 时,已经完成了从公网端口到宿主机端口的转换。

  2. 规则顺序-I 是插入到最前面,-A 是追加到最后。确保允许规则在拒绝规则之前,否则所有流量都会被拒绝。

  3. 外网网卡:上述规则没有指定 -i 网卡,会作用于所有网卡。如果你需要限制特定的外网网卡(如 eth0),可以在规则中添加 -i eth0

  4. 测试验证:配置完成后,建议从 8.212.18.213 和内网 10.3.0.x 测试是否正常访问,同时从其他公网 IP 测试是否被拒绝。

  5. 不要动 Docker 自动生成的规则DOCKER-USER 链是 Docker 官方留给用户修改的地方,重启 Docker 也不会被清空,非常安全。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐