gitea docker macvlan网络设置ip及限制联网

缘起

最近一些服务用了docker,比如pihole等;但是有一些docker服务其实是托管了数据的,比如gitea代码仓库托管平台,需要限制连接外网以达到安全的数据环境。

之前gitea使用的是docker的bridge网络,通过端口映射为局域网提供git仓库服务的,这样的话在docker容器内部可以访问外网,有一定安全风险,因此考虑通过macvlan bridge网络实现网络访问的控制。

折腾过程

设置一个到openwrt路由器的macvlan网络

可以通过如下命令设置:

sudo docker network create -d macvlan --subnet=192.168.0.192/24 --gateway=192.168.0.5 --ip-range 192.168.0.192/27 -o parent=ent0 macnet1

其中,subnet和局域网一样,确保可以局域网访问,gateway指向能够进行防火墙网络访问控制的openwrt路由器,ip-range设置这个macvlan的网络范围,这里设置了192后的ip地址,是因为macvlan桥接无法进行dhcp的,需要设置和真实路由器dhcp范围外的地址,parent设置的桥接的物理网卡。

注意:这里的ip-range一定要设置,否则的话分配的地址是乱的,在路由器里设置ip绑定都没有用的。

开启一个使用macvlan的docker容器

比如gitea创建命令如下:

sudo docker run -d --name=gitea-bridge --volume=/home/xxx/docker/gitea:/data --volume=/data --restart=always --network macnet1   --privileged gitea/gitea /bin/s6-svscan /etc/s6

即使用了上面创建的macvlan网络。

设置防火墙限制外网访问

在路由器里可以看到docker容器分配的地址,然后进入openwrt,在网络-防火墙内,限制从docker容器ip向外部ip的任何流量,至此这个docker容器完全是一个内部网络了,无法和外部网络进行通信了。

补充:补充一个知识点,iptable的各个规则的顺序是有关系的,比如想要第2条规则是允许192.168.0.1的23号端口的访问,第4条规则是限制192.168.0.1的所有端口的访问,那么23号端口最终是被允许的,因为第一条规则匹配到了,然后进行了放行。

即:从第一个规则向下匹配,匹配打的话就走这条规则出去了


一个题外话

有时候我们需要通过一个已存在的docker容器,创建另一个容器,可以使用runlike进行处理,过程如下:

# 安装runlike

sudo pip install runlike

# 查看某个容器创建命令

sudo runlike 容器id

总结

macvlan在docker里是个和传统虚拟机bridge类似的概念,但是不同的是他的dhcp支持不行的,无法通过路由器进行ip分配,需要自己设置网段才能比较好用。究其原因,这个不是真实的虚拟网卡,因此无法被路由器分配ip。而kvm虚拟机等,是vnet这样的虚拟网卡在工作的。

参考文档

https://gist.github.com/b2un0/08a51d3297178fcdb6829686489cad6f

https://github.com/lavie/runlike

https://article.itxueyuan.com/emy69


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。