关于iptables和docker只允许某些ip访问设置

653 阅读4分钟

我们要处理两种iptables白名单:

  • 一是centos服务器设置iptables只允许某些ip可以访问
  • 二是centos上docker容器设置iptables只允许某些服务可以访问

我们服务器是在内网,上面有些服务是直接端口开放出来的比如nginx的80端口,有些是通过docker运行的容器开放的比如10240端口

现在我们的目的是让80和10240这两个服务都只能被10.100.60.0/24这个网段的访问,其他ip都不能访问

所以让iptables设置80端口白名单要用第一种,让iptables设置10240端口白名单要用第二种

设置iptables要达到效果:

1、宿主机能访问容器ip

2、docker容器能访问宿主机ip

3、外网不能访问宿主机服务

4、外网不能访问docker容器服务

5、限制某ip段能访问宿主机和docker容器服务

6、宿主机和docker容器能访问外网

7、docker容器能向外访问ssh登录其他服务器

最终效果

image.png

后面发现,docker容器内不能访问到宿主机ip,不能访问到宿主机其他docker容器,所以增加INPUT规则

image.png

iptables安装

yum install -y iptables iptables-services
systemctl enable iptables.service
systemctl status iptables

可能安装失败,因为yum源问题,替换成阿里云源

### 设置国内镜像
  sed -e 's|^mirrorlist=|#mirrorlist=|g' \
          -e 's|^#baseurl=http://mirror.centos.org|baseurl=http://mirrors.aliyun.com|g' \
          -i.bak \
          /etc/yum.repos.d/CentOS-*.repo

centos服务白名单

参考 blog.csdn.net/qq_44273583…

# 入站规则只允许ip段访问,子网掩码方式
iptables -I INPUT -s 10.100.60.0/24 -p all -j ACCEPT
# 或者采用范围
iptables -A INPUT -m iprange --src-range 10.100.60.0-10.100.60.255 -p all -j ACCEPT
## 否定的写法没试过
iptables -I INPUT -i ext_if ! -s 10.100.60.0/24 -j DROP

# 修改默认规则入站禁止,出站允许
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许本地内部访问
iptables -A INPUT -i lo -j ACCEPT

# 允许宿主机访问自己内网ip
iptables -I INPUT -d 10.200.0.41 -s 10.200.0.41 -j ACCEPT
# 允许docker容器访问宿主机ip
iptables -I INPUT -d 10.200.0.41 -s 172.17.0.1/16 -j ACCEPT
# 允许docker容器访问其他docker容器
iptables -I INPUT -d 172.17.0.1 -s 172.17.0.1/16 -j ACCEPT

# 允许INPUT和OUTPUT在DROP时也能访问外网
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 查看设置
iptables -nL
# 或者跟具体链名
iptables -nL DOCKER-USER

# 删除查看的表格某行,从1开始
iptables -D INPUT 表格行数字

# 保存设置,配置iptables就立即生效了,但是在内存中,这里做持久化
service iptables save
systemctl restart iptables

生产常用命令

以此从上到下,先配置允许规则,在禁用INPUT表和FORWARD表

# 允许22端口ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许本机回环访问
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许访问80443端口
iptables -A INPUT -p tcp -m multiport --dport 443,80 -j ACCEPT
# 允许10段内网访问
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
# 允许172.16段内网访问
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
# 允许tcp链接状态,握手阶段建立建立
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 最后禁止NIPUT表和FORWARD表
iptables -P INPUT DROP
iptables -P FORWARD DROP  # 也可不禁FORWARD
# 保存持久化
service iptables save

其他一些禁止命令

# 默认关闭
iptables -P INPUT DROP
# 限制某些端口不能访问
iptables -I INPUT -m multiport -p tcp --dport 80,443 -j DROP
# 限制连续端口不能访问
iptables -I INPUT -p tcp --dport 1:1024 -j DROP
# 禁ping
iptables -I INPUT -p icmp --icmp-type 255 -j DROP

image.png

最新可忽略后面

因为设置docker网络不可访问要单独设置 DOCKER-USER 链,参考 www.cnblogs.com/hukey/p/183…

查看网络请求链路

cat /proc/net/nf_conntrack

image.png

# 禁止一切访问docker服务
iptables -I DOCKER-USER -j REJECT

docker服务白名单

参考 www.kancloud.cn/jiftle/ipta…

因为格式问题,我重新写了

#!/bin/bash
set e

# 网卡名称
InterfaceName="ens160"
RuleName="FIREWALL-KMS"

# # --------------------- 6. 自定义规则链 -------------------
iptables -N $RuleName
# 默认拒绝
iptables -I $RuleName -j DROP
# 加入规则链
iptables -I FORWARD -i docker0 -j $RuleName

iptables -I $RuleName -d 10.100.60.0/24 -j ACCEPT

# 允许docker容器向外访问ssh
iptables -I $RuleName -p tcp --dport 22  -j ACCEPT

# ---------------- 显示防火墙规则 ----------------------
iptables -nvL

以后段内添加某个特殊黑名单禁止

因为我们已经只允许 10.100.60.0/24 这个段能访问,但是如果要限制 10.100.60.110 不能访问

iptables -I INPUT -s 10.100.60.110 -p all -j DROP
iptables -I FIREWALL-KMS -d 10.100.60.110 -j DROP
service iptables save
iptables -L -n

【解决】iptables -P INPUT DROP后无法联网

  有一些时候 我们需要将iptables 的INPUT链写死,那么我们可以用iptables -P INPUT DROP来全部关掉input链路。

但是随之产生了一个很严重的问题,那么服务器本身发送的数据请求返回的数据同样被iptables拒之门外,一个通俗的解释就是外部数据无法访问本地服务,本地服务器也无法正常上网。

解决的办法如下:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT