iptables使用及docker的iptables规则

 更新时间:2023年12月12日 11:09:13   作者:摩洛哥M  
Docker在创建容器时,会自动添加一些iptables规则来实现网络隔离和转发等功能,本文主要介绍了iptables使用及docker的iptables规则,具有一定的参考价值,感兴趣的可以了解一下

iptables

处理流程

iptables是Linux中网络钩子,有四表五链。

  • filter表即防火墙规则,允许、阻止或丢弃进出的数据包,使用是最多的
  • nat表,网络地址转换,内网的数据包收发室,有多种类型,常见的有SNAT,PNAT,DNAT,是第二常用的
  • mangle表,修改数据包的TTL,给数据包做不同的标记,策略路由等
  • raw表,一般用于跟踪状态,调试,用的较少

优先级:raw,mangle,nat,filter

五链:

  • PREROUTING,到达本机前的路由规则
  • INPUT,进入本机的规则
  • FORWARD,转发的规则
  • OUTPUT,本机发出的规则
  • POSTROUTING,发出后的路由规则

在这里插入图片描述

命令与扩展

清空表上的所有规则,默认为filter表:

iptables -F

链上操作规则,A追加,I前面插入,D删除,R替换,N新建一个自定义链,例如:
在第5条规则前插入禁止非192.168.1.0/24访问80端口

iptables -I INPUT 5 -p tcp --dport 80 ! -s 192.168.1.0/24 -j DROP

查看某个表的所有链上的规则:

iptables -t nat -L -n -v --line-numbers

filter表,常将lo网卡和已建立连接的规则放在最前面,降低系统负担:

iptables -A INPUT -i lo -j ACCEPTiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

允许ping:

iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

允许连续范围端口:

iptables -A INPUT -p udp --sport 1000:2000 -j ACCEPT

每个链都有默认规则,禁止时可以设置白名单,允许时可以设置黑名单
INPUT链默认禁止连接:

iptables -P INPUT DROP

iptables有很多扩展,不同的扩展有不同的功能,查看文档,man iptables-extensions常用的:

  • 多端口扩展,-m multiport --dports 80,443
  • recent扩展,每30秒最多10个连接:
    iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --setiptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 30 --hitcount 10 -j DROP
  • connlimit扩展,限制并发连接数:
    iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT
  • string扩展,字符串匹配禁止:
    iptables -I INPUT -p tcp --sport 443 -m string --string "xunlei" --algo kmp -j DROP

iptables规则都是保存在内存中的,重启规则会丢失,可以使用iptables-saveiptables-restore保存,还可以使用iptables-services

# 禁用firewalld
#systemctl stop firewalld
#systemctl disable firewalld
yum -y install iptables-services
service iptables save
service iptables reload

系统默认规则

安装iptables-services后,/etc/sysconfig/iptables文件中有默认规则:

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited

第四个是允许ssh登录
第五个是禁止其他连接通过INPUT,并返回icmp-host-prohibited错误
第六个是禁止FORWARD

ipset的使用

可与iptables结合,实现动态的白名单,并且可以设置过期时间
ipset create ssh-allow hash:ip timeout 0ipset add ssh-allow 192.168.47.1 timeout 86400ipset list ssh-allowiptables -A INPUT -p tcp --dport 22 -m set --match-set ssh-allow src -j ACCEPT

SNAT与DNAT

SNAT常用于内部无法上网的机器通过网关上网,需要调整安全组和解除网关MAC与IP绑定。

# 网关打开核心转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

# 数据包离开前将源地址改为网关地址,动态上网时,常用-j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 172.16.8.1

# 不能上网的机器,修改网关
route add default gw 192.168.1.1

DNAT常用于将内部机器暴漏给外部用户使用。

iptables -t nat -A PREROUTING -d 172.16.8.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.20:8080

ftp规则

ftp分为主动模式和被动模式。

主动模式数据流是server主动连接client的随机端口,一般客户端都工作在NAT网络中,客户端端口须层层路由开放,所以这种模式很少使用。

被动模式,server告知client数据连接端口,客户端连接server的数据连接端口,这个端口一般是随机的,需要服务端开放,使用iptables的连接追踪功能,可以很好的解决这个问题

加载ftp专用的追踪模块,modprobe nf_conntrack_ftp

开启ftp追踪模块后,仅需开放21端口即可(INPUT默认DROP,OUTPUT默认ACCEPT)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTRELATED指明ftp关联的数据端口允许连接

firewall-cmd命令

iptables分为ipv4和ipv6,两者是独立的,firewalld是iptables的python脚本,已经整合了ipv4和ipv6

与iptables不同的是,firewalld使用zone来管理防火墙
zone可以根据source,mac,ipset,interface等匹配,匹配不上的进入默认的public

查询默认zone:
firewall-cmd --get-default-zone修改了规则需要重新加载才能生效:
firewall-cmd --reload列出zone的所有规则:
firewall-cmd --list-all --zone=public开放80端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent

进行复杂的控制,需要rich规则,命令比较复杂,不推荐使用

docker的iptables规则

docker网络类型

  • none:顾名思义,不使用网络,只使用lo
  • host:使用主机的网络
  • bridge:桥接,相当于nat,通过docker0分配一个172.17.0.x的地址使用
  • container:使用指定容器的网络

数据包处理流程

为便于测试,启动两个容器:

docker run -d --rm --name nginx -p 80:80 nginx:1.16.1

docker run -it --name busybox --rm busybox sh

filter表规则

iptables -N DOCKER
iptables -N DOCKER-ISOLATION-STAGE-1
iptables -N DOCKER-ISOLATION-STAGE-2
iptables -N DOCKER-USER
iptables -A FORWARD -j DOCKER-USER
iptables -A FORWARD -j DOCKER-ISOLATION-STAGE-1
iptables -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o docker0 -j DOCKER
iptables -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
iptables -A FORWARD -i docker0 -o docker0 -j ACCEPT
iptables -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
iptables -A DOCKER-ISOLATION-STAGE-1 -j RETURN
iptables -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
iptables -A DOCKER-ISOLATION-STAGE-2 -j RETURN
iptables -A DOCKER-USER -j RETURN

主要是转发规则,默认FORWARD为DROP,DOCKER链处理到docker0的IP数据包,即容器对外的规则,例如:

iptables -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT允许非docker0访问80端口

为了搞清楚DOCKER-ISOLATION-STAGE-2,需要创建一个bridge,开启一个nginx,并安装telnet

docker network create docker1
docker run -d --rm --name nginx1 -p 8080:80 --net docker1 nginx:1.16.1
docker exec -it nginx /bin/bash
# 在nginx中安装telnet
#apt update
#apt install telnet
#telnet 172.18.0.2 80

可以看到telnet 172.18.0.2 80并不通,怎么实现的呢?
DOCKER-ISOLATION-STAGE-1规则是源网卡是docker0,而目的地不是docker0就进入DOCKER-ISOLATION-STAGE-2

而DOCKER-ISOLATION-STAGE-2中,有一条规则,iptables -A DOCKER-ISOLATION-STAGE-2 -o br-afba712bfb32 -j DROP,即不允许不同的网卡互相访问,这对于docker-compose非常有用,设计非常精妙

DOCKER-USER链用于自定义转发规则,优先级最高,可以限制进入容器的源IP地址:
iptables -I DOCKER-USER ! -s 192.168.47.1 -p tcp --dport 80 -j DROP以上规则禁止非192.168.47.1的IP地址访问容器的80端口

nat表规则

iptables -t nat -N DOCKER
iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
iptables -t nat -A DOCKER -i docker0 -j RETURN

DOCKER链方便container自定义规则
POSTROUTING规则,使得container使用宿主机docker0的IP作为网关,便于接收外部返回的数据

有如下规则:
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80通过PREROUTING链和DOCKER链将主机的80端口流量转发给172.17.0.2,并通过filter表的FORWARD链返回给客户端

宿主机通过nat表的OUTPUT链是可以访问container的80端口的

nat表的POSTROUTING规则使得container可以访问外网

很奇怪的一条规则:
iptables -t nat -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE使得容器通过自己的IP172.17.0.2也可以访问80端口

最后网上的一张流程图:

在这里插入图片描述

到此这篇关于iptables使用及docker的iptables规则的文章就介绍到这了,更多相关docker iptables规则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker多平台安装与配置指南的实现

    Docker多平台安装与配置指南的实现

    这篇文章主要介绍了Docker多平台安装与配置指南的实现,深入研究了Docker在Linux、Windows、和macOS等不同平台上的安装过程及Docker镜像管理、容器运维、使用Docker Compose进行多容器管理,以及网络与数据管理等,感兴趣的可以了解一下
    2024-01-01
  • docker部署运行jar全过程

    docker部署运行jar全过程

    这篇文章主要介绍了docker部署运行jar全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • openwrt安装docker并启动的操作方法

    openwrt安装docker并启动的操作方法

    这篇文章主要介绍了openwrt安装docker并启动的操作方法,首先需要大家在软件包中下载docker和dockerd,然后在建立软连接,在系统加载时启动docker服务,感兴趣的朋友一起看看吧
    2022-03-03
  • 深入浅析Docker容器中的Patroni

    深入浅析Docker容器中的Patroni

    今天将向大家介绍,如何搭建容器下的Patroni集群环境,Patroni作为开箱即用PG高可用工具,越来越多的被各个厂商用于云环境下使用
    2021-11-11
  • Docker搭建LibreSpeed的实现步骤

    Docker搭建LibreSpeed的实现步骤

    LibreSpeed 是一个轻量级的网络速度测试工具,本文主要介绍了Docker搭建LibreSpeed的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • Docker安装Tomcat无法访问的问题及解决

    Docker安装Tomcat无法访问的问题及解决

    这篇文章主要介绍了Docker安装Tomcat无法访问的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Ollma本地部署Qwen2.5 14B的详细过程(不使用docker)

    Ollma本地部署Qwen2.5 14B的详细过程(不使用docker)

    本文介绍了如何在不使用Docker的情况下部署Ollama模型和Open-webui实现可视化界面,Ollama模型通过命令行操作,包括启动、创建、运行等,Open-webui则需要安装Anaconda环境,安装并启动服务后,通过浏览器访问即可使用,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

    Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

    这篇文章主要介绍了Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Docker 查看镜像信息的方法

    Docker 查看镜像信息的方法

    这篇文章主要介绍了Docker 查看镜像信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Docker Registry搭建与使用详解

    Docker Registry搭建与使用详解

    这篇文章主要介绍了Docker Registry搭建与使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05

最新评论