2023年10月

netplan是什么?

Netplan is a utility for easily configuring networking on a linux system. You simply create a YAML description of the required network interfaces and what each should be configured to do. From this description Netplan will generate all the necessary configuration for your chosen renderer tool.

在 Ubuntu 中,Netplan 是用于配置网络接口的工具。它使用 YAML 格式的配置文件来定义网络设置。以下是一些在 Ubuntu 上使用 Netplan 配置网络的示例方案:

netplan的工作原理是什么?

2023-10-31T07:32:36.png

Netplan reads network configuration from /etc/netplan/*.yaml which are written by administrators, installers, cloud image instantiations, or other OS deployments. During early boot, Netplan generates backend specific configuration files in /run to hand off control of devices to a particular networking daemon.

Netplan currently works with these supported renderers

netplan与networkmanager之间的关系是什么?

Netplan 和 NetworkManager 都是用于配置网络的工具,但它们在配置的方式和工作原理上有一些区别。

Netplan 是一个用于配置网络的命令行工具,它使用 YAML 格式的配置文件来描述网络配置。您可以创建一个 Netplan 配置文件(通常位于 /etc/netplan/ 目录下),然后使用 netplan apply 命令将配置应用到系统中。Netplan 会将配置转换为底层网络管理器(如 systemd-networkd 或 NetworkManager)所需的配置文件。Netplan 的目标是提供一个统一的网络配置接口,无论底层使用的是哪个网络管理器。

NetworkManager 是一个网络管理服务,提供了图形化和命令行界面,用于配置网络连接。它可以管理以太网、Wi-Fi、VPN、移动宽带等各种类型的网络连接。NetworkManager 会监视系统中的网络设备和连接,并根据配置文件或用户的操作来进行网络配置。它可以与不同的网络管理器(如 systemd-networkd、dhclient 等)进行交互,以实现网络连接的配置和管理。

在 Ubuntu 中,默认情况下,Netplan 与 NetworkManager 是一起使用的。Netplan 会生成 NetworkManager 的配置文件,然后 NetworkManager 会根据这些配置文件来管理网络连接。您可以使用 Netplan 来配置一些基本的网络设置,如 IP 地址、网关和 DNS 服务器。对于更复杂的网络配置(如 Wi-Fi、VPN 等),您可以使用 NetworkManager 的工具来进行配置。

总结起来,Netplan 提供了一个统一的网络配置接口,用于生成底层网络管理器所需的配置文件,而 NetworkManager 则是一个网络管理服务,负责实际的网络连接管理和配置。它们可以一起使用,以便在 Ubuntu 中进行灵活且全面的网络配置。

常用配置举例

1. 配置静态 IP 地址

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.1.100/24]
      routes: 
        - to: defaulat
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

上述配置将 eth0 网络接口配置为静态 IP 地址为 192.168.1.100/24,网关为 192.168.1.1,DNS 服务器为 Google 的 DNS 服务器 8.8.8.88.8.4.4

2. 配置 DHCP

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true

上述配置将 eth0 网络接口配置为使用 DHCP 获取 IP 地址。

3. 配置桥接网络

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
  bridges:
    br0:
      interfaces: [eth0]
      addresses: [192.168.1.100/24]
      routes: 
        - to: defaulat
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

上述配置将 eth0 网络接口桥接到 br0,并为 br0 分配静态 IP 地址、网关和 DNS 服务器。

4. 配置子接口

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
  vlans:
    vlan10:
      id: 10
      link: eth0
      addresses: [192.168.1.10/24]
      routes: 
        - to: defaulat
          via: 192.168.1.1
    vlan20:
      id: 20
      link: eth0
      addresses: [192.168.2.10/24]
      routes: 
        - to: defaulat
          via: 192.168.2.1

上述配置示例中,除了 vlan10 子接口外,还添加了一个名为 vlan20 的子接口。vlan10 的 VLAN ID 是 10,而 vlan20 的 VLAN ID 是 20。每个子接口都有自己的 IP 地址和网关。

5. 配置第二地址

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.1.100/24, 10.0.0.100/24]
      routes: 
        - to: defaulat
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

上述配置示例中,eth0 网络接口配置了两个 IP 地址:192.168.1.100/24 和 10.0.0.100/24。这样,eth0 接口将拥有两个 IP 地址。

6. 配置环回地址

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
  lo:
    addresses: [127.0.0.1/8]

7. 配置明细路由

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
      routes:
        - to: 192.168.2.0/24
          via: 192.168.1.1
        - to: 10.0.0.0/24
          via: 192.168.1.1

上述配置示例中,eth0 接口配置了两个明细路由。第一个路由是将流量发送到目标网络 192.168.2.0/24,通过网关 192.168.1.1。第二个路由是将流量发送到目标网络 10.0.0.0/24,同样通过网关 192.168.1.1。

8.配置ipv6

使用 DHCPv6:如果您的网络支持 IPv6,并且您想通过 DHCPv6 获取 IPv6 地址,可以使用 dhcp6: true 配置。例如:

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp6: true

上述配置示例中,eth0 接口启用了 DHCPv6。

9.配置mac地址

配置网络设备的 MAC 地址:如果您需要手动指定网络设备的 MAC 地址,可以使用 match 字段和 macaddress 子字段。例如:

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      match:
        macaddress: aa:bb:cc:dd:ee:ff
      dhcp4: true

上述配置示例中,eth0 接口配置了 MAC 地址为 aa:bb:cc:dd:ee:ff。

10. 连接openvpn服务器

是的,Netplan 支持配置与 OpenVPN 的连接。您可以使用 Netplan 配置文件来设置 OpenVPN 客户端连接。下面是一个示例:

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
  vpn:
    - type: openvpn
      config: /path/to/openvpn/client.conf

在上述配置示例中,eth0 接口配置为使用 DHCP 获取 IPv4 地址。然后,通过 vpn 字段指定了一个 OpenVPN 连接,其中 type 设置为 openvpn,并指定了 OpenVPN 客户端配置文件的路径。

这些只是 Netplan 的一些示例配置方案。您可以根据您的网络需求和环境进行相应的配置。完成配置后,使用 sudo netplan apply 命令来应用配置更改。

请注意,具体的配置方案可能会因您的网络环境和要求而有所不同。建议在进行任何网络配置更改之前备份您的原始配置文件,并确保您对网络配置有一定的了解。

希望这些示例能帮助到您!如果您有任何进一步的问题,请随时提问。

在安装harbor镜像程序的过程中,准备好了文件,然后使用docker-compose命令进行启动。
通过docker login harbor.sddts.cn报错,然后使用docker-compose ps文件看到registry镜像处在Restarting状态。

使用docker-compose logs -f查看日志,看到registry容器提示exit 2异常。
2023-10-31T05:37:17.png

通过查看registry容器日志/data/harbor/logs/registry.log看到,该容器无法访问/etc/registry/passwd。
通过查看docker-compose.yml配置文件,可以看到docker-compose.yml所在目录,也就是/root/harbor/下面的common/config/registry目录会映射被容器目录/etc/registry/。
2023-10-31T05:39:17.png

通过查看/root/harbor/common/config/registry目录,看到passwd属于root:root用户/用户组,且访问权限是640。
2023-10-31T05:40:21.png

通过命令chown 10000:10000 passwd修改其所属用户/用户组。问题解决
2023-10-31T05:49:18.png

centos

openeuler

yum install -y docker docker-compose
cat <<'EOF'>/etc/docker/daemon.json
{
  "debug": false,
  "experimental": true,
    "registry-mirrors": [
        "https://docker.nju.edu.cn",
        "https://dockerproxy.com",
        "https://docker.io",
    ],
  "log-opts":{"max-size":"100m","max-file":"1"}
}
EOF

docker-compose文件

version: '3'
services:
  registry:
    image: registry:2
    ports:
      - 172.31.20.2:5000:5000
    volumes:
      - ./data:/var/lib/registry
    networks:
      mynetwork:
        ipv4_address: 172.31.20.2

networks:
  mynetwork:
    ipam:
      config:
        - subnet: 172.31.20.0/24

客户端文件

{
  "registry-mirrors": ["http://localhost:5000"],
  "insecure-registries": ["localhost:5000"]
}

反代https站点报ssl_do_handshake()错误

2023-10-30T01:59:50.png

SSL_do_handshake() failed (SSL: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:SSL alert number 40) while SSL handshaking to upstream。

问题解析:SSL握手错误。

解决办法:增加proxy_ssl_server_name on;配置

413 Request Entity Too Large

当您在使用 Nginx 时遇到 "413 Request Entity Too Large" 错误时,这通常表示客户端请求的实体太大,超过了 Nginx 的默认限制。

为了解决这个问题,您可以尝试以下几种方法:

  1. 修改 Nginx 配置文件:打开 Nginx 的配置文件(通常是 /etc/nginx/nginx.conf/etc/nginx/conf.d/*.conf),找到 http 部分,并添加或修改以下指令:

    client_max_body_size 20M;

    上述指令将客户端请求的最大实体大小限制为 20MB。您可以根据需要将其调整为适当的值。完成后,保存文件并重新加载或重启 Nginx。

  2. 修改 Nginx 站点配置文件:如果您在特定的 Nginx 站点配置文件中遇到此错误,可以在该文件中添加以下指令:

    client_max_body_size 20M;

    同样,您可以根据需要调整值,并保存文件后重新加载或重启 Nginx。

  3. 检查后端服务器配置:如果 Nginx 作为代理服务器将请求转发给后端服务器,那么后端服务器也可能有请求实体大小的限制。您需要检查后端服务器(如应用服务器)的配置文件,并确保其允许处理较大的请求实体。

请注意,修改 Nginx 配置后,需要重新加载或重启 Nginx 才能使更改生效。您可以使用以下命令来重新加载或重启 Nginx:

# 重新加载配置
sudo systemctl reload nginx

# 重启 Nginx
sudo systemctl restart nginx

通过以上方法,您应该能够解决 "413 Request Entity Too Large" 错误并允许较大的请求实体。

定义变量

配置接口地址

cat <<'EOF'>/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=<IP地址>
NETMASK=<子网掩码>
GATEWAY=<默认网关>
EOF

cat <<'EOF'>/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
IPADDR=<IP地址>
NETMASK=<子网掩码>
GATEWAY=<默认网关>
EOF

cat <<'EOF'>/etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
BOOTPROTO=static
ONBOOT=yes
IPADDR=<IP地址>
NETMASK=<子网掩码>
GATEWAY=<默认网关>
EOF


增加路由表

cat <<'EOF'>/etc/iproute2/rt_tables
100 isp1
200 isp2
300 isp3
EOF

配置各个路由表默认网关

ip route add default via A.B.C.D1 dev eth0 table isp1
ip route add default via A.B.C.D2 dev eth1 table isp2
ip route add default via A.B.C.D3 dev eth2 table isp3

配置源进源出

ip rule add from A.B.C.D1 table isp1
ip rule add from A.B.C.D2 table isp2
ip rule add from A.B.C.D3 table isp3

配置明细路由

cat <<'EOF'> /etc/sysconfig/network-scripts/route-eth0
移动/24 via 移动网关
移动/24 via 移动网关
EOF

cat <<'EOF'> /etc/sysconfig/network-scripts/route-eth1
联通/24 via 联通网关
联通/24 via 联通网关
EOF

cat <<'EOF'> /etc/sysconfig/network-scripts/route-eth2
电信/24 via 电信网关
电信/24 via 电信网关
EOF

运营商地址段可搜索 苍狼山庄。

TO BE continue!

下载软件

wget https://vip.123pan.cn/1815238395/download/tailscale/tailscale_1.50.1_amd64.tgz
tar zxvf tailscale_1.50.1_amd64.tgz
x tailscale_1.50.1_amd64/
x tailscale_1.50.1_amd64/tailscale
x tailscale_1.50.1_amd64/tailscaled
x tailscale_1.50.1_amd64/systemd/
x tailscale_1.50.1_amd64/systemd/tailscaled.defaults
x tailscale_1.50.1_amd64/systemd/tailscaled.service

将二进制复制到系统路径下

cp tailscale_1.50.1_amd64/tailscaled /usr/sbin/tailscaled
cp tailscale_1.50.1_amd64/tailscale /usr/bin/tailscale

将系统服务配置文件拷贝到系统路径下

cp tailscale_1.50.1_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service

将tailscale配置文件拷贝到系统路径下

cp tailscale_1.50.1_amd64/systemd/tailscaled.defaults /etc/default/tailscaled

配置并启动tailscaled服务

systemctl enable --now tailscaled
systemctl restart tailscaled
systemctl status tailscaled





准备

准备虚拟机

1~3个人,需要1C2G10GB的云主机。

2023-10-27T06:49:38.png

加入堡垒机

安装docker

yum install -y docker-ce
echo 'alias docker-compose="docker compose"' >> ~/.bashrc
. ~/.bashrc

申请证书

export Ali_Key="xxx"
export Ali_Secret="xxx"
/root/.acme.sh/acme.sh --issue -d derp.sddts.cn --challenge-alias xxx.cn --dns dns_ali --force

证书手动申请,然后放在/opt/derp/certs路径下
2023-10-27T07:03:34.png

部署

创建目录

mkdir -p /opt/headscale
mkdir -p /opt/derp

准备.env文件

TAILSCALE_DERP_HOSTNAME=derp.sddts.cn
TAILSCALE_DERP_VERIFY_CLIENTS=true
#TAILSCALE_DERP_CERTMODE=letsencrypt
TAILSCALE_DERP_CERTMODE=manual
TAILSCALE_AUTH_KEY="tskey-auth-123-123"

准备docker-compose文件

version: '3'

services:
  headscale:
    image: dockerproxy.com/juanfont/headscale:sha-b01f1f1
    container_name: headscale
    volumes:
      - /opt/headscale/config:/etc/headscale
      - /opt/headscale/data:/var/lib/headscale
    environment:
      - "TZ=Asia/Shanghai"
    ports:
      - 51110:51110
      - 51111:51111
    restart: unless-stopped
    entrypoint:
      - sh
      - -euc
      - |
        cat <<'EOF'>/etc/headscale/config.yaml
        ---
        server_url: http://derp.sddts.cn:51110
        listen_addr: 0.0.0.0:51110
        metrics_listen_addr: 127.0.0.1:51111
        grpc_listen_addr: 0.0.0.0:50443
        grpc_allow_insecure: false
        private_key_path: /var/lib/headscale/private.key
        noise:
          private_key_path: /var/lib/headscale/noise_private.key
        ip_prefixes:
          #- fd7a:115c:a1e0::/48
          - 100.64.0.0/10
        derp:
          paths:
            - /etc/headscale/derp.yaml
          auto_update_enabled: true
          update_frequency: 24h
        disable_check_updates: false
        ephemeral_node_inactivity_timeout: 30m
        node_update_check_interval: 10s
        db_type: sqlite3
        db_path: /var/lib/headscale/db.sqlite
        acme_url: https://acme-v02.api.letsencrypt.org/directory
        acme_email: ""
        tls_letsencrypt_hostname: ""
        tls_letsencrypt_cache_dir: /var/lib/headscale/cache
        tls_letsencrypt_challenge_type: HTTP-01
        tls_letsencrypt_listen: ":http"
        tls_cert_path: ""
        tls_key_path: ""
        log:
          format: text
          level: info
        acl_policy_path: ""
        dns_config:
          override_local_dns: true
          nameservers:
            - 223.5.5.5
          domains: []
          magic_dns: true
          base_domain: example.com
        unix_socket: /var/run/headscale/headscale.sock
        unix_socket_permission: "0770"
        logtail:
          enabled: false
        randomize_client_port: false
        EOF
        cat <<'EOF'>/etc/headscale/derp.yaml
        regions:
          900:
            regionid: 900
            regioncode: thk
            regionname: office
            nodes:
              - name: office-A
                regionid: 900
                hostname: derp.sddts.cn
                stunport: 51113
                stunonly: false
                derpport: 51112
        EOF
        headscale serve

  derp:
    image: dockerproxy.com/yangchuansheng/derper:latest
    container_name: derp
    restart: always
    init: true
    ports:
      - 80:80
      - 443:443
      - 51112:51112
      - 51113:51113/udp
    cap_add:
      - NET_RAW
      - NET_ADMIN
    volumes:
      - /opt/derp/certs:/app/certs/
      - /etc/localtime:/etc/localtime:ro
    environment:
      - "DERP_CERT_MODE=manual"
      - "DERP_ADDR=:51112"
      - "DERP_DOMAIN=derp.sddts.cn"
      - "TZ=Asia/Shanghai"

客户端连接

启动客户端

客户端测

tailscale up --login-server=https://derp.sddts.cn:51820 --accept-routes=true --accept-dns=false --force-reauth --advertise-routes=192.168.105.0/24

--advertise-routes=192.168.105.0/24 # 当前客户端可以通往192.168.105.0/24

服务端测

dockerid=`docker ps | grep headscale | awk '{print $1}'`
docker exec -it /bin/bash $dockerid
headscale -n default nodes register --key xxx

客户端常用命令

# 启动客户端tailscaled服务
注意,tailscaled和tailscale不一样。前者是后台服务,后者是可以操作服务的程序。

# 连接headscale网络
tailscale up

# 断开连接
tailscale down

# 查看连接状态
tailscale status

# 查看接入headscale网络后分配给当前客户端的ip地址
tailscale ip

# 查看当前客户端与derp中继服务的延迟信息
tailscale netcheck

服务端常用命令

# 查看当前客户端列表    
headscale nodes list

# 查看当前headscale网络路由(主要是客户端通告的可达路由)
headscale routes list

# 允许/删除/禁用客户端通告的路由
headscale routes enable|delete|disable $routeid

参考

https://hub.docker.com/r/sparanoid/derp
https://tailscale.com/kb/manage-devices/
https://www.linshenkx.cn/archives/tailscale-derper-docker
https://github.com/tijjjy/Tailscale-DERP-Docker

安装与升级都需要先导入镜像

rm -f image.tar.gz ; wget https://demo.waf-ce.chaitin.cn/image.tar.gz; docker load -i image.tar.gz

安装

bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"

升级

bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/upgrade.sh)"