亮的MARK库

mark.liangliang.org.cn

GoogleTranslateIpCheck

扫描国内可用的谷歌翻译IP

如果都不能使用可以删除 ip.txt 文件调用远程IP或进入扫描模式

  • 使用参数
-s 可以直接进入扫描模式  -y 自动写入Host文件   -6 进入IPv6模式(如果支持IPv6推荐优先使用)
  • Windows 需要使用管理员权限运行

  • Mac和Linux运行 需要在终端中导航到软件目录然后执行

chmod +x GoogleTranslateIpCheck
sudo ./GoogleTranslateIpCheck

下载地址

Mac OS

https://github.com/Ponderfly/GoogleTranslateIpCheck/releases/download/1.6/GoogleTranslateIpCheck-mac-x64.zip

  • Window

https://github.com/Ponderfly/GoogleTranslateIpCheck/releases/download/1.6/GoogleTranslateIpCheck-win-x64.zip

常见问题

  1. 如果所有IP都超时,请检查是否开了代理
  2. Mac 中使用: 打开终端 输入cd 把解压后的文件夹拖进终端,点击回车 复制粘贴代码,点击回车
chmod +x GoogleTranslateIpCheck
sudo ./GoogleTranslateIpCheck
  1. Mac 提示来自不明身份: 系统偏好设置-->安全性与隐私—>选择允许

使用了阿里云服务器ECS上部署Docker的方法:

部署并使用Docker(CentOS 8)

前面几步都很顺利,使用阿里云镜像后解决了国外源连接超时的问题

但是在最后一步在安装docker时

[root@foo liang]# yum clean all
已加载插件:fastestmirror
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
正在清理软件源: base docker-ce-stable epel extras nodesource updates
Cleaning up list of fastest mirrors

[root@foo liang]# yum makecache
已加载插件:fastestmirror
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Determining fastest mirrors
 \* epel: mirrors.aliyun.com
事务概要
=======================================================================================================================
安装  2 软件包 (+3 依赖软件包)
升级 82 软件包
移除  2 软件包
总下载量:270 M
Is this ok [y/d/N]: y
Downloading packages:
No Presto metadata available for docker-ce-stable
No Presto metadata available for updates
(1/87): bind-libs-9.11.4-26.P2.el7_9.13.x86_64.rpm                        158 kB 00:00:00   
(2/87): bind-export-libs-9.11.4-26.P2.el7_9.13.x86_64.rpm                     1.1 MB 00:00:01   
(3/87): bind-license-9.11.4-26.P2.el7_9.13.noarch.rpm                       92 kB 00:00:00   
(4/87): bind-utils-9.11.4-26.P2.el7_9.13.x86_64.rpm                        262 kB 00:00:00   
(5/87): bind-libs-lite-9.11.4-26.P2.el7_9.13.x86_64.rpm                      1.1 MB 00:00:01   
(6/87): ca-certificates-2022.2.54-74.el7_9.noarch.rpm                       911 kB 00:00:00   
(7/87): brotli-1.0.9-10.el7.x86_64.rpm                              309 kB 00:00:00   
(8/87): diffutils-3.3-6.el7_9.x86_64.rpm                             322 kB 00:00:01   
(9/87): docker-buildx-plugin-0.10.4-1.el7.x86_64.rpm                       12 MB 00:00:13   
docker-ce-23.0.5-1.el7.x86_64. FAILED                      
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-23.0.5-1.el7.x86_64.rpm: [Errno -1] 软件包与预期下载的不符。建议:运行 yum --enablerepo=docker-ce-stable clean metadata
正在尝试其它镜像。

img

发现 docker-ce.repo 文件中,默认安装的 docker-ce-stable 中,enabled 值与其他仓库不一致,其他仓库均为 0,而 docker-ce-stable 中的enabled值为 1

vim /etc/yum.repos.d/docker-ce.repo

改为 0 故障排除

Linux 系统目录结构

登录系统后,在当前命令窗口下输入命令:

ls /

你会看到如下图所示:

img

树状目录结构:

img

以下是对这些目录的解释:

  • /bin: bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。

  • /boot: 这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。

  • /dev : dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。

  • /etc: etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。

  • /home: 用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。

  • /lib: lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。

  • /lost+found: 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

  • /media: linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。

  • /mnt: 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。

  • /opt: opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

  • /proc: proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。 这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
  • /root: 该目录为系统管理员,也称作超级权限者的用户主目录。

  • /sbin: s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。

  • /selinux: 这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

  • /srv: 该目录存放一些服务启动之后需要提取的数据。

  • /sys

    这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。

    sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。

    该文件系统是内核设备树的一个直观反映。

    当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

  • /tmp: tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。

  • /usr: usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。

  • /usr/bin: 系统用户使用的应用程序。

  • /usr/sbin: 超级用户使用的比较高级的管理程序和系统守护程序。

  • /usr/src: 内核源代码默认的放置目录。

  • /var: var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

  • /run: 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。

/etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。

/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。

值得提出的是 /bin/usr/bin 是给系统用户使用的指令(除 root 外的通用用户),而/sbin, /usr/sbin 则是给 root 使用的指令。

/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里。

等级保护三级和二级的差别

等级保护(是指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等级管理,对信息系统中发生的信息安全事件分等级响应、处置。

​ 等保根据系统重要程度和被破坏后的危害程度,划分为5个等级:一级(自主保护)、二级(指导保护)、三级(监督保护)、四级(强制保护)、五级(专控保护)。目前,我们接触最多的是等保二级和三级,对于这两个等级的等保最大的区别在于什么呢?

一.适用范围区别

等保二级适用于对社会没影响,比如只影响自己公司内部的系统。

等保三级适用于对社会有一定影响但是对国家网络安全没影响的系统。

二.防护能力区别

第二级安全保护能力需达到:

能够防护系统免受外来小型组织的、拥有少量资源的威胁源发起的恶意攻击、一般的自然灾难及其他的相应程度的威胁做造成的重要资源损害,能够发现重要的安全漏洞和安全事件,在遭受攻击损害后,具备在一段时间内恢复部分功能。

第三级安全保护能力需达到:

在统一安全策略下防护系统免受外来有组织的团体、拥有较为丰富资源的威胁源发起的恶意攻击、较为严重的自然灾难和其他相应程度的威胁所造成的主要资源损害,能够发现重要的安全漏洞和安全事件,在系统遭受攻击损害后,能较快恢复绝大部分功能。

三.测评周期区别

根据《信息安全等级保护管理办法》中的第十四规定,第三级信息系统应当每年至少进行一次等级测评;第二级不强制要求测评,但是要求定期找测评机构测评或进行系统自测。

第一:等保三级与二级的架构不同

等保三级的架构要求是冗余的,不能存在单链路;二级等保的架构是单链路。

img等保三级与等保二级拓扑图

第二:测评指标不同

等保三级比等保二级严格,测评指标等保三级比等保二级多76项,等保三级比等保二级费用高,安全通用要求等保三级共计211项,等保二级共计135项。

第三:测评时间要求不一样

一般二级等保是需要每两年进行一次等保测评,而三级信息系统要求每年至少开展一次测评。

第四:数据备份要求不同

等保三级备份要求异地实时备份;等保二级要求有本地备份机制。

第五:安全防护能力不同

等保三级技术要求多,比等保二级增加了堡垒机、web应用防火墙、漏洞扫描等安全设备。

第六:机房的物理环境不同

等保三级物理机房要求高,需要有电子门禁(必须是B级防火门)、视频监控、精密空调、ups设备、防静地板、电磁屏蔽柜及防水防潮、防盗窃的措施。等保二级的门禁,可以是吸附式的木门,有电子门禁即可;空调最次是普通家用空调。

https://github.com/zq1997/deepin-wine

首次使用时,你需要运行如下一条命令将移植仓库添加到系统中。

wget -O- https://deepin-wine.i-m.dev/setup.sh  sh

winecfg设置dpi没有作用 #158

>cd /usr/share/applications
>cat com.qq.weixin.deepin.desktop
#!/usr/bin/env xdg-open

[Desktop Entry]
Encoding=UTF-8
Type=Application
X-Created-By=Deepin WINE Team
Categories=chat;Network;
Icon=com.qq.weixin.deepin
Exec=env DEEPIN_WINE_SCALE=1.25 "/opt/apps/com.qq.weixin.deepin/files/run.sh"
Name=WeChat
Name[zh_CN]=微信
Comment=Tencent WeChat Client on Deepin Wine
StartupWMClass=wechat.exe
MimeType=

env DEEPIN_WINE_SCALE=1.25 就是缩放

GNOME/文件管理器始终显示文本文件路径

File Manager Actions — Configures programs to be launched when files are selected in Nautilus (written in C)

文件工具栏默认显示用于路径导航的按钮栏界面。若要用键盘输入路径,则需按Ctrl+l显示文本路径栏。

若要始终以文本路径栏显示,可以使用以下_gsettings_命令:

$ gsettings set org.gnome.nautilus.preferences always-use-location-entry true

注意: 改变此设置后将无法再显示按钮栏,只有把值设为false时才能同时使用两种路径栏。

太长不想读

来源:https://github.com/chaifeng/ufw-docker

请直接看解决 UFW 和 Docker 的问题

问题

UFW 是 Ubuntu 上很流行的一个 iptables 前端,可以非常方便的管理防火墙的规则。但是当安装了 Docker,UFW 无法管理 Docker 发布出来的端口了。

具体现象是:

  1. 在一个对外提供服务的服务器上启用了 UFW,并且默认阻止所有未被允许的传入连接。
  2. 运行了一个 Docker 容器,并且使用 -p 选项来把该容器的某个端口发布到服务器的所有 IP 地址上。比如:docker run -d --name httpd -p 0.0.0.0:8080:80 httpd:alpine 将会运行一个 httpd 服务,并且将容器的 80 端口发布到服务器的 8080 端口上。
  3. UFW 将不会阻止所有对 8080 端口访问的请求,用命令 ufw deny 8080 也无法阻止外部访问这个端口。

这个问题其实挺严重的,这意味着本来只是为了在内部提供服务的一个端口被暴露在公共网络上。

在网络上搜索 “ufw docker” 可以发现很多的讨论:

基本上可以找到的解决办法就是首先禁用 docker 的 iptables 功能,但这也意味着放弃了 docker 的网络管理功能,很典型的现象就是容器将无法访问外部网络。在有的文章中也提到了可以在 UFW 的配置文件中手工添加一条规则,比如 -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE。但这也只是允许了 172.17.0.0/16 这个网络。如果有了新增的网络,我们也必须手工再为新增的网络添加这样类似的 iptables 规则。

期望的目标

目前网络上的解决方案都非常类似,而且也不优雅,我希望一个新的解决方案可以:

  1. 不要禁用 Docker 的 iptables,像往常一样由 Docker 来管理自己的网络。这样有任何新增的 Docker 网络时都无需手工维护 iptables 规则,也避免了在 Docker 中禁用 iptables 之后可能带来的副作用。
  2. 公共网络不可以访问 Docker 发布出来的端口,即使是使用类似 -p 0.0.0.0:8080:80 的选项把端口发布在所有的 IP 地址上。容器之间、内部网络之间都可以正常互相访问,只有公共网络不可以访问。 虽然可以让 Docker 把容器的某一个端口映射到服务器的私有 IP 地址上,这样公共网络上将不会访问到这个端口。但是这个服务器可能有多个私有 IP 地址,这些私有 IP 地址可能也会发生变化。
  3. 可以很方便的允许公共网络直接访问某个容器的端口,而无需额外的软件和配置。就像是用 ufw allow 8080 这样允许外部访问 8080 端口,然后用 ufw delete allow 8080 就不再允许外部访问。

如何做?

撤销原先的修改

如果已经按照目前网络上搜索到解决方案修改过了,请先修改回来,包括:

  1. 启用 Docker 的 iptables 功能,删除所有类似 --iptables=false 的修改,包括 /etc/docker/daemon.json 配置文件。
  2. UFW 的默认 FORWARD 规则改回默认的 DROP,而非 ACCEPT
  3. 删除 UFW 配置文件 /etc/ufw/after.rules 中与 Docker 网络相关的规则。
  4. 如果修改了 Docker 相关的配置文件,重启 Docker。稍后还要修改 UFW 的配置,可以一并重启。

解决 UFW 和 Docker 的问题

目前新的解决方案只需要修改一个 UFW 配置文件即可,Docker 的所有配置和选项都保持默认。

修改 UFW 的配置文件 /etc/ufw/after.rules,在最后添加上如下规则:

# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP

COMMIT
# END UFW AND DOCKER

然后重启 UFW,sudo systemctl restart ufw。现在外部就已经无法访问 Docker 发布出来的任何端口了,但是容器内部以及私有网络地址上可以正常互相访问,而且容器也可以正常访问外部的网络。可能由于某些未知原因,重启 UFW 之后规则也无法生效,请重启服务器。

如果希望允许外部网络访问 Docker 容器提供的服务,比如有一个容器的服务端口是 80。那就可以用以下命令来允许外部网络访问这个服务:

ufw route allow proto tcp from any to any port 80

这个命令会允许外部网络访问所有用 Docker 发布出来的并且内部服务端口为 80 的所有服务。

请注意,这个端口 80 是容器的端口,而非使用 -p 0.0.0.0:8080:80 选项发布在服务器上的 8080 端口。

如果有多个容器的服务端口为 80,但只希望外部网络访问某个特定的容器。比如该容器的私有地址为 172.17.0.2,就用类似下面的命令:

ufw route allow proto tcp from any to 172.17.0.2 port 80

如果一个容器的服务是 UDP 协议,假如是 DNS 服务,可以用下面的命令来允许外部网络访问所有发布出来的 DNS 服务:

ufw route allow proto udp from any to any port 53

同样的,如果只针对一个特定的容器,比如 IP 地址为 172.17.0.2

ufw route allow proto udp from any to 172.17.0.2 port 53

解释

在新增的这段规则中,下面这段规则是为了让私有网络地址可以互相访问。通常情况下,私有网络是比公共网络更信任的。

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

下面的规则是为了可以用 UFW 来管理外部网络是否允许访问 Docker 容器提供的服务,这样我们就可以在一个地方来管理防火墙的规则了。

-A DOCKER-USER -j ufw-user-forward

例如,我们要阻止一个 IP 地址为 172.17.0.9 的容器内的所有对外连接,也就是阻止该容器访问外部网络,使用下列命令

ufw route deny from 172.17.0.9 to any

下面的规则阻止了所有外部网络发起的连接请求,但是允许内部网络访问外部网络。对于 TCP 协议,是阻止了从外部网络主动建立 TCP 连接。对于 UDP,是阻止了所有小余端口 32767 的访问。为什么是这个端口的?由于 UDP 协议是无状态的,无法像 TCP 那样阻止发起建立连接请求的握手信号。在 GNU/Linux 上查看文件 /proc/sys/net/ipv4/ip_local_port_range 可以看到发出 TCP/UDP 数据后,本地源端口的范围,默认为 32768 60999。当从一个运行的容器对外访问一个 UDP 协议的服务时,本地端口将会从这个端口范围里面随机选择一个,服务器将会把数据返回到这个随机端口上。所以,我们可以假定所有容器内部的 UDP 协议的监听端口都小余 32768,不允许外部网络主动连接小余 32768 的 UDP 端口。

-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

如果一个容器在接受数据的时候,端口号没有遵循操作系统的设定,也就是说最小端口号要小余 32768。比如运行了一个 Dnsmasq 的容器,Dnsmasq 用于接受数据的最小端口号默认是 1024。那可以用下面的命令来允许 Dnsmasq 这个容器使用一个更大的端口范围来接受数据。

ufw route allow proto udp from any port 53 to any port 1024:65535

因为 DNS 是一个非常常见的服务,所以已经有一条规则用于允许使用一个更大的端口范围来接受 DNS 数据包

选择 ufw-user-forward 而不是 ufw-user-input 的原因

使用 ufw-user-input

优点:

使用的 UFW 命令比较简单,也比较容易理解,而且也支持老版本的 Ubuntu

比如,允许公众网络访问一个已经发布出来的容器端口 8080,使用命令:

ufw allow 8080

缺点:

不仅仅是暴露了已经发布的容器端口,也暴露了主机上的端口。

比如,如果在主机上运行了一个端口为 8080 的服务。命令 ufw allow 8080 允许了公共网络访问这个服务,也允许了访问所有已经发布的容器端口为 8080 的服务。但是我们可能只是希望保留主机上的这个服务,或者是运行在容器里面的服务,而不是两个同时暴露。

为了避免这个问题,我们可能需要使用类似下面的命令来管理已经发布的容器端口:

ufw allow proto tcp from any to 172.16.0.3 port 8080

使用 ufw-user-forward

优点:

不会因为同一条命令而同时暴露主机和容器里面的服务。

比如,如果我们希望暴露所有容器端口为 8080 的服务,使用下面的命令:

ufw route allow 8080

现在公共网络可以访问所有容器端口为 8080 的已经发布的服务,但是运行在主机上的 8080 服务仍然不会被公开。如果我们希望公开主机上的 8080 端口,可以执行下面的命令:

ufw allow 8080

缺点:

不支持老版本的 Ubuntu,而且命令的使用上可能也会比较复杂。

结论

如果我们正在使用老版本的 Ubuntu,我们可以使用 ufw-user-input。但是要小心避免把不该暴露的服务暴露出去。

如果正在使用支持 ufw route 命令的新版本的 Ubuntu,我们最好使用 ufw-user-forward,并且使用 ufw route 来管理与容器相关的防火墙规则。

ufw-docker 工具

现在这个脚本也支持 Docker Swarm。

安装

下载 ufw-docker 脚本

sudo wget -O /usr/local/bin/ufw-docker \
  https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
chmod +x /usr/local/bin/ufw-docker

使用下列命令来修改 ufw 的 after.rules 文件

ufw-docker install

这个命令做了以下事情:

  • 备份文件 /etc/ufw/after.rules
  • 把 UFW 和 Docker 的相关规则添加到文件 after.rules 的末尾

为 Docker Swarm 环境安装

仅仅可以在管理节点上使用 ufw-docker 这个脚本来管理防火墙规则。

  • 在所有的节点上修改 after.rules 这个文件,包括管理节点和工作节点
  • 在管理节点上部署这个脚本

运行在 Docker Swarm 模式下,这个脚本将会创建一个全局服务 ufw-docker-agent。这个镜像 chaifeng/ufw-docker-agent 是由本项目自动构建的。

使用方法

显示帮助

ufw-docker help

检查 UFW 配置文件中防火墙规则的安装

ufw-docker check

更新 UFW 的配置文件,添加必要的防火墙规则

ufw-docker install

显示当前防火墙允许的转发规则

ufw-docker status

列出所有和容器 httpd 相关的防火墙规则

ufw-docker list httpd

暴露容器 httpd80 端口

ufw-docker allow httpd 80

暴露容器 httpd443 端口,且协议为 tcp

ufw-docker allow httpd 443/tcp

如果容器 httpd 绑定到多个网络上,暴露其 443 端口,协议为 tcp,网络为 foobar-external-network

ufw-docker allow httpd 443/tcp foobar-external-network

把容器 httpd 的所有映射端口都暴露出来

ufw-docker allow httpd

删除所有和容器 httpd 相关的防火墙规则

ufw-docker delete allow httpd

删除容器 httpdtcp 端口 443 的规则

ufw-docker delete allow httpd 443/tcp

暴露服务 web80 端口

docker service create --name web --publish 8080:80 httpd:alpine

ufw-docker service allow web 80
# 或者
ufw-docker service allow web 80/tcp

删除与服务 web 相关的规则

ufw-docker service delete allow web

试试

我们使用 Vagrant 来创建一个本地的测试环境。

运行下面的命令来创建 1 个 master 节点和 2 个 workder 节点

vagrant up

登录到 master 节点

vagrant ssh master

登录后,创建 web 服务

docker service create --name web --publish 8080:80 httpd:alpine

我们应该无法从我们的主机上访问这个 web 服务

curl -v http://192.168.56.131:8080

在 master 节点上,运行下面的命令来允许公共访问 web 服务端 80 端口。

sudo ufw-docker service allow web 80

现在我们可以在我们的主机上访问这个 web 服务了

curl "http://192.168.56.13{0,1,2}:8080"

讨论

Debian Docker 安装

Docker 支持以下的 Debian 版本:

  • Buster 10
  • Stretch 9 (stable) / Raspbian Stretch

Docker Engine-Community 在 x86_64(或 amd64 )armhf,和 arm64 体系结构上受支持。


自动安装

  • 使用官方安装脚本

安装命令如下:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

安装 Docker Engine-Community

更新 apt 包索引:

$ sudo apt-get update

安装最新版本的 Docker Engine-Community 和 containerd ,或者转到下一步安装特定版本:

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

建立 docker 用户组:

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组:

$ sudo groupadd docker

将当前用户加入 docker 组:

$ sudo usermod -aG docker $USER

卸载 docker

删除安装包:

sudo apt-get purge docker-ce

删除镜像、容器、配置文件等内容:

sudo rm -rf /var/lib/docker

拉取最新版的 debian 镜像

$ docker pull debian

或者:

$ docker pull debian:latest

后台运行

在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。

$ docker run -itd --name debian debian

启动容器的时候加上“–add-host”把hosts配置上

docker run --add-host=dkdebian:10.180.8.1 -name debian debian

进入容器

docker exec -it debian /bin/bash

改主机名

启动docker容器后,进入容器时发现对应的主机名是一段编码(默认就是container ID前缀),在容器维护时记不住是哪个机器,容易搞错,所以干脆直接改掉,见名知义。

不能直接在容器内修改/etc/hostname文件,因为容器stop/restart后会重置,导致配置丢失,并且容器中服务器也没法reboot无法立即生效,所以需要从根本上解决问题。

具体操作有如下几种:

在docker run的时候,指定hostname参数即可,这个参数会直接将对应主机名写入机器的/etc/hostname文件中:

docker run -itd --network $netname --hostname $host --name $name yourimage

也可以增加hostname:使用add-host=$hostname:$ip参数即可,这个参数会在容器内的/etc/hostname文件中追加一行映射:

docker run -itd --network $netname --add-host=$host:$ip --name $name yourimage

如果是通过docker-compose方式,则需要通过extra_hosts参数:

# docker-compose.yml
extra_hosts:
 - "host1:172.18.0.3"
 - "host2:172.18.0.4"

vi复制一行

复制一行数据数据: 把光标放到要复制的行行首,然后按两下yy字母键; 然后把光标放到要复制到的地方去,按键盘的p字母键

0%