一个开启 Docker 远程 TLS和CA认证 访问的一键脚本

Docker是目前很流行的一个平台工具。虽然我比较喜欢用命令行使用docker,但是用类似Portainer的可视化面板管理docker也是个不错的选择,检查docker的配置和状态都非常便捷。 Portainer不止能管理本机的docker,通过docker api ,进行一定的配置,可以通过网络远程连接和管理其它机器上的docker容器。具体教程可以参见以下两个链接: Docker开启TLS和CA认证 配置Docker 远程访问TLS 认证 - 乌帮图 但是每次新建一台VPS后,按照这些命令输入来开启docker的远程访问实在是太繁琐了,于是我整理了一下相关命令,编制了一个脚本,一键执行来完成相关配置。 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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 #!/bin/bash root_need(){ if [[ $EUID -ne 0 ]]; then echo "Error:这个脚本必须以root身份运行!" exit 1 fi } # 检查docker是否已经安装 if ! command -v docker &> /dev/null then echo "Docker未安装,开始安装Docker..." # 安装Docker wget -qO- get.docker.com | bash systemctl enable docker # 输出安装结果 docker --version else echo "Docker已经安装" # 输出Docker版本 docker --version fi # 获取主机的 IP 地址 IP=$(curl -s http://ipv4.icanhazip.com) # 设置证书目录 CERT_DIR="/root/docker_data/ca" mkdir -p "$CERT_DIR" # 生成 CA 证书 openssl genrsa -aes256 -passout pass:changepasswd -out "$CERT_DIR/ca-key.pem" 4096 openssl req -new -x509 -days 365 -key "$CERT_DIR/ca-key.pem" -passin pass:changepasswd -sha256 -out "$CERT_DIR/ca.pem" \ -subj "/C=US/ST=New York/L=New York/O=Example Company/OU=IT Department/CN=example.com/[email protected]" # 生成服务器证书 openssl genrsa -out "$CERT_DIR/server-key.pem" 4096 openssl req -subj "/CN=$(hostname)" -sha256 -new -key "$CERT_DIR/server-key.pem" -out "$CERT_DIR/server.csr" echo "subjectAltName = DNS:$(hostname),IP:$IP" > "$CERT_DIR/extfile.cnf" read -p "你想添加一个受信任的域名吗? (y/n): " add_domain if [ "$add_domain" == "y" ]; then read -p "输入域名: " domain_name echo "subjectAltName = DNS:$domain_name" >> "$CERT_DIR/extfile.cnf" echo "将$domain_name添加到受信任域列表中" else echo "跳过将域添加到受信任域列表的步骤" fi echo "extendedKeyUsage = serverAuth" >> "$CERT_DIR/extfile.cnf" openssl x509 -req -days 365 -sha256 -in "$CERT_DIR/server.csr" -CA "$CERT_DIR/ca.pem" -CAkey "$CERT_DIR/ca-key.pem" -CAcreateserial -out "$CERT_DIR/server-cert.pem" -extfile "$CERT_DIR/extfile.cnf" -passin pass:changepasswd # 生成客户端证书 openssl genrsa -out "$CERT_DIR/client-key.pem" 4096 openssl req -subj '/CN=client' -new -key "$CERT_DIR/client-key.pem" -out "$CERT_DIR/client.csr" echo "extendedKeyUsage = clientAuth" > "$CERT_DIR/client-extfile.cnf" openssl x509 -req -days 365 -sha256 -in "$CERT_DIR/client.csr" -CA "$CERT_DIR/ca.pem" -CAkey "$CERT_DIR/ca-key.pem" -CAcreateserial -out "$CERT_DIR/client-cert.pem" -extfile "$CERT_DIR/client-extfile.cnf" -passin pass:changepasswd # 生成 Docker 配置文件 cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker.service.bak sed -i "s|^ExecStart=.*$|ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H fd:// --containerd=/run/containerd/containerd.sock --tlsverify --tlscacert=${CERT_DIR}/ca.pem --tlscert=${CERT_DIR}/server-cert.pem --tlskey=${CERT_DIR}/server-key.pem|" /usr/lib/systemd/system/docker.service # 重新加载 Docker 服务 systemctl daemon-reload systemctl restart docker # 检查 Docker 服务是否正常启动 if systemctl is-active --quiet docker; then echo -e "Docker TLS配置已经成功完成。" else # Docker 服务启动失败, 恢复原配置并报错 echo "Error: docker服务启动失败。恢复到原来的配置..." cp /usr/lib/systemd/system/docker.service.bak /usr/lib/systemd/system/docker.service systemctl daemon-reload systemctl restart docker echo "docker服务已被恢复到原始配置。" exit 1 fi # 配置证书自动更新脚本 cat > $CERT_DIR/renewcert.sh <<'EOF' #!/bin/bash CURRENT_TIME=$(date +"%F %T") # check if CA certificate is expired if openssl x509 -checkend 1728000 -noout -in $(dirname "$0")/ca.pem; then echo "[$CURRENT_TIME] CA certificate is still valid" >> $(dirname "$0")/crontab_log.txt else echo "[$CURRENT_TIME] CA certificate has expired. Renewing all certificates..." >> $(dirname "$0")/crontab_log.txt # regenerate server and client certificates using existing CA openssl req -new -x509 -days 365 -key "$(dirname "$0")/ca-key.pem" -passin pass:changepasswd -sha256 -out "$(dirname "$0")/ca.pem" \ -subj "/C=US/ST=New York/L=New York/O=Example Company/OU=IT Department/CN=example.com/[email protected]" openssl x509 -req -days 365 -sha256 -in "$(dirname "$0")/server.csr" -CA "$(dirname "$0")/ca.pem" -CAkey "$(dirname "$0")/ca-key.pem" -CAcreateserial -out "$(dirname "$0")/server-cert.pem" -extfile "$(dirname "$0")/extfile.cnf" -passin pass:changepasswd openssl x509 -req -days 365 -sha256 -in "$(dirname "$0")/client.csr" -CA "$(dirname "$0")/ca.pem" -CAkey "$(dirname "$0")/ca-key.pem" -CAcreateserial -out "$(dirname "$0")/client-cert.pem" -extfile "$(dirname "$0")/client-extfile.cnf" -passin pass:changepasswd systemctl daemon-reload systemctl restart docker echo "[$CURRENT_TIME] All certificates have been renewed" >> $(dirname "$0")/crontab_log.txt fi EOF # 配置脚本定时任务 chmod +x $CERT_DIR/renewcert.sh crontab -l | { cat; echo "0 0 */15 * * bash $CERT_DIR/renewcert.sh"; } | crontab - 执行成功后应该如下图所示: ...

February 8, 2024 · 3 min · stayyoung

SSH改为密钥登录的一键脚本

每次新建了一个VPS,或者重装了Debian系统,要把ssh密码登录改成密钥登录都要输好多条命令,略显繁琐,所以写了一个小脚本,可以一键执行 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 #!/bin/bash # Backup existing SSH configuration sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak # Generate a random port number for SSH port=$(shuf -i 20000-60000 -n 1) # Generate SSH key if it does not exist if [ ! -f ~/.ssh/id_rsa ]; then echo "Generating SSH key..." ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -q -N "" fi # Add SSH key to authorized keys cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh # Update SSH configuration sudo sed -i 's/^#\?\(PubkeyAuthentication\s*\).*$/\1yes/' /etc/ssh/sshd_config sudo sed -i 's/^#\?\(PasswordAuthentication\s*\).*$/\1no/' /etc/ssh/sshd_config sudo sed -i 's/^#\?\(ChallengeResponseAuthentication\s*\).*$/\1no/' /etc/ssh/sshd_config sudo sed -i "s/^#\?\\(Port\\s*\\).*$/\\1$port/" /etc/ssh/sshd_config # Restart SSH service sudo systemctl restart sshd # Check if SSH service is running if systemctl is-active --quiet sshd; then echo -e "SSH port has been changed to $port.\nCheck the firewall to make sure port $port is open.\nKey-based authentication has been enabled while password authentication has been disabled.\nDon't forget to save the private key file." else # SSH service failed to start, restore original configuration and display error message echo "Error: SSH service failed to start. Reverting to original configuration..." sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config sudo systemctl restart sshd echo "SSH service has been restored to the original configuration." exit 1 fi # Remove backup of SSH configuration(Optional) # sudo rm /etc/ssh/sshd_config.bak 主要功能:自动生成密钥对,更改ssh端口为随机端口,禁用密码登录,并开启密钥登陆。 ...

April 4, 2023 · 2 min · stayyoung

搭建WordPress博客教程(三)准备工作

在本系列的前两篇文章中,介绍了如何购买VPS和购买域名,接下来要做的并不是立马搭建一个WordPress博客,而是要做一些准备。比如VPS的安全防护,域名解析等。下面会逐一介绍。 一、选择ssh工具 购买的VPS一般来说都是Linux系统,连接VPS需要用到一个ssh工具,如果使用Mac OS,那么系统自带的终端就能满足需求。如果使用Windows,综合考虑,比较推荐以下的几款ssh工具: 1、XShell 官方下载地址: All Downloads - NetSarang Website Xshell应该是目前人气最高的一款ssh工具了,许多人认为它是最好用的。以前它还有个缺点要收费,但现在如果个人使用、不用做商业用途的话,Xshell和XFTP是免费的,并且和付费版的功能上是完全一致的。 缺点:这是一款商业软件,不开源。只有Windows版本。 2、Termius 官方下载地址: Termius for Windows | Download 这是界面做的很好看的一款ssh工具。操作也很人性化。Termius支持几乎所有主流平台,你在Mac OS,Windows,Linux,IOS,Android上都能找到它,这意味着你的配置可以多平台同步。 缺点:这是一款商业软件,不开源,免费版功能有限制。软件没有汉化。 3、Mobaxterm 官方下载地址: MobaXterm Xserver with SSH, telnet, RDP, VNC and X11 - Home Edition (mobatek.net) 这是一款开源软件,使用和推荐的人都很多,本人没有用过,就不发表评论了,觉得不错的可以试一试。 4、WindTerm 下载地址: Releases · kingToolbox/WindTerm (github.com) 这是一款在github上的开源软件,完全免费用于商业和非商业用途,没有限制。支持Windows,Linux,MacOS。内存占用很低,软件运行也很流畅,并且有中文界面。 缺点:刚上手会觉得界面有点乱,软件还在开发,有一些小bug。 二、连接VPS和基础操作 选择好了ssh工具,就可以开始连接购买好的VPS了。下面的操作都以WindTerm作为示范,其余软件的操作大同小异,可以参考。有问题的话请谷歌或者留言提问。 首先点击会话→新建会话,然后会弹出会话设置窗口。 在窗口中填入VPS的信息,在主机一栏中填入用户名(默认是root)@IP地址(下图中为217.69.1.13),第二行填写VPS的ssh端口号(默认是22)。这些信息在VPS的商家管理页面上都可以获取到,填写完成后点击下方的连接。 在弹出窗口勾选下次自动登录,然后点击继续。 弹出的下一个窗口会让你输入ssh密码,直接复制VPS商家提供的密码,粘贴进去后点击继续。 如果看到下图中所示的系统介绍页面,说明已经成功连接上VPS了。 个人比较喜欢的Linux系统是Debian系的,下面介绍的命令和脚本都是基于Debian 10。 Linux系统的VPS,一般都是没有图形化界面的,只要在命令行窗口中输入命令代码,然后敲回车,系统就会执行相应的命令。类似于在Windows系统中使用CMD命令提示符。 Linux的常用命令可以看下面的表格,也可以谷歌相应教程,这方面的教程是非常多的。 Linux說明cd切换目录pwd取得目前所在的位置ls列出目前的文件列表mkdir建立新的文件夹touch建立文件cat查看文件的内容mv移动文件(也可以用來重命名)rm删除文件clear清除画面上的内容who列出当前登录用户exit退出登录ctrl + c中断目前在画面上的操作ctrl + z将目前画面的操作转至后台 刚到手的VPS建议输入以下几个更新和检测命令。 首先看一下是否以root用户登录,不是的话要输入sudo -i 提权。 1、更新apt工具源,代码见下: 1 apt update && apt upgrade && apt autoremove 2、Bench脚本检测一下VPS的参数。脚本开源地址: teddysun/across: Across the Great Wall we can reach every corner in the world (github.com),代码见下: ...

September 24, 2022 · 2 min · stayyoung

搭建Wordpress博客教程(一)购买VPS

一、前言 WordPress 是一个以PHP和MySQL为平台的自由开源的博客软件和内容管理系统。WordPress具有插件架构和模板系统。截至2018年4月,排名前1000万的网站中超过30.6%使用WordPress。WordPress是最受欢迎的网站内容管理系统,也是目前因特网上最流行的博客系统。 WordPress - 维基百科,自由的百科全书 (wikipedia.org) 以上是维基百科对于WordPress的介绍,本博客站也是基于WordPress搭建的。为了保存一些搭建博客网站的心得,也为了给一些不知道如何搭建自己个人博客网站的朋友指路和参考,我准备用三到四篇文章,把具体的搭建步骤一步一步的都梳理一遍。 首先,我把博客搭建在了自己的VPS主机上,而不是托管给wordpress.com,具体两者的区别可以参考 《【新手向】你究竟需要什么样的博客方案》 这篇文章,我这里就不详细展开了。 二、VPS选择 那么很显然,我们要给自己买一台VPS,即虚拟专用服务器,你可以把它简单理解为一个一个24小时不断运行的主机。国内商家可以选择腾讯云,阿里云等,但是我不会买,因为在国内服务器上建站的话都要在工信部备案,是一件麻烦事。我还是倾向于挑选国外的主机商。谷歌搜索VPS测评,可以看到很多国人的VPS测评网站,大家可以挑合适的购买。 VPS商家多如牛毛,容易挑的眼花,我可以给你推荐以下几家(因为我有aff): (1)如果你预算比较高,你可以选择搬瓦工(Bandwangong Host); (2)如果你预算比较低,可以选择Racknerd; (3)如果你想白嫖,而且你手里正好有Visa或者MasterCard通道的信用卡,那么目前亚马逊的AWS 的免费试用是一个不错的选择。 在下面我会依次对这三种选择做介绍。 2.1 购买搬瓦工VPS 搬瓦工原名是Bandwangong Host,在国内VPS用户圈中是一个知名度很高的名字,早年它是做性价比VPS起家的,正好赶上了国内流行用Shadowsocks协议科学上网,搬瓦工的VPS可以在用户的后台一键搭建Shadowsocks服务器,线路又好,支付方式可用支付宝,因此当时有翻墙需求的国人都一窝蜂的去买它家的VPS,也让搬瓦工大赚了一笔。 然后经过近几年的发展,搬瓦工的产品越来越高端,VPS的价格也越来越贵了。目前在国内论坛上,有许多追求性价比的用户对它评价不佳。 但如果你预算比较宽裕,土豪的就想用钱解决问题,也追求稳定性和网络连接线路质量的话,搬瓦工是一个很不错的选择。 搬瓦工产品中最知名的是它的CN2 GIA线路的VPS,具体什么是CN2 GIA线路,可以参见以下搬瓦工官方的介绍: 中国电信的CN2 GIA线路解决了一个非常具体的问题:进出中国的网络连接线路的服务质量。 如果你的目标受众是中国,你可能已经知道,为中国访客提供网络内容可能是一个挑战。例如,常规的IP传输通道在高峰期会出现拥堵(超载),丢包率达到30%或更多。 在这种丢包率下,几乎不可能向中国访客可靠地提供网络内容,举行网络会议,主持网络游戏,或连接到你在中国大陆的办公室或分支机构。换句话说,丢包会对你的业务产生严重影响。 在此不做过多赘述,中国电信为IP转接提供了3种选择。 选项1. AS4134(ChinaNet/163 Net)。 ChinaNet是大多数云计算运营商使用的最常见的往返中国的数据传输方式。这个网络有两个优点:它非常便宜,而且它的容量可以承受相当大的DDoS攻击,如果你需要持续的DDoS保护,这可以使它成为更好的选择。 缺点是,它很拥挤,尤其是在高峰时段。 选项2. AS4809 CN2 GT (全球转运) 最初这个网络是为了解决拥堵问题而推出的。它比AS4134/Chinanet要贵得多,但它应该能保证一个体面的服务水平。 不幸的是,自2019年以来,它已经变得和AS4134一样拥挤,尽管它的成本高得多。 公平地说,在2021年,我们看到,ChinaNet和CN2 GT网络都有明显的改善。 选项3. AS4809 CN2 GIA (全球互联网接入) CN2 GIA是向/从中国传输数据的最昂贵方式。但是,多年来,我们观察到这个网络的问题最少;它非常稳定。 这是你想用于网络会议、VOIP、服务网络内容、在线游戏等的网络,因为它将提供最好的稳定性。 这个网络有两个明显的缺点。 第一个缺点,正如我们提到的,是它的成本非常高。CN2 GIA IP传输价格可高达每兆120美元。因此,从实际情况来看,在一些市场上,你可以预期在这个网络上的1Gbps连接一个月会收到大约100,000美元的账单。 第二个缺点:容量非常有限。CN2 GIA IP转接是非常非常难得到的,即使是以高昂的价格。由于容量有限,CN2 GIA网络不能容忍DDoS攻击,在发生攻击时,我们不得不求助于IP无效路由。 在洛杉矶,我们在两个数据中心运行8个10Gbe CN2 GIA链接。结合我们与谷歌和其他洛杉矶本地运营商的直接对等,我们可以为您的企业提供一个坚如磐石的CN2 GIA VPS。你可以选择你喜欢的数据中心,也可以在任何时候在数据中心之间迁移现有的服务,而不会有任何数据损失。 CN2 GIA network for your VPS - BandwagonHost VPS ...

August 18, 2022 · 2 min · stayyoung