月度归档:2020年10月

建立私有docker镜像源

参考:https://linuxhint.com/setup_own_docker_image_repository/

最近非常着迷docker和kubernetes这玩意,感觉完全就是未来发展方向,于是决定好好研究一番。

有时候服务器处于内网环境,不好上网扒镜像,又或者说,由于一些众所周知的原因,从docker hub扒镜像会非常的缓慢,所以,我觉得有必要建立一个本地的docker镜像源。

建立方法

建立方法很简单,docker官方提供了一个镜像方便人们建立私有的镜像源。

根据参考文档,可以直接用一条命令来将服务跑起来,就像这样:

docker container run -d -p 5000:5000 --name registry -v<br> ~/docker/registry:/var/lib/registry registry

不过我个人推荐使用yaml文件+docker compose,方便日后维护,也习惯一下这种方式,为以后上kubernetes做准备。我就弄了一个,内容如下:

[root@docker-repo ~]# cat repo.yaml 
version: "2.4"
services:
  private_docker_repo:
    image: library/registry:latest
    ports:
      - "5000:5000"
    restart: unless-stopped
    volumes:
      - /storage:/var/lib/registry

然后,只要用

docker-compose -f repo.yaml up -d

就可以将服务跑起来了。-f参数是用来指定yaml文件,如果使用了docker-compose.yml作为文件名,可以省略掉。不过推荐自定义文件名,这样就可以将很多yaml放在同一个文件夹了。

日后如果registry镜像有更新,或者是修改什么设置,只要修改好配置文件,再pull一次和up一次即可,docker-compose会处理好更新的。

例子中,我的给机器挂了个100G的盘,挂在了/storage,到时候,数据会存在这里。

DNS修改

然后就是处理dns或者hosts,根据参考文档来看,不做也行,不过做了的话,可以少打几只字。( =ω=)

推荐做dns强制解析,那就不需要和原文一样去修改hosts。以后镜像源迁移、或者是docker母机增加减少之类的就不需要每次都处理hosts文件了。

举个例子,我修改DNS,将pdr(private docker registry)解析为镜像源服务器地址。

在docker母机上增加源

默认情况下,docker只会从docker hub拉镜像,要指定似有的源,就要修改一下配置文件。配置文件是/etc/docker/daemon.json,如果没有的话,就新建一个,添加以下内容:

{
"insecure-registries": ["pdr:5000", "192.168.11.207:5000"]
}

然后,重启docker。(对,是要重启docker的,所有容器都会重启)然后就可以在客户端使用这个似有源了。

对于在私有源上的镜像,用法和官方源差不多,只不过用户名变成了“服务器ip:端口”,于是,镜像名称格式如下:

IP:PORT/IMAGE_NAME:TAG_NAME

比如说,mariadb,在docker hub上,镜像的名称就是mariadb,或者其他用户的话就是xxx/mariadb(xxx是用户名)。但是在私有源上,就是192.168.11.207:5000/mariadb,或者在处理了dns或者hosts之后,可以用pdr:5000/mariadb。(看,可以少打很多个字!)

至此,似有镜像源搭建完成!

至于镜像源里面有什么镜像和有什么tag这个我暂时还没发现,暂时只发现在/storage/docker/registry/v2/repositories能看到有啥镜像。根据官方文档的说明:可以使用 http://服务器IP:5000/v2/_catalog 查看都有什么image。

列出镜像

做了个小脚本,放在docker-compose文件挂载的目录里面,我的是/storage,然后就可以直接列出镜像和列出指定镜像的tag了

#!/bin/bash
case $1 in
	"")
		ls -l docker/registry/v2/repositories/ | grep "drwx" | awk '{print $9}'
		;;
	*)
		ls -l docker/registry/v2/repositories/$1/_manifests/tags/ | grep "drwx" | awk '{print $9}'
		;;
esac

效果如下图

RouterOS上抵挡扫描的防火墙策略

背景

因为家里的宽带是找电信要了公网IP地址的,所以互联网可以直接访问到我作为出口的RouterOS,而众所周知,互联网上扫描机不知何几,被盯上了的话也是一件相当麻烦的事。

起因

之前在玩RouterOS上的防火墙的时候,发现有一个动作,叫做“add src to address list”,能够将包的源地址添加到某个列表中。俺寻思了一下,发现这能够很好的抵挡扫描机,思路是这样的:

防火墙策略

建立防火墙策略,指定一些经常被扫描的目的端口,然后,防火墙的动作是将包的源地址添加到一个叫做sniffer的地址列表中,设定有效时间为30天,然后,让防火墙直接丢弃来自这些地址的包,这样如果某个机器尝试扫描我的出口,触发了这个机制,那这个机器就会直接被ban掉30天。

命令行的话,添加起来是这样的:

/ip firewall filter add action=drop chain=input comment="drop sniffer" in-interface=China-Telecom src-address-list=sniffer
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=22,23,876,3306,3389,137,139,445,5001,6379,27017 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=tcp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=22,23,876,3306,3389,137,139,445,5001,6379,27017 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=udp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=2323,5555,80,81,37215,8000,8080,8081,8291,8443,53 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=tcp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=2323,5555,80,81,37215,8000,8080,8081,8291,8443 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=udp
/ip firewall filter add action=drop chain=input comment="drop sniffer" in-interface=China-Telecom src-address-list=sniffer

然后放着一阵子,就会在address list里面看到大量的IP地址。

继续改进

如果想要更加全面的保护,可以选择在防火墙上添加允许一些正常的策略,比如说,允许每秒不超过20个echo-request的icmp包啊之类的,然后在防火墙的末尾,加一条策略,将其他未知的包,都当作扫描机处理,一律有杀错无放过。

但是有时候,ban了对方的ip,也就意味着无法访问对方的IP地址,因为回包会被防火墙丢弃。这时候就要额外的添加一条策略,插在丢弃sniffer的策略的前面:

action是accept就可以了。这样如果是主动对外访问的话,回的包要么是related,要么是established,这样就可以正常访问被ban掉的ip。至于说udp访问可能没有这个状态标记……先暂时忽略吧,出现问题再继续改进。