iptables限制docker端口禁止某台主机访问(使用DOCKER链和raw表的PREROUTING链)

背景:

在Linux上docker映射了端口,想着对服务端口进行限制指定IP访问,发现在filter表的INPUT链限制无效

环境:

主机192.168.56.132上的docker容器部署了nginx并将容器80端口映射到主机8000端口

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE                          COMMAND                  CREATED       STATUS       PORTS                                   NAMES
79e2d2824b97   dockerproxy.cn/library/nginx   "/docker-entrypoint.…"   4 hours ago   Up 2 hours   0.0.0.0:8000->80/tcp, :::8000->80/tcp   nginx-test
[root@localhost ~]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      83216/docker-proxy                  
tcp6       0      0 :::8000                 :::*                    LISTEN      83220/docker-proxy

需求:

仅允许192.168.56.128主机访问此容器,其他主机全部禁止访问。
此时默认iptables策略为:

[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  0.0.0.0/0            0.0.0.0/0           
DOCKER-ISOLATION-STAGE-1  all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            172.17.0.2           tcp dpt:80

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0   

操作:

按照常规操作添加策略

在INPUT表中直接添加drop所有地址访问8000端口

# 添加策略
[root@server ~]# iptables  -I INPUT -p tcp --dport 8000 -j DROP
# 查看
[root@server ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8000
使用其他机器测试发现所添加防火墙策略无效
[root@client ~]# curl  192.168.56.132:8000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

那尝试禁用80端口看看是否有效
[root@server ~]# iptables  -I INPUT -p tcp --dport 80 -j DROP
[root@server ~]# i
### Docker端口映射配置教程及访问网页的方法 为了通过Docker端口映射访问网页服务,通常需要完成以下几个方面的操作: #### 1. 使用`docker run`命令指定端口映射 在启动容器时,可以使用`-p`参数来定义主机容器之间的端口映射关系。例如,如果希望将宿主机的8080端口映射到容器内的80端口(假设容器内运行的是Web服务),可以执行如下命令[^2]: ```bash docker run -d -p 8080:80 nginx ``` 上述命令会以后台模式启动一个Nginx容器,并将宿主机的8080端口映射到容器内的80端口。 #### 2. 如果未绑定端口,则需手动配置iptables规则 当容器已创建但未绑定端口时,可以通过配置iptables实现端口转发功能。具体步骤如下: - **查找容器IP地址** 运行以下命令获取目标容器的网络信息: ```bash docker inspect <container_id> ``` 在返回的结果中找到`NetworkSettings.IPAddress`字段对应的值作为容器的实际IP地址[^1]。 - **添加iptables规则** 假设要将宿主机的9090端口转发至容器中的80端口,可执行以下命令: ```bash iptables -t nat -A PREROUTING -p tcp --dport 9090 -j DNAT --to-destination <container_ip>:80 iptables -t nat -A OUTPUT -p tcp --dport 9090 -j DNAT --to-destination <container_ip>:80 ``` - **保存并生效iptables规则** 完成规则添加后,建议将其持久化存储以便重启后继续有效。对于某些Linux发行版,可能需要额外安装工具如`iptables-save``iptables-restore`。 #### 3. 访问网页的方式 一旦完成了端口映射或者iptables配置,就可以通过浏览器输入URL形式访问该页面了。比如,在前面的例子中,可以在本地机器上打开浏览器并访问 `http://<host_ip>:8080/` 或者 `http://<host_ip>:9090/` 来加载由Docker容器提供服务的内容。 --- ### 注意事项 尽管存在不显式声明 `-p` 参数却仍然可以从外部访问的情况,但这通常是由于默认桥接网络或其他特殊设置所致,并不是推荐的做法。因此,始终应该明确地设定好所需的端口映射策略以确保安全性以及可控性[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值