docker容器限定ip访问


一、测试所需环境:

主机1:
ip:192.168.3.117
环境配置:docker、httpd(docker容器)
主机2:
ip:192.168.3.122


二、使用docker的 iptables 策略

默认情况下,允许所有外部源IP连接到Docker主机。要仅允许特定的IP(192.168.3.122)访问容器,需要在DOCKER-USER过滤器链中插入相应规则。具体命令如下:

  1. 查看DOCKER-USER的链中的规则信息
#显示DOCKER-USER的链中的规则信息
iptables -nL DOCKER-USER
  1. 主机1httpd容器的默认访问端口为80,首先要禁止所有IP访问docker的80端口
# 在主机192.168.3.117执行如下命令:(ens192 为本机网卡,以实际为准)
#禁止所有IP访问docker的80端口
iptables -I DOCKER-USER -i ens192 -p tcp --dport 80 -j DROP
  1. 限定主机2访问主机1的httpd容器,删除DOCKER-USER的链中的默认规则(默认规则允许任意ip访问)
#只允许192.168.3.122访问docker的80端口
iptables -I DOCKER-USER -i ens192 -s 192.168.3.122 -p tcp --dport 80 -j ACCEPT
#删除DOCKER-USER的链中的默认规则
iptables -D DOCKER-USER -j RETURN
  1. 保存新的DOCKER-USER策略,并设置iptables开机自启
#保存DOCKER-USER策略
service iptables save
#设置iptables开机自启,使策略永久生效
systemctl enable iptables.service
#或者
/etc/rc.d/init.d/iptables save

注: 通过iptables 命令设置的规则,默认是临时性的。若需要规则永久生效,则要将命令写入iptables配置文件之中。
使用此策略时,Firewall会被关闭

三、Docker使用iptables 与系统Firewalld之间的关系

Docker使用iptables来管理网络流量和端口转发。而Firewalld是CentOS/RHEL 7中默认的防火墙管理工具,它也使用iptables来实现规则。
当Firewalld激活时,它会自动配置iptables规则,并将iptables的管理权限交给自己。这就导致了Firewalld会屏蔽Docker容器的网络访问。这样会导致,在系统Firewalld限定ip访问后,容器的网络仍旧是任意ip均可访问。


四、冲突解决方案

禁用 docker 的 iptables 规则,使用系统的Firewalld

#在daemon.json文件加入以下命令,若没有该文件,需要创建一个
vi /etc/docker/daemon.json
{
"iptables":false
}

开启网络地址转换(NAT)

firewall-cmd --add-masquerade --permanent
#重新加载防火墙设置,使刚才添加的规则生效
firewall-cmd --reload

仅允许主机2访问主机1的80端口

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.3.122" port protocol="tcp" port="80" accept'
#重新加载防火墙设置,使刚才添加的规则生效
firewall-cmd --reload
#查看防火墙设置
firewall-cmd --list-all

重启docker

systemctl restart docker
### Docker中安装并配置MySQL 8.0以允许所有IP访问 #### 安装MySQL 8.0 可以通过Docker官方镜像来快速部署MySQL 8.0环境。以下是具体的命令: ```bash docker pull mysql:8.0 docker run --name=mysql8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0 ``` 上述命令会拉取最新的MySQL 8.0镜像,并创建一个名为`mysql8`的容器,同时设置root用户的初始密码为`123456`。 为了验证容器是否正常运行,可执行以下命令: ```bash docker ps ``` 如果未正常启动,则可通过日志排查问题: ```bash docker logs mysql8 ``` --- #### 配置MySQL允许所有IP访问 ##### 修改绑定地址(bind-address) 默认情况下,MySQL只监听本地回环接口(127.0.0.1),需要将其改为监听所有网络接口(`0.0.0.0`)。 进入MySQL容器内部: ```bash docker exec -it mysql8 /bin/bash ``` 编辑MySQL配置文件 `/etc/mysql/my.cnf` 或者 `/etc/mysql/mysql.conf.d/mysqld.cnf` 文件中的 `bind-address` 参数[^3]: ```ini [mysqld] bind-address = 0.0.0.0 ``` 保存退出后重启MySQL服务使更改生效: ```bash service mysql restart ``` 注意:如果不挂载外部卷,默认的配置文件路径位于容器内的`/etc/mysql/`目录下。 --- ##### 设置用户权限支持远程访问 登录到MySQL数据库实例: ```bash mysql -u root -p ``` 执行SQL语句更新root用户的主机字段(host)为`%`(表示任意IP均可访问)[^1]: ```sql USE mysql; UPDATE user SET host='%' WHERE user='root'; FLUSH PRIVILEGES; ``` 此时,root账户可以从任何IP地址连接至该MySQL服务器。 --- #### 测试连接 在宿主机或其他机器上测试连接: ```bash mysql -h [容器IP] -P 3306 -u root -p ``` 其中 `[容器IP]` 是指Docker容器的实际IP地址,可以通过以下命令获取: ```bash docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql8 ``` 如果能够成功连接,则说明配置完成。 --- #### 安全注意事项 1. **禁用不必要的功能**:确保关闭了防火墙或者仅开放必要的端口。 ```bash systemctl stop firewalld systemctl disable firewalld ``` 2. **限制访问范围**:虽然设置了`host=%`,但在生产环境中应尽量限定特定IP或子网访问[^5]。例如: ```sql GRANT ALL PRIVILEGES ON *.* TO 'root'@'[指定IP]' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; ``` 3. **启用SSL加密通信**:对于敏感数据传输场景,建议强制使用SSL连接。 4. **定期审计日志**:监控错误日志(error_log)和查询日志(general_log),及时发现潜在威胁。 --- ### 总结 通过调整`bind-address`参数以及赋予适当用户权限,可以在Docker环境下实现MySQL对所有IP地址的开放访问。然而,在实际应用过程中需特别关注安全性,防止因过度宽松策略引发的数据泄露风险。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值