当前位置: 首页 > news >正文

tailscale自建headscale和derp中继

tailscale derp中继服务简介

tailscale是一个基于WireGuard的零配置软件,它可以轻松地在多台设备之间建立点对点加密连接。

derp服务器是tailscale网络的重要组成部分。它作为tailscale客户端之间的中继,帮助客户端找到并连接到其他客户端设备。

在这里插入图片描述

但Tailscale 官方的服务端和 DERP 中继服务器全部在境外,在国内的网络环境中不一定能稳定连接,所以有必要建立自己的headscale服务端和 DERP 服务器。

在这里插入图片描述

准备工作:

  • 需要有自己的云服务器,本示例为阿里云轻量应用服务器
  • 需要有自己的域名,本示例为阿里云域名
  • 云服务器已经安装 docker 运行环境

准备两个子域名,示例如下:

  • derper.example.com
  • headscale.example.com

DNS解析示例如下,需要将域名解析到云服务器公网IP地址:

在这里插入图片描述

以下所有操作在一台ubuntu 22.04 轻量云服务器进行配置。

创建docker网络

创建名为headscale的docker网络,用于不同容器直接通过名称互访。

docker network create headscale

部署tailscale客户端

在需要搭建 DERP Server 的服务器上, 首先安装一个 Tailscale 客户端,这样做的目的是让搭建的 DERP Server 开启客户端认证, 否则你的 DERP Server 可以被任何人白嫖.

为derper容器提供tailscale.sock套接字,用于后续部署derp时指定-v tailscale:/var/run/tailscale参数.

docker run -d --name tailscale \--restart always \-v tailscale:/var/run/tailscale \-v /var/lib:/var/lib \-v /dev/net/tun:/dev/net/tun \--network=host --privileged \tailscale/tailscale tailscaled

部署derp中继服务器

执行以下docker命令,部署derper中继服务器,

docker run -d --name derper \--restart always \-p 8443:8443 -p 3478:3478 \-e DERP_ADDR=:8443 \-e DERP_DOMAIN=derper.example.com \-e DERP_CERT_MODE=letsencrypt \-e DERP_VERIFY_CLIENTS=true \--net headscale \-v tailscale:/var/run/tailscale \docker.io/fredliang/derper:latest

参数说明:

  • 3478 端口不要修改
  • 8443 端口可以按照自己的喜好来改,DERP_ADDR 变量后面的端口需要与该端口保持一致,冒号不能丢
  • DERP_VERIFY_CLIENTS=true,DERP 会验证连接的客户端是否与本机的客户端为同一个账号下,从而避免其他客户端白嫖服务器
  • DERP_CERT_MODE=letsencrypt :使用letsencrypt 自动申请ssl证书
  • -v tailscale:/var/run/tailscale 将tailscale.sock套接字接口挂载进容器中

查看运行的容器

root@ubuntu:~# docker ps 
CONTAINER ID   IMAGE                                                     COMMAND                  CREATED       STATUS       PORTS                                                                                  NAMES
445c5fc9e688   fredliang/derper:latest                                   "/bin/sh -c '/app/de…"   6 hours ago   Up 6 hours   0.0.0.0:3478->3478/tcp, :::3478->3478/tcp, 0.0.0.0:8443->8443/tcp, :::8443->8443/tcp   derper

浏览器访问derper域名:https://derper.example.com ,显示以下内容,说明derp服务端运行正常:

在这里插入图片描述

部署headscale

创建headscale目录

mkdir -p /data/headscale/config
touch /data/headscale/config/db.sqlite

下载headscale配置文件

wget -O /data/headscale/config/config.yaml \https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml

修改headscale配置文件,以下仅显示修改部分,其他保持默认

$ vim /data/headscale/config/config.yaml
server_url: https://headscale.example.com
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 0.0.0.0:9090
private_key_path: /etc/headscale/private.key
noise:private_key_path: /etc/headscale/noise_private.key
derp:urls:#  - https://controlplane.tailscale.com/derpmap/defaultpaths:- /etc/headscale/derp.yaml
dns_config:override_local_dns: truenameservers:- 223.5.5.5- 223.6.6.6

参数说明:

  • derp.urls: 注释掉默认derp中继服务器地址
  • derp.paths:使用paths指定自建derp服务器配置文件,注意为容器中的路径

创建derp配置文件

$ vim /data/headscale/config/derp.yaml 
regions:900:regionid: 900regioncode: aliyunregionname: aliyund-derpnodes:- name: 900aregionid: 900hostname: derper.example.comstunport: 3478stunonly: falsederpport: 8443

配置说明:

  • regions 是 YAML 中的对象,下面的每一个对象表示一个可用区,每个可用区里面可设置多个 DERP 节点,即 nodes。
  • 每个可用区的 regionid 不能重复。
  • 每个 node 的 name 不能重复。
  • regionname 一般用来描述可用区,regioncode 一般设置成可用区的缩写。
  • stunonly: false 表示除了使用 STUN 服务,还可以使用 DERP 服务。

部署headscale服务端

docker run -d --name headscale \--restart always \-p 8080:8080 -p 9090:9090 \--net headscale \-v /data/headscale/config:/etc/headscale \headscale/headscale:latest-alpine headscale serve

查看运行的容器

root@ubuntu:~# docker ps 
CONTAINER ID   IMAGE                                                     COMMAND                  CREATED       STATUS       PORTS                                                                                  NAMES
5a1ddc71318a   headscale/headscale:latest-alpine                         "headscale serve"        5 hours ago   Up 5 hours   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   headscale

部署caddy-server

使用caddy用于访问headscale.example.com和deper.example.com时分别反向代理到后端http服务。

在这里插入图片描述

创建caddy配置文件目录

mkdir -p /data/caddy

创建caddy配置文件,由于在同一个docker 网络,caddy可直接通过容器名称访问headscale和derper后端。

cat >/data/caddy/Caddyfile<<EOF
https://headscale.example.com {reverse_proxy * http://headscale:8080
}
https://derper.example.com {reverse_proxy * http://derper:8443
}
EOF

部署caddy-server

docker run -d --name caddy \--restart always \-p 80:80 -p 443:443 \--net headscale \-v /data/caddy/Caddyfile:/etc/caddy/Caddyfile \docker.io/caddy/caddy:latest

headscale客户端注册

headscale服务端配置

创建一个命名空间:

docker exec headscale \headscale namespaces create defaultns

生成用于客户端注册的认证key,记录key用于后续客户端注册使用。

docker exec headscale \headscale --namespace defaultns preauthkeys create --reusable --expiration 24h

示例运行结果

root@ubuntu:~# docker exec headscale \
>   headscale --namespace defaultns preauthkeys create --reusable --expiration 24h
90e20f91f2497c518144254b0fe66cc0619ae5571e8a2e5c 

server端客户端注册

首先在本机将tailscale客户端注册到服务端

docker exec -it tailscale \tailscale up --accept-dns=false --accept-routes=true \--auth-key=90e20f91f2497c518144254b0fe66cc0619ae5571e8a2e5c \--force-reauth --login-server=https://headscale.example.com --reset

windows客户端注册

以下在远程windows机器执行,该机器可以位于home或公司。

1、安装tailscale windows客户端

2、浏览器访问以下链接,下载页面中的reg注册表文件并执行

https://headscale.example.com/windows

点击下载页面中的reg注册表文件并执行该文件。
在这里插入图片描述

3、注册客户端到headscale控制端

打开CMD命令行窗口,复制以下几行命令粘贴到CMD命令行窗口,并执行

tailscale up --accept-dns=false --accept-routes ^--login-server=http://headscale.example.com ^--auth-key=90e20f91f2497c518144254b0fe66cc0619ae5571e8a2e5c ^--force-reauth --unattended --reset ^--advertise-routes=192.168.12.0/24,192.168.13.0/24

关于选项设置:

  • –login-server: 指定使用的headscale服务器地址(必填)
  • –advertise-routes: 向headscale服务器报告当前客户端处于哪个内网网段下, 便于headscale服务器让同内网设备直接内网直连,或者将其他设备指定流量路由到当前内网(可选)
  • –accept-routes: 是否接受headscale服务器下发的用于路由到其他客户端内网的路由规则(可选)
  • –accept-dns: 是否使用headscale服务器下发的 DNS 相关配置(可选)

客户端开启IP转发:

搜索框中搜索注册表编辑器,展开注册表编辑器以下路径,将参数IPEnableRouter的值从0修改为1,然后关闭注册表编辑器并重新启动系统。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

4、headscale控制端查看注册的节点列表

docker exec -it headscale headscale nodes list

示例运行结果

root@ubuntu:~# docker exec -it headscale headscale nodes list
ID | Hostname    | Name        | NodeKey | Namespace | IP addresses                 | Ephemeral | Last seen           | Online  | Expired
1  | ubuntu      | ubuntu      | [PpOKS] | defaultns | 100.64.0.1, fd7a:115c:a1e0::1 | false     | 2023-10-08 16:35:50 | online  | no     
2  | winpc-laptop | winpc-laptop | [qMO6V] | defaultns | 10.64.0.2, fd7a:115c:a1e0::2 | false     | 2023-10-08 10:41:21 | online| no     
3  | winpc   | willpc      | [6CjhI] | defaultns | 100.64.0.3, fd7a:115c:a1e0::3 | false     | 2023-10-08 16:35:50 | online  | no     

如果需要删除节点执行以下命令,其中2为nodes list显示的节点ID

headscale nodes delete -i 2

5、server端查看客户端发布的subnet

/ # headscale nodes routes list -i 2
Route           | Enabled
192.168.12.0/24 | false
192.168.13.0/24 | false

server端启用客户端发布的subnet,这样所有子网接入tailscale网络并能够全部互通。

/ # headscale nodes routes enable -i 2 -r 192.168.12.0/24,192.168.13.0/24
Route           | Enabled
192.168.12.0/24 | true
192.168.13.0/24 | true

网络连通性测试

所有客户端按照以上示例注册到headscale-server,并发布本地子网网段后,下图任意网络环境的子网IP可以直接互相通信。
在这里插入图片描述
例如从172.16.1.1所在机器测试ping 192.168.12.1。

derp中继测试

tailscale ping 命令

tailscale ping 命令可以用于测试 IP 连通性, 同时可以看到是如何连接目标节点的. 默认情况下 Ping 命令首先会使用 Derper 中继节点通信, 然后尝试 P2P 连接; 一旦 P2P 连接成功则自动停止Ping.
由于其先走 Derper 的特性也可以用来测试 Derper 连通性.

C:\Users\wiinpc>tailscale ping 192.168.12.16
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 49ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 117ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 46ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 38ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 80ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 42ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 163ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 68ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 41ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 255ms
direct connection not established

tailscale status 命令

通过 tailscale status 命令可以查看当前节点与其他对等节点的连接方式, 通过此命令可以查看到当前节点可连接的节点以及是否走了 Derper 中继:

C:\Users\winpc>tailscale status
fd7a:115c:a1e0::1 win-laptop          defaultns    windows -
fd7a:115c:a1e0::2 winpc               defaultns    windows active; relay "aliyun", tx 45680 rx 49464

tailscale netcheck 命令

有些情况下我们可以确认是当前主机的网络问题导致没法走 P2P 连接, 但是我们又想了解一下当前的网络环境; 此时可以使用 tailscale netcheck 命令来检测当前的网络环境, 此命令将会打印出详细的网络环境报告:

C:\Users\winpc>tailscale netcheckReport:* UDP: false* IPv4: (no addr found)* IPv6: no, but OS has support* MappingVariesByDestIP:* HairPinning:* PortMapping:* CaptivePortal: true* Nearest DERP: aliyund-derp* DERP latency:- aliyun: 126.3ms (aliyund-derp)

相关文章:

tailscale自建headscale和derp中继

tailscale derp中继服务简介 tailscale是一个基于WireGuard的零配置软件&#xff0c;它可以轻松地在多台设备之间建立点对点加密连接。 derp服务器是tailscale网络的重要组成部分。它作为tailscale客户端之间的中继,帮助客户端找到并连接到其他客户端设备。 但Tailscale 官方…...

布隆过滤器的使用

布隆过滤器简介 Bloom Filter(布隆过滤器)是一种多哈希函数映射的快速查找算法。它是一种空间高效的概率型数据结构&#xff0c;通常应用在一些需要快速判断某个元素是否属于集合&#xff0c;但是并不严格要求100%正确的场合。 布隆过滤器的优势在于&#xff0c;利用很少的空…...

Web开发-单例模式

目录 单例模式介绍代码实现单例模式 单例模式介绍 单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点。单例模式可以通过private属性实现。通过将类的构造函数设为private&#xff0c;可以防止类在外部被实例化。单例模式通…...

MySQL:温备份和恢复-mysqldump (4)

介绍 温备&#xff1a;同样是在数据库运行的时候进行备份的&#xff0c;但对当前数据库的操作会产生影响。&#xff08;只可以读操作&#xff0c;不可以写操作&#xff09; 温备份的优点&#xff1a; 1.可在表空间或数据文件级备份&#xff0c;备份时间短。 2.备份时数据库依然…...

【力扣每日一题】2023.10.8 股票价格波动

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这道题是程序设计题&#xff0c;要我们实现一个类&#xff0c;一共是四个功能&#xff0c;第一个是给一个时间戳和价格&#xff0c;表示该…...

Linux隐藏文件或文件夹

在Linux中&#xff0c;以点&#xff08;.&#xff09;开头的文件或文件夹是隐藏文件或隐藏文件夹。要创建一个隐藏文件或文件夹&#xff0c;可以使用以下命令&#xff1a; 创建隐藏文件&#xff1a; touch .filename这将在当前目录下创建一个名为 “.filename” 的隐藏文件。…...

leetcode - 365周赛

一&#xff0c;2873.有序三元组中的最大值 I ​ 该题的数据范围小&#xff0c;直接遍历&#xff1a; class Solution {public long maximumTripletValue(int[] nums) {int n nums.length;long ans 0;for(int i0; i<n-2; i){for(int ji1; j<n-1; j){for(int kj1; k<…...

为什么mac上有的软件删除不掉?

对于Mac用户来说&#xff0c;软件卸载通常是一个相对简单的过程。然而&#xff0c;有时你可能会发现某些软件似乎“顽固不化”&#xff0c;即使按照常规方式尝试卸载&#xff0c;也依然存在于你的电脑上。这到底是为什么呢&#xff1f;本文将探讨这一问题的可能原因。 1.卸载失…...

【vue3】wacth监听,监听ref定义的数据,监听reactive定义的数据,详解踩坑点

假期第二篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 之前已经记录了一篇【vue3基础知识点-computed和watch】 今天在学习的过程中发现&#xff0c;之前记录的这一篇果然是很基础的&#xff0c;很多东西都讲的不够…...

跨境电商如何通过软文建立品牌形象?

在全球产业链结构重塑后的今天&#xff0c;越来越多的企业意识到想要可持续发展&#xff0c;就需要在建立品牌形象&#xff0c;在用户心中留下深刻印象&#xff0c;那么应该如何有效建立品牌形象呢&#xff1f;可以利用软文来打造品牌形象&#xff0c;接下来媒介盒子就告诉大家…...

我做了一个简易P图(参数图)分析软件

P图(即参数图&#xff0c;Parameter Diagram)&#xff0c;是一个结构化的工具&#xff0c;帮助大家对产品更好地进行分析。 典型P图格式 P图最好是和FMEA软件联动起来&#xff0c;如国可工软的FMEA软件有P图分析这个功能。 单纯的P图分析软件很少&#xff0c;为了方便做P图分…...

209.Flink(四):状态,按键分区,算子状态,状态后端。容错机制,检查点,保存点。状态一致性。flink与kafka整合

一、状态 1.概述 算子任务可以分为有状态、无状态两种。 无状态:filter,map这种,每次都是独立事件有状态:sum这种,每次处理数据需要额外一个状态值来辅助。这个额外的值就叫“状态”2.状态的分类 (1)托管状态(Managed State)和原始状态(Raw State) 托管状态就是由…...

rabbitmq查看节点信息命令失败

不影响访问rabbitmq&#xff0c;但是无法使用 命令查看节点信息 等 查看节点信息命令&#xff1a;rabbitmq-diagnostics status --node rabbitJHComputer Error: unable to perform an operation on node ‘rabbitJHComputer‘. Please see diagnostics informatio rabbitmq-…...

c语言动态内存分布

前言&#xff1a; 随着我们深入的学习c语言&#xff0c;之前使用的静态内存分配已经难以满足我们的实际需求。比如前面我们的通讯录功能的实现&#xff0c;如果只是静态内存分配&#xff0c;那么也就意味着程序开始的内存分配大小就是固定的&#xff0c;应该开多大的空间呢&am…...

1.3.2有理数减法(第一课时)作业设计

【学习目标】 1&#xff0e;理解有理数减法法则&#xff0c;能熟练地进行有理数的减法运算&#xff0e; 2&#xff0e;感受有理数减法与加法对立统一的辨证思想&#xff0c;体会转化的思想方法&#xff0e;...

vue3 -- ts封装 Turf.js地图常用方法

Turf.js中文网 地理空间分析库,处理各种地图算法 文档地址 安装 Turf 库 npm install @turf/turf创建src/hooks/useTurf.ts 文件1:获取线中心点 效果: 代码: useTurf.ts import * as turf from @turf/turf// 获取线中心点 export class CenterPointOfLine {...

Qt之实现圆形进度条

在Qt自带的控件中&#xff0c;只有垂直进度条、水平进度条两种。 在平时做页面开发时&#xff0c;有些时候会用到圆形进度条&#xff0c;比如说&#xff1a;下载某个文件的下载进度。 展示效果&#xff0c;如下图所示&#xff1a; 实现这个功能主要由以下几个重点&#xff1a…...

C# 图解教程 第5版 —— 第1章 C# 和 .NET 框架

文章目录 1.1 在 .NET 之前1.2 .NET 时代1.2.1 .NET 框架的组成1.2.2 大大改进的编程环境 1.3 编译成 CIL1.4 编译成本机代码并执行1.5 CLR1.6 CLI1.7 各种缩写1.8 C# 的演化1.9 C# 和 Windows 的演化&#xff08;*&#xff09; 1.1 在 .NET 之前 MFC&#xff08;Microsoft Fou…...

electronjs入门-聊天应用程序,与Electron.js通信

随着第一章中构建的应用程序&#xff0c;我们将开始将其与Electron框架中的模块集成&#xff0c;并以此为基础&#xff0c;以更实用的方式了解它们。 过程之间的通信 根据第二章中的解释&#xff0c;我们将发送每个进程之间的消息&#xff1b;具体来说联系人和聊天&#xff1…...

【自用】ubuntu 18.04 LTS安装opencv 3.4.16 + opencv_contrib 3.4.16

1.下载 opencv 3.4.16 opencv_contrib 3.4.16 其中&#xff0c;opencv_contrib解压后的多个文件夹复制到opencv内、合并 声明&#xff1a;尚未验证该方式是否可行 2.安装 参考博文&#xff1a; https://zhuanlan.zhihu.com/p/650792342 https://zhuanlan.zhihu.com/p/8719780…...

递归解析Json,实现生成可视化Tree+快速获取JsonPath | 京东云技术团队

内部平台的一个小功能点的实现过程&#xff0c;分享给大家&#xff1a; 递归解析Json&#xff0c;可以实现生成可视化Tree快速获取JsonPath。 步骤&#xff1a; 1.利用JsonPath读取根&#xff0c;获取JsonObject 2.递归层次遍历JsonObjec&#xff0c;保存结点信息 3.利用z…...

GraceUI相关的 知识

调试工具&#xff1a;UniApp提供了一些调试工具和插件&#xff0c;如uni-app-cli、调试器等&#xff0c;可以帮助你更好地定位和解决问题。同时&#xff0c;使用浏览器的开发者工具或模拟器的调试功能&#xff0c;可以更直观地观察页面效果和调试代码。 对于 GraceUI 的普通版本…...

三十二、【进阶】hash索引结构

1、hash索引结构 &#xff08;1&#xff09;简述&#xff1a; hash索引&#xff0c;就是采用一定的hash算法&#xff0c;将键值换算成新的hash值&#xff0c;映射到对应的槽位上&#xff0c;然后存储在hash表中。 &#xff08;2&#xff09;图示&#xff1a; 2、hash索引结构…...

如果有一天AI能自主编程了,程序员还有前途吗?

人们一直想知道人工智能&#xff08;AI&#xff09;等新技术将如何影响就业。如今的一个大问题是&#xff1a;人工智能会接管程序员的角色吗&#xff1f; 编程主要是关于人们学习计算机语言&#xff0c;这需要大量的时间和努力。但人工智能正在改变这一点。像 GPT-4 这样的系统…...

网络安全:个人信息保护,企业信息安全,国家网络安全的重要性

在当前的数字化时代&#xff0c;无论是个人&#xff0c;企业&#xff0c;还是国家&#xff0c;都会面临严重的网络安全威胁。网络安全不仅涉及我们的日常生活&#xff0c;也涉及到社会的稳定和国家的安全。这就需要我们高度重视网络安全&#xff0c;强化个人信息保护&#xff0…...

自动驾驶学习笔记(二)——Apollo入门

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 Ubuntu Linux文件系统 Linux指令…...

Flask 进行 Web 开发时,常见的错误

ImportError: No module named ‘flask’ 错误描述&#xff1a; 这个错误表示 Python 找不到 Flask 模块。解决方法&#xff1a; 确保已经正确安装了 Flask 模块。你可以使用以下命令来安装 Flask&#xff1a;pip install flaskAttributeError: ‘module’ object has no attri…...

【项目】5.1阻塞和非阻塞、同步和异步 5.2Unix、Linux上的五种IO模型

5.1阻塞和非阻塞、同步和异步&#xff08;网络IO&#xff09; 典型的一次IO的两个阶段是什么&#xff1f;数据就绪和数据读写 数据就绪&#xff1a;根据IO操作的就绪状态 阻塞非阻塞 数据读写&#xff1a;根据应用程序和内核的交互方式 同步异步 陈硕&#xff1a;在处理IO的…...

Unity可视化Shader工具ASE介绍——3、ASE的Shader类型介绍

大家好&#xff0c;我是阿赵。这里继续介绍Unity可视化Shader编辑插件ASE的用法。   上一篇介绍了节点的输入输出节点。这一篇来介绍一下不同的Shader类型的区别。 一、修改Shader类型 之前介绍创建Shader的时候&#xff0c;曾经说过可以选择Shader的类型。 其实这个类型是…...

国内手机安装 Google Play 服务 (GMS/Google Mobile Services)

目录 1. 国内手机安装 Google Play 服务 (GMS/Google Mobile Services)1.1. 什么是 GMS1.2. 国内手机只需要安装 3 个 APP1.2.1. Google Services Framework 服务框架1.2.2. Google Play Services1.2.3. Google Play Store 应用商店 1.3. 问题1.3.1. 谷歌地图闪退 2. 小米手机 …...

哪个网站可以做英文兼职/优化防疫措施

块&#xff1a;1 不设宽度占满正行 自己站一行内嵌 1.不支持宽高 2对上下的padding margin也会出问题 3宽度由内容撑开 4 代码换行会被解析成半个字符大小inline-block 上述5条都具备 ie67 不支持inline-blockfloat未作笔记相对定位&#xff1a; 1.不影响元素本身特性 2.不使元…...

wordpress网易云音乐自定义css/阿里指数官网最新版本

关注并标星百问科技嵌入式干货&#xff0c;第一时间送达------感谢各位耐心等候。昨天更新蓝牙第4节&#xff1a;009.蓝牙系统从零讲解/第02课_BLE协议栈/第03节_BLE协议各层数据格式概述 &#xff0c;这节依然免费试看&#xff0c;下一节开始加密收费。主讲&#xff1a;BLE协议…...

中电科工程建设有限公司网站/营销推广主要包括

标签&#xff1a;screw 工具 php 代码 开源原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://colderboy.blog.51cto.com/485582/412303公司要求加密开发的代码源文件要求一部分加密一部分不…...

财经投资公司网站建设方案/百度官方下载

第九章:循环的进阶1.二重循环定义&#xff1a;一个循环体内包含一个完整的循环结构。分别为&#xff1a;外层循环和内层循环&#xff0c;外层循环变量变化一次&#xff0c;内层循环从初始值到结束值变化一遍。语法&#xff1a;//while与while循环嵌套             …...

做个网站哪里可以做/网站推广的途径有哪些

ORACLE中数据字典视图分为3大类&#xff0c;用前缀区别&#xff0c;分别为&#xff1a;USER&#xff0c;ALL 和 DBA&#xff0c;许多数据字典视图包含相似的信息。 USER_*:有关用户所拥有的对象信息&#xff0c;即用户自己创建的对象信息 ALL_*&#xff1a;有关用户可以访问的…...

网站开发所得税/爱战网官网

题目链接 链接&#xff1a;https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/description/ 题解&代码 1、暴力枚举所有的情况&#xff0c;时间复杂度O(n^2*m^2)&#xff0c;实际耗时759 ms class Solution { public:int maxSumSubmatrix(vector<ve…...