自学内容网 自学内容网

network学习

Dockerfile

  1. 基础镜像是polar-base,架构为x86_64

  2. apt-get update命令,用于更新软件包列表,&& \表示继续下一行命令。

  3. 安装了一系列软件包,--force-yes参数用于强制安装软件包,-y参数表示自动回答"yes"。

  4. apt-get clean清理了APT缓存

  5. rm -rf /var/lib/apt/lists/*:删除了APT软件包列表,以减小镜像大小

  6. COPY __DIRECTORY_NAME__ /__DIRECTORY_NAME__: 这一行将__DIRECTORY_NAME__目录复制到镜像的/__DIRECTORY_NAME__目录下。

  7. COPY start.sh /start.sh: 这一行将start.sh文件复制到镜像的根目录下。

  8. 其余的COPY命令类似地将其他文件复制到镜像中的不同目录。

  9. ENTRYPOINT ["/__DIRECTORY_NAME__/jsrun.sh"]: 这一行指定了容器启动时要运行的命令或脚本为/__DIRECTORY_NAME__/jsrun.sh

【敲重点】在基于x86_64架构的polar-base镜像上安装软件包,并将一些文件复制到镜像中,最后设置了容器的入口点为jsrun.sh脚本。

jsrun.sh脚本

在这里插入图片描述在这里插入图片描述

  1. max_pid=$(ps -eo pid= | sort -nr | head -n 1): 这一行通过ps命令列出当前所有进程的PID,然后通过sort -nr按照数字大小逆序排序,最后通过head -n 1获取排序后的第一个PID,即最大的PID。

  2. max_pid=$(($max_pid + 100)): 这一行将最大PID增加100。

  3. for i in $(seq 1 $max_pid); do ls >/dev/null 2>&1; done: 这个循环会执行ls命令,将其输出重定向到/dev/null,以忽略ls命令的输出。循环次数为$max_pid次,即之前获取的最大PID加100。2>&1表示将标准错误输出重定向到标准输出,这样任何错误信息也会被丢弃。

    • 如果$NETWORK_MODE的值等于3或6,则OUT_IFNAME_LIKE被设置为"ipfsbit"。
    • 如果$NETWORK_MODE的值等于4或5,则OUT_IFNAME_LIKE被设置为"ppp"。
  4. WORKING_DIRECTORY=$(dirname "$0"): 这行代码使用dirname "$0"获取当前脚本文件的目录路径,并将其赋值给WORKING_DIRECTORY变量。$0代表当前脚本的文件名。

  5. cd $WORKING_DIRECTORY: 这行代码将当前工作目录切换到WORKING_DIRECTORY所指定的目录,即当前脚本文件所在的目录。

  6. export PATH=$PATH:$WORKING_DIRECTORY: 这行代码将当前目录添加到系统的PATH环境变量中,以便系统可以在搜索可执行文件时包含当前目录。通过将当前工作目录添加到PATH中,您可以直接在脚本中执行当前目录下的可执行文件,而无需指定完整路径。
    pre_start

  7. JS_BACKUP_DIR=/storage/$(echo $IMAGE_VERSION | cut -d':' -f2 | cut -d'-' -f1): 这一行设置了一个变量JS_BACKUP_DIR,根据$IMAGE_VERSION的值提取特定部分并拼接成一个目录路径。

  8. if [[ -f "${JS_BACKUP_DIR}/cache-node" && -f "${JS_BACKUP_DIR}/libkcg.so" ]]: 这个条件语句检查是否存在${JS_BACKUP_DIR}/cache-node${JS_BACKUP_DIR}/libkcg.so两个文件。

  9. cp -rf ${JS_BACKUP_DIR}/* /mc-spider-pcdn: 如果上述文件都存在,则将${JS_BACKUP_DIR}目录下的所有内容复制到/mc-spider-pcdn目录中。

  10. else: 如果上述文件不存在,则执行以下操作:

    • 检查/mc-spider-pcdn/cache-node/mc-spider-pcdn/libkcg.so文件是否存在。
    • 如果它们存在,则执行true,表示不执行任何操作。
    • 如果它们不存在,则执行以下操作:
      • 根据条件选择将/mc-spider-pcdn/spider-pcdn-ipv4/mc-spider-pcdn/spider-pcdn-ipv6目录下的内容复制到/mc-spider-pcdn目录中。
      • 删除/mc-spider-pcdn/spider-pcdn-ipv4/mc-spider-pcdn/spider-pcdn-ipv6目录。
    • 创建${JS_BACKUP_DIR}目录,并将/mc-spider-pcdn/cache-node/mc-spider-pcdn/libkcg.so文件复制到该目录中。
  11. chmod +x /mc-spider-pcdn/cache-node: 最后一行将/mc-spider-pcdn/cache-node文件设置为可执行权限。

start_js_one

  1. if [[ ! -z "$OUT_IFNAME_LIKE" ]]: 这个条件语句检查变量$OUT_IFNAME_LIKE是否为空。如果不为空,则执行以下操作:

    • 使用ip link命令获取网络接口信息,然后通过一系列的greptrawkxargs命令筛选出符合条件的网卡名称,并将结果存储到OUT_IFNAME_ARRAY数组中。
  2. else: 如果$OUT_IFNAME_LIKE为空,则执行以下操作:

    • 使用ip route show default命令获取默认路由信息,然后通过一系列的grepawkxargs命令筛选出默认网络接口的名称,并将结果存储到OUT_IFNAME_ARRAY数组中。
  3. local OUT_IFNAME_NUM=${#OUT_IFNAME_ARRAY[@]}: 这行代码获取OUT_IFNAME_ARRAY数组的长度,即网络接口名称的数量,并将其存储在OUT_IFNAME_NUM变量中。

  4. local index=$((DOCKER_INDEX-1)): 这行代码将DOCKER_INDEX减去1的结果存储在index变量中。

  5. local nic=${OUT_IFNAME_ARRAY[$((${DOCKER_INDEX}%${OUT_IFNAME_NUM}))]}: 这行代码计算出要使用的网络接口名称,通过取余数的方式从OUT_IFNAME_ARRAY数组中选择一个网络接口名称,并将其存储在nic变量中。

  6. export IFNAME=$nic: 将选择的网络接口名称存储在IFNAME环境变量中,以便后续使用。

  7. spider-pcdn.sh >/dev/null 2>&1 &: 最后一行启动一个名为spider-pcdn.sh的脚本,并将其输出重定向到/dev/null,以便在后台运行,不显示任何输出。

【敲重点】定义参数+文件备份,目录复制+选择网络接口名称+启动spider-pcdn.sh脚本
在脚本中引入另一个名为core.sh的脚本文件,以扩展当前脚本的功能。
调用了一个名为pre_start的函数,文件备份和目录内容复制等操作。
如果$TOGETHER等于1,则调用start_js_one函数(根据条件选择网络接口名称)并启动spider-pcdn.sh脚本。
如果$TOGETHER不等于1,调用start_js函数,直接启动spider-pcdn.sh脚本在后台运行。
while : do sleep 3600 done: 每3600秒(1小时)执行一次sleep命令,使脚本保持运行状态。

spider-pcdn.sh

  • echo $$ 是一个特殊变量,表示当前进程的进程号(PID)。在这里,echo $ 会输出当前进程的 PID。

  • > /tmp/mc-spider-pcdn.pid> 符号用于将命令的输出重定向到指定文件中。在这里,echo $ 的输出(当前进程的 PID)会被重定向并写入一个名为 /tmp/mc-spider-pcdn.pid 的文件中。
    这行代码是一个 Bash 脚本中的条件语句,用于检查变量 $guid 是否为空(即长度为0)。具体解释如下:

  • if [[ -z "$guid" ]]; then:这是一个条件语句的开始,其中 [[ -z "$guid" ]] 是条件判断部分,-z 表示检查变量是否为空。$guid 是要检查的变量。

  • march=$(arch | tr ‘a-z’ ‘A-Z’ | sed ‘s/_64//g’) 系统架构信息

    • arch 命令用于显示当前系统架构信息。
    • tr 'a-z' 'A-Z'arch 命令输出的小写字母转换为大写字母。
    • sed 's/_64//g' 用于删除字符串中所有的 _64 子串。
  • mkdir -p $spider_pcdn_path 指定要创建的目录路径

    • mkdir -p 是一个常见的命令,用于创建目录。-p 选项表示递归创建目录,即如果上级目录不存在也会一并创建。
  • upnpc -e $description -a $local_ip $js_port $js_port tcp || upnpc -e $description -n $local_ip $js_port $js_port tcp
    尝试添加一个端口映射规则,如果添加失败(可能是因为规则已存在),则强制添加一个新的端口映射规则

    • -e $description:这里 -e 选项用于指定规则的描述信息,$description 是描述信息的变量。
    • -a 表示添加端口映射规则。
    • $local_ip 是本地IP地址。
    • $js_port 是要映射的本地端口。
    • tcp 表示映射的协议为 TCP。
  • kill -s USR1 PID
    kill 命令用于向指定的进程发送信号。-s USR1 参数指定了要发送的信号为 USR1,这是一个用户自定义的信号,可以被接收进程用来执行特定的操作。

  • trap ‘restart’ SIGUSR1 当接收到 SIGUSR1 信号时,执行后面的 'restart' 部分

  • NAT=$(cat /tmp/nat-tun.log | jq -r ‘.nat’)

    • 这行代码从 /tmp/nat-tun.log 文件中读取内容,然后使用 jq 工具解析 JSON 格式的数据。
    • jq -r '.nat' 的作用是从 JSON 数据中提取 nat 字段的值,并使用 -r 标志以原始文本形式输出,而不是带引号的字符串。
  • ip=$(ip addr show $device | grep -v “inet6” | grep “inet” | awk ‘{print $2}’ | cut -d’/’ -f1) 提取出 IPv4 地址

    • ip addr show $device:这部分命令使用 ip addr show 命令显示指定设备($device)的网络配置信息。这会列出该设备的所有网络配置,包括 IPv4 和 IPv6 地址。

    • grep -v "inet6":这一步使用 grep 命令过滤掉包含 “inet6” 的行,即过滤掉 IPv6 地址的行,只保留包含 IPv4 地址的行。

    • grep "inet":接着使用 grep 命令筛选出包含 “inet” 的行,即只保留包含 IPv4 地址的行。

    • awk '{print $2}':使用 awk 命令提取每一行中的第二列,即 IPv4 地址加上掩码位数(例如,192.168.1.1/24)。

    • cut -d'/' -f1:最后使用 cut 命令以 / 为分隔符,只保留每行中的第一部分,即去掉掩码位数,只留下纯粹的 IPv4 地址。

  • ip route get 223.5.5.5 | head -n 1 | grep -o "dev \w+.?\w+ " | awk ‘{print $2}’ 网络接口名称

  1. ip route get 223.5.5.5:这部分命令使用 ip route get 命令来获取到目标地址 223.5.5.5 的路由信息。

  2. head -n 1:通过 head -n 1 命令只保留输出的第一行,即路由信息中与目标地址最相关的那一行。

  3. grep -o "dev \w\+\.\?\w\+ ":使用 grep -o 命令查找匹配模式 "dev \w\+\.\?\w\+ " 的部分,这个模式匹配了以 "dev " 开头的网络接口名称。其中:

    • dev 匹配 "dev " 字符串。
    • \w\+ 匹配一个或多个字母、数字或下划线。
    • \.\? 匹配零个或一个点号。
    • \w\+ 再次匹配一个或多个字母、数字或下划线。
    • 最后的空格确保匹配到整个 "dev interface_name " 格式。
  • isp=$(curl dcs.linkfog.cn/api/v2/network/ISP),使用 curl 命令从指定的 URL获取数据
  • SPEED=$(echo yes | /usr/bin/speedtest --accept-license --progress=no -f json --output-header -b | jq ‘.upload .bandwidth’ 2>/dev/null) 执行一个speedtest测试,提取上传带宽信息
    echo yes | /usr/bin/speedtest --accept-license --progress=no -f json --output-header -b: 这部分命令执行了一个speedtest测试,使用了一些参数:
    • echo yes:这是将"yes"字符串输出的一种方式,可能是用于确认或者接受某些询问。
    • /usr/bin/speedtest:这是执行speedtest测试的可执行文件的路径。
    • --accept-license:这个参数可能是用于接受许可协议。
    • --progress=no:这个参数可能是用于关闭进度显示。
    • -f json:这个参数指定输出格式为JSON。
    • --output-header -b:这些参数可能是用于输出头信息和带宽信息。
      【敲重点】获取参数值

service-scripts

在这里插入图片描述

  • FORMAT = “[%(filename)s:%(lineno)s - %(funcName)20s() - %(asctime)-15s ] %(message)s”
    这行代码定义了一个日志格式字符串,通常用于配置日志记录器(logger)的输出格式。让我解释一下这个格式字符串中的各个部分:

    • %(filename)s:日志消息所在的文件名。
    • %(lineno)s:日志消息所在的行号。
    • %(funcName)20s:日志消息所在的函数名,宽度为20个字符。
    • %(asctime)-15s:日志记录的时间,左对齐,宽度为15个字符。
    • %(message)s:日志消息的内容。
  • mount,用于挂载文件系统到指定的挂载点。

  • umount ,卸载挂载点

  • modprobe: 加载内核模块

  • iptables -t raw -D OUTPUT -m cgroup --cgroup {classid} -j ACCEPT这条命令的作用是从IPv4的raw表中删除一个输出规则。具体解释如下:

    • iptables: 这是用于配置IPv4防火墙规则的命令。
    • -t raw: 指定要操作的表为raw表,raw表是iptables中的一个特殊表,用于在数据包进入网络协议栈之前进行处理。
    • -D OUTPUT: 表示删除输出链中的规则。
    • -m cgroup --cgroup {classid}: 使用cgroup模块,指定要匹配的cgroup类别的classid。
    • -j ACCEPT: 表示如果数据包符合规则,则接受该数据包。

因此,这条命令的目的是从IPv4的raw表中删除一个针对特定cgroup类别的输出规则,允许匹配到该规则的数据包通过防火墙。

  • ip6tables -t raw -L -v -n >/dev/null 2>&1

  • ip6tables: 这是用于配置IPv6防火墙规则的命令。

    • -t raw: 指定要操作的表为raw表,raw表是iptables中的一个特殊表,用于在数据包进入网络协议栈之前进行处理。
    • -L: 列出规则。
    • -v: 显示详细的信息,包括数据包和字节计数。
    • -n: 显示数值格式的IP地址和端口号。
    • >/dev/null: 将标准输出重定向到/dev/null,即丢弃输出。
    • 2>&1: 将标准错误输出重定向到标准输出,也就是将错误信息也重定向到/dev/null,这样错误信息也会被丢弃。

总之,这条命令的作用是在IPv6的raw表中列出所有规则,但将输出和错误信息都重定向到/dev/null,以实现静默执行并丢弃输出。

  • ip6tables -t mangle -D OUTPUT ! -o lo -m cgroup --cgroup {classid} -j ACCEPT
    这条命令的作用是从IPv6的mangle表中删除一个输出规则。具体解释如下:

    • ip6tables: 这是用于配置IPv6防火墙规则的命令。
    • -t mangle: 指定要操作的表为mangle表,mangle表用于修改数据包的特定字段。
    • -D OUTPUT: 表示删除输出链中的规则。
    • ! -o lo: 表示匹配不是发往本地回环接口(lo)的数据包。
    • -m cgroup --cgroup {classid}: 使用cgroup模块,指定要匹配的cgroup类别的classid。
    • -j ACCEPT: 表示如果数据包符合规则,则接受该数据包。

因此,这条命令的目的是从IPv6的mangle表中删除一个针对特定cgroup类别的非本地回环接口的输出规则,允许匹配到该规则的数据包通过防火墙。


原文地址:https://blog.csdn.net/qq_51636863/article/details/137506146

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!