如何构建一台网络引导服务器(四)
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201901/23/222618djzymxhxdrwjrqrd.jpg">Media</a>在本系列教程中所构建的网络引导服务器有一个很重要的限制,那就是所提供的操作系统镜像是只读的。一些使用场景或许要求终端用户能够修改操作系统镜像。例如,一些教师或许希望学生能够安装和配置一些像 MariaDB 和 Node.js 这样的包来做为他们课程练习的一部分。可写镜像的另外的好处是,终端用户“私人定制”的操作系统,在下次不同的工作站上使用时能够“跟着”他们。修改 Bootmenu 应用程序以使用 HTTPS为 bootmenu 应用程序创建一个自签名的证书:<pre class="prettyprint linenums">$ sudo -i# MY_NAME=$(</etc/hostname)# MY_TLSD=/opt/bootmenu/tls# mkdir $MY_TLSD# openssl req -newkey rsa:2048 -nodes -keyout $MY_TLSD/$MY_NAME.key -x509 -days 3650 -out $MY_TLSD/$MY_NAME.pem</pre>验证你的证书的值。确保 Subject 行中 CN 的值与你的 iPXE 客户端连接你的网络引导服务器所使用的 DNS 名字是相匹配的:<pre class="prettyprint linenums"># openssl x509 -text -noout -in $MY_TLSD/$MY_NAME.pem</pre>接下来,更新 bootmenu 应用程序去监听 HTTPS 端口和新创建的证书及密钥:<pre class="prettyprint linenums"># sed -i "s#listen => .*#listen => ['https://$MY_NAME:443?cert=$MY_TLSD/$MY_NAME.pem\&key=$MY_TLSD/$MY_NAME.key\&ciphers=AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA'],#" /opt/bootmenu/bootmenu.conf</pre>注意 <a href="http://ipxe.org/crypto">iPXE 当前支持的</a> 加密算法是有限制的。GnuTLS 要求 “CAPDACREAD_SEARCH” 能力,因此将它添加到 bootmenu 应用程序的 systemd 服务:<pre class="prettyprint linenums"># sed -i '/^AmbientCapabilities=/ s/$/ CAP_DAC_READ_SEARCH/' /etc/systemd/system/bootmenu.service# sed -i 's/Serves iPXE Menus over HTTP/Serves iPXE Menus over HTTPS/' /etc/systemd/system/bootmenu.service# systemctl daemon-reload</pre>现在,在防火墙中为 bootmenu 服务添加一个例外规则并重启动该服务:<pre class="prettyprint linenums"># MY_SUBNET=192.0.2.0# MY_PREFIX=24# firewall-cmd --add-rich-rule="rule family='ipv4' source address='$MY_SUBNET/$MY_PREFIX' service name='https' accept"# firewall…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201901/23/222618djzymxhxdrwjrqrd.jpg">Media</a>在本系列教程中所构建的网络引导服务器有一个很重要的限制,那就是所提供的操作系统镜像是只读的。一些使用场景或许要求终端用户能够修改操作系统镜像。例如,一些教师或许希望学生能够安装和配置一些像 MariaDB 和 Node.js 这样的包来做为他们课程练习的一部分。可写镜像的另外的好处是,终端用户“私人定制”的操作系统,在下次不同的工作站上使用时能够“跟着”他们。修改 Bootmenu 应用程序以使用 HTTPS为 bootmenu 应用程序创建一个自签名的证书:<pre class="prettyprint linenums">$ sudo -i# MY_NAME=$(</etc/hostname)# MY_TLSD=/opt/bootmenu/tls# mkdir $MY_TLSD# openssl req -newkey rsa:2048 -nodes -keyout $MY_TLSD/$MY_NAME.key -x509 -days 3650 -out $MY_TLSD/$MY_NAME.pem</pre>验证你的证书的值。确保 Subject 行中 CN 的值与你的 iPXE 客户端连接你的网络引导服务器所使用的 DNS 名字是相匹配的:<pre class="prettyprint linenums"># openssl x509 -text -noout -in $MY_TLSD/$MY_NAME.pem</pre>接下来,更新 bootmenu 应用程序去监听 HTTPS 端口和新创建的证书及密钥:<pre class="prettyprint linenums"># sed -i "s#listen => .*#listen => ['https://$MY_NAME:443?cert=$MY_TLSD/$MY_NAME.pem\&key=$MY_TLSD/$MY_NAME.key\&ciphers=AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA'],#" /opt/bootmenu/bootmenu.conf</pre>注意 <a href="http://ipxe.org/crypto">iPXE 当前支持的</a> 加密算法是有限制的。GnuTLS 要求 “CAPDACREAD_SEARCH” 能力,因此将它添加到 bootmenu 应用程序的 systemd 服务:<pre class="prettyprint linenums"># sed -i '/^AmbientCapabilities=/ s/$/ CAP_DAC_READ_SEARCH/' /etc/systemd/system/bootmenu.service# sed -i 's/Serves iPXE Menus over HTTP/Serves iPXE Menus over HTTPS/' /etc/systemd/system/bootmenu.service# systemctl daemon-reload</pre>现在,在防火墙中为 bootmenu 服务添加一个例外规则并重启动该服务:<pre class="prettyprint linenums"># MY_SUBNET=192.0.2.0# MY_PREFIX=24# firewall-cmd --add-rich-rule="rule family='ipv4' source address='$MY_SUBNET/$MY_PREFIX' service name='https' accept"# firewall…