docker 的 iptables策略详解和用户自定义策略的添加

1. 需求

  • 需求:iptables增加策略,允许指定主机访问本机的指定端口,但是该端口是docker容器提供的服务。

2. 分析

不想了解原理,直接操作的可以跳过本节

2.1 缘起

  • 如果不是docker,我们可以这样写:
iptables -I INPUT -p tcp --dport 80 -j DROP
iptables -I INPUT -s 10.10.181.198 -p tcp --dport 80 -j ACCEPT
  • 但是docker建立了自己的iptables规则,将绕过filter表的INPUT链,接下来我们分析docker的iptables规则:

2.2 docker的iptables规则

  • 但是对于docker,访问则绕过了filter表的INPUT链
  • 而是通

注意:但是本机访问docker服务或容器间互访,依然通过的是filter表的INPUT链

1)nat表

查看iptables的nat表,内容如下:

[root@liubei-test nginx01]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere            !loopback/8           ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        anywhere
MASQUERADE  all  --  172.20.0.0/16        anywhere
MASQUERADE  all  --  172.19.0.0/16        anywhere
MASQUERADE  all  --  172.29.0.0/16        anywhere
MASQUERADE  all  --  192.168.176.0/20     anywhere
MASQUERADE  tcp  --  192.168.176.2        192.168.176.2        tcp dpt:netopia-vo2
MASQUERADE  tcp  --  172.29.0.2           172.29.0.2           tcp dpt:20090
MASQUERADE  tcp  --  172.29.0.2           172.29.0.2           tcp dpt:10090
MASQUERADE  tcp  --  172.29.0.2           172.29.0.2           tcp dpt:lrp
MASQUERADE  tcp  --  172.20.0.2           172.20.0.2           tcp dpt:http
MASQUERADE  tcp  --  172.19.0.2           172.19.0.2           tcp dpt:http

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:172.20.0.2:80
  1. Chain PREROUTING 将请求转发到DOCKER链处理:DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL
    • ADDRTYPE:iptables的一个扩展模块,用于根据地址类型进行匹配。
    • dst-type LOCAL:表示目标地址必须是本地地址
  2. Chain DOCKER 修改了目标地址:DNAT tcp -- anywhere anywhere tcp dpt:http to:172.20.0.2:80

2)filter表

[root@liubei-test src]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  10.10.87.18          anywhere             tcp dpt:2375
DROP       tcp  --  anywhere             anywhere             tcp dpt:2375

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

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (4 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.18.0.2           tcp dpt:http

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

Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

  1. 因为nat表修改了访问的目标地址,因此不再由filter表的INPUT链处理,而是交给了filter表的FORWARD链处理
  2. FORWARD链会将请求依次交给如下链处理
    • DOCKER-USER
      • 作用:允许用户在此自定义规则
    • Chain DOCKER-ISOLATION-STAGE-1
      • 选择交给Chain DOCKER-ISOLATION-STAGE-2 处理
      • 作用:主要用于实现Docker容器之间的网络隔离
    • DOCKER
      • docker自动创建的iptables规则

    注意的是,iptables的规则是匹配到即跳出。

3. 操作

如上文,我们只需修改预留给我们的filter表的DOCKER-USER链即可

iptables -I DOCKER-USER -p tcp --dport 80 -j DROP
iptables -I DOCKER-USER -s 10.10.181.201 -p tcp --dport 80 -j ACCEPT

在这里插入图片描述

相关推荐

  1. kafka定义分区策略详解

    2024-07-15 08:46:03       42 阅读
  2. 提升用户体验UUID设计策略

    2024-07-15 08:46:03       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 08:46:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 08:46:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 08:46:03       58 阅读
  4. Python语言-面向对象

    2024-07-15 08:46:03       69 阅读

热门阅读

  1. 多头注意力机制详解:多维度的深度学习利器

    2024-07-15 08:46:03       21 阅读
  2. PostgreSQL 创建表格

    2024-07-15 08:46:03       18 阅读
  3. django 程序化配置form

    2024-07-15 08:46:03       26 阅读
  4. 梯度计算是在反向传播的过程中进行的

    2024-07-15 08:46:03       21 阅读
  5. 【随手记】python大规模数据读取

    2024-07-15 08:46:03       27 阅读
  6. django之 annotate,aggrate

    2024-07-15 08:46:03       24 阅读
  7. Linux shell自动交互之expect实践案例

    2024-07-15 08:46:03       22 阅读
  8. 代码改进,深度学习,强化学习

    2024-07-15 08:46:03       17 阅读
  9. Macos R安装xlsx ld: library not found for -lpcre2-8

    2024-07-15 08:46:03       19 阅读
  10. GitHub备份代码的学习笔记

    2024-07-15 08:46:03       23 阅读