我的双节点ESXi群集中的虚拟机数量正在增长,如果我不进行更改,我的32GB RAM Intel NUC ESXi版本将很快内存。也就是说,我必须找到一种方法来减少我的RAM使用量,以便从这个版本中挤出更多。我不想在另一个版本上花费几千美元。我正在研究的ESXi版本包含带有Intel Xeon D-1541和128GB ECC RDIMM RAM的Supermicro X10SDV-TLN4F-O主板,这是一种昂贵的ESXi版本。是的,我可以在eBay上以较少的价格购买二手服务器,但我不想要那些服务器,因为它们太笨重而且响亮。
更新:使用Google身份验证器进行双因素身份验证的FreeRADIUS 3.0
什么是Docker?Docker是一个开源软件平台,允许用户将软件打包到容器中,允许它们在不同的操作系统(Windows,Linux和macOS)之间移植。
这是一段十分钟的视频,进一步解释了Docker的用途。如果你想观看一小时的视频,这里有一个来自Docker,Inc。的视频。
目前,我有三个VM为FreeRADIUS和tac_plus(TACACS +守护进程)运行Ubuntu服务器版本。最重要的是,我计划为Pi-hole设置另一个VM(现在将其作为Docker容器运行)。当然,我可以轻松地将它安装在我现有的一个虚拟机上,但我想要分离。使用Docker,我可以很容易地获得所需的所有分离,但系统资源更少,使用效率更高。
我的Ubuntu服务器基础VM具有以下分配的资源:256MB RAM,1 x vCPU和8GB磁盘空间。根据我想要对新VM执行的操作,我可以更改分配给它的资源。如果我为它分配的内存太少,那么VM将使用该磁盘来获得额外的内存。交换不理想,所以我通常添加更多的RAM,这意味着将有一些空闲的RAM等待使用。
使用Docker,我可以为安装了Docker的Ubuntu VM分配1GB的RAM,而不用担心它的有效使用。我知道最终,系统将使用资源,因为我继续添加更多容器。如果VM开始交换,我可以轻松添加更多RAM。
Docker的另一个优点是旋转新容器的速度。使用VM,我需要克隆基本映像,创建VMX文件,打开它等等。这些过程需要几分钟。使用Docker,我可以编写一个单行的Dockerfile来创建Docker镜像并启动容器。与在创建VM时必须执行的进程所花费的分钟数相比,启动容器所需的时间不到一秒。
如果你是回访者,你可能已经知道我使用的是Ubuntu。话虽如此,Docker镜像将使用Ubuntu作为操作系统。安装可能是一个单行,但我想安装最新版本。Docker有如何操作指南,所以如果你愿意,可以按照说明操作。虽然,我仍会列出自从我跳过一步之后所做的所有事情。
1 2 3 4 5 6 7 8 | $ sudo apt-get update $ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" $ sudo apt-get update $ sudo apt-get install docker-ce -y $ docker --version Docker version 17.06.0-ce, build 02c1d87 |
在下一节中,我们将安装Docker Compose。虽然这是可选的,但我喜欢Docker编写,因为它使我更容易在一个命令中运行多个容器。
1 2 3 4 5 6 | $ sudo -i # curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose # chmod +x /usr/local/bin/docker-compose # exit $ docker-compose --version docker-compose version 1.14.0, build c7bdf9e |
Docker Hub上有很多FreeRADIUS Docker镜像 ,但我想学习如何自己创建一个。话虽如此,我读了几个网站,包括Docker的文档页面,以了解如何创建自己的图像。我花了好几次尝试让我的FreeRADIUS Docker镜像工作,因为我毕竟是一个Docker新手。
当我准备编写我的Docker文件时,我遇到的一个问题是我在哪里放置它。为了测试,我决定在我的主目录中创建一个目录,并放置与此Docker镜像相关的所有文件。然后我切换到新目录并在那里创建了我的Dockerfile。将来,我仍然会为了分离而创建一个新目录。但是,将Dockerfile放在哪里并不重要。
1 2 3 | $ mkdir radius $ cd radius $ vi Dockerfile |
一旦我运行VIM,我开始编写我的Dockerfile。起初,由于我没有使用Ubuntu Docker镜像,因此我只开始使用几行。我想确保我可以运行我需要放入Dockerfile的所有命令。一旦所有东西都在容器中工作,我就开始编写其余部分了。这是我写的完整Dockerfile。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | # Use Base Ubuntu image FROM ubuntu:16.04 # Author of this Dockerfile MAINTAINER NetworkJutsu <networkjutsu.com> # Update & upgrades RUN apt-get update && apt-get dist-upgrade -y # Install FreeRADIUS and Google Authenticator RUN apt-get install freeradius libpam-google-authenticator -y # Add user to container with home directory RUN useradd -m -d /home/networkjutsu -s /bin/bash networkjutsu # Add password to networkjutsu account. # Obviously, you wouldn't want to do this in production. # Go to the container and add the password there then commit the changes to the container. RUN echo "networkjutsu:letsmakemypasswordgreatagain" | chpasswd # Edit /etc/pam.d/radiusd file RUN sed -i 's/@include/#@include/g' /etc/pam.d/radiusd RUN echo "auth requisite pam_google_authenticator.so forward_pass secret=/etc/freeradius/networkjutsu/.google_authenticator user=freerad" >> /etc/pam.d/radiusd RUN echo "auth required pam_unix.so use_first_pass" >> /etc/pam.d/radiusd # Edit /etc/freeradius/users file RUN sed -i '1s/^/# Instruct FreeRADIUS to use PAM to authenticate users\n/' /etc/freeradius/users RUN sed -i '2s/^/DEFAULT Auth-Type := PAM\n/' /etc/freeradius/users # Copy existing /etc/freeradius/sites-enabled/default file to container COPY default /etc/freeradius/sites-enabled/default # Copy existing /etc/freeradius/clients.conf file to container COPY clients.conf /etc/freeradius/clients.conf # Copy existing .google_authenticator file to container COPY .google_authenticator /home/networkjutsu # Create a folder in /etc/freeradius equal to the user name RUN mkdir /etc/freeradius/networkjutsu # Copy .google_authenticator file to /etc/freeradius/networkjutsu RUN cp /home/networkjutsu/.google_authenticator /etc/freeradius/networkjutsu # Change owner to freerad RUN chown freerad:freerad /etc/freeradius/networkjutsu && chown freerad:freerad /etc/freeradius/networkjutsu/.google_authenticator # Expose the port EXPOSE 1812/udp 1813/udp 18120/udp # Run FreeRADIUS CMD freeradius -f |
我指示Docker引擎复制现有FreeRADIUS文件的行,这些文件基于我过去的博客文章中介绍的配置。如果您对配置文件感到好奇,请查看此帖和此文章。我可以从现有的RADIUS服务器复制所有内容,但我想展示编写Dockerfile的其他方法以及如何编辑配置文件。
完成Dockerfile之后,下一步就是构建Docker镜像。创建Docker镜像非常简单。我们只需要发出build命令,它将根据我们编写的Dockerfile创建Docker镜像。本 - 牛逼 标志使我们能够与一个友好的名称标记泊坞窗图像。
1 | $ sudo docker build -t radius1 . |
如果我们不使用友好名称标记图像,它将看起来像这样。
1 2 3 | $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb3ad23725a6 9ea220058853 "/bin/sh -c 'apt-g..." 32 minutes ago Exited (100) 32 minutes ago adoring_poitras |
如果Dockerfile中存在错误,则不会构建映像。Docker引擎很好地告诉用户它失败的地方。这是一个我从Dockerfile中取出一些代码的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | networkjutsu@ubuntu:~$ sudo docker build -t radius1 . Sending build context to Docker daemon 27.65kB Step 1/10 : RUN apt-get install freeradius libpam-google-authenticator -y Please provide a source image with `from` prior to run networkjutsu@ubuntu:~$ sudo docker build -t radius . Sending build context to Docker daemon 27.65kB Step 1/12 : FROM ubuntu:16.04 <-- Output omitted for brevity --> Step 2/12 : MAINTAINER Network Jutsu <networkjutsu.com> <-- Output omitted for brevity --> Step 3/12 : RUN apt-get install freeradius libpam-google-authenticator -y <-- Output omitted for brevity --> E: Unable to locate package freeradius E: Unable to locate package libpam-google-authenticator The command '/bin/sh -c apt-get install freeradius libpam-google-authenticator -y' returned a non-zero code: 100 networkjutsu@ubuntu:~$ |
如果没有错误,它应该如下所示。此处创建的映像来自修改后的Dockerfile,我在其中排除了COPY命令,因为我在此VM中没有这些文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | networkjutsu@ubuntu:~$ sudo docker build -t radius1 . Sending build context to Docker daemon 27.65kB Step 1/13 : FROM ubuntu:16.04 <-- Output omitted for brevity --> Step 2/13 : MAINTAINER Network Jutsu <networkjutsu.com> <-- Output omitted for brevity --> Step 3/13 : RUN apt-get update && apt-get dist-upgrade -y <-- Output omitted for brevity --> Step 4/13 : RUN apt-get install freeradius libpam-google-authenticator -y <-- Output omitted for brevity --> Step 5/13 : RUN useradd -m -d /home/networkjutsu -s /bin/bash networkjutsu <-- Output omitted for brevity --> Step 6/13 : RUN echo "networkjutsu:letsmakemypasswordgreatagain" | chpasswd <-- Output omitted for brevity -->Removing intermediate container 356f78c72b6c Step 7/13 : RUN sed -i 's/@include/#@include/g' /etc/pam.d/radiusd <-- Output omitted for brevity --> Step 8/13 : RUN echo "auth requisite pam_google_authenticator.so forward_pass secret=/etc/freeradius/networkjutsu/.google_authenticator user=freerad" >> /etc/pam.d/radiusd <-- Output omitted for brevity -->Removing intermediate container a1baec16ec31 Step 9/13 : RUN echo "auth required pam_unix.so use_first_pass" >> /etc/pam.d/radiusd <-- Output omitted for brevity --> Step 10/13 : RUN sed -i '1s/^/# Instruct FreeRADIUS to use PAM to authenticate users\n/' /etc/freeradius/users <-- Output omitted for brevity --> Step 11/13 : RUN sed -i '2s/^/DEFAULT Auth-Type := PAM\n/' /etc/freeradius/users <-- Output omitted for brevity --> Step 12/13 : EXPOSE 1812/udp 1813/udp 18120/udp <-- Output omitted for brevity --> Step 13/13 : CMD freeradius -f <-- Output omitted for brevity --> Successfully built c227ded15dcd Successfully tagged radius:latest networkjutsu@ubuntu:~$ |
要在我们的系统中查看Docker镜像,请发出以下命令。请注意,有一个Ubuntu图像。这是 来自Dockerfile 的 FROM ubuntu :16.04行的结果。
1 2 3 4 | $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE radius1 latest c227ded15dcd 27 minutes ago 246MB ubuntu 16.04 d355ed3537e9 3 weeks ago 119MB |
我们现在准备运行Docker镜像了。我们可以发出 docker run 命令,但是,我喜欢使用Docker Compose运行Docker镜像。在本节中,我们将写什么,我们需要为我们的 搬运工- 撰写.yml 文件运行多克尔图像。YML文件不需要位于radius目录中。就我而言,我只是把我的文件放在我的主目录中。但请记住,当您运行 docker - compose 命令时,它将查找YML文件。确保在存储YML文件的目录中运行该命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | $ vi docker-compose.yml version: "3" services: radius1: container_name: radius1 image: radius1 ports: - "192.168.0.100:1812:1812/udp" - "192.168.0.100:1813:1813/udp" - "192.168.0.100:18120:18120/udp" environment: - VIRTUAL_HOST=radius1.networkjutsu.lan restart: always volumes: - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro radius2: container_name: radius2 image: radius2 ports: - "192.168.0.101:1812:1812/udp" - "192.168.0.101:1813:1813/udp" - "192.168.0.101:18120:18120/udp" environment: - VIRTUAL_HOST=radius2.networkjutsu.lan restart: always volumes: - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro |
在本节中,我包含了一个IP地址。默认情况下,容器将使用主机的IP地址。如果想要使用默认IP地址,那么该行看起来像 - “1812:1812 / udp” 。在这种情况下,我想使用与主机不同的IP地址。这将允许我使用相同的端口创建另一个Docker容器。由于主机没有为其分配此特定IP地址,因此我们需要将主机设置为具有另一个IP地址(IP别名)。编辑网络接口配置意味着我们希望即使在重新启动后更改也是持久的。我想我不需要别名部分中的其他行,因为它将使用主界面配置。但是,为了以防万一,我仍然将它包含在配置中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | $ sudo vi /etc/network/interfaces # Host machine auto ens160 iface ens160 inet static address 192.168.0.200 netmask 255.255.255.0 network 192.168.0.200 broadcast 192.168.0.255 gateway 192.168.0.1 dns-nameserver 192.168.200.53 dns-search networkjutsu.lan # First IP alias # IP address for radius1 auto ens160:0 iface ens160:0 inet static address 192.168.0.100 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 dns-nameserver 192.168.200.53 dns-search networkjutsu.lan # Second IP alias # IP address for raduius2 auto ens160:1 iface ens160:1 inet static address 192.168.0.101 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 dns-nameserver 192.168.200.53 dns-search networkjutsu.lan $ sudo service networking restart |
在我验证FreeRADIUS Docker容器中的所有内容时,我注意到即使在使用正确的时区设置环境后,时间也不正确。在我的搜索过程中,我遇到了一个讨论如何正确设置时区的线程。有几种方法可以做到,但我这样解决了。使用此配置,容器将与主机的时间同步。话虽如此,主机需要与NTP服务器同步。拥有正确的时间非常重要,因为我的Google身份验证器是基于TOTP的。
完成YML文件后,我们现在可以使用docker - compose 命令运行我们的映像了 。的 - d 标志指示多克尔发动机运行容器(一个或多个)作为后台进程。
1 2 3 4 | $ sudo docker-compose up -d $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2edac8f51819 radius "/bin/sh -c 'freer..." 39 seconds ago Up 38 seconds 192.168.0.100:1812-1813->1812-1813/udp, 192.168.0.100:18120->18120/udp radius |
如果由于某种原因,您想要停止容器,则可以发出 docker stop 命令。
1 2 | $ sudo docker stop 2edac8f51819 2edac8f51819 |
我的FreeRADIUS Docker图像绝不是完美的。我仍然是Docker新手,所以我很确定如果Docker专家看到我的Dockerfile会有一些评论。但是,我已经用我的PA-200对它进行了测试,它运行得很好。
使用Docker,它将允许我关闭在ESXi主机上运行的多个VM。最重要的是,我现在能够快速启动新服务,而无需通过我用来创建Ubuntu作为操作系统的新VM的过程。
评论专区