Files
DefectingCat.github.io/defect/basic-knowledge-of-qinq.html
DefectingCat 8c7085f18f
2020-11-02 02:17:54 +00:00

38 lines
25 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="zh-CN" data-default-color-scheme="&#34;auto&#34;"><head><meta charset="UTF-8"><link rel="apple-touch-icon" sizes="76x76" href="/images/img/apple-touch-icon.webp"><link rel="icon" type="image/png" href="/images/img/favicon.webp"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,shrink-to-fit=no"><meta http-equiv="x-ua-compatible" content="ie=edge"><meta name="theme-color" content="#9DC8C8"><meta name="description" content=""><meta name="author" content="Defectink"><meta name="keywords" content=""><title>QinQ基础操作 - 🍭Defectink</title><link rel="stylesheet" href="https://cdn.defectink.com/static/twitter-bootstrap/4.5.3/css/bootstrap.min.css"><link rel="stylesheet" href="https://cdn.defectink.com/static/github-markdown-css/4.0.0/github-markdown.min.css"><link rel="stylesheet" href="/lib/hint/hint.min.css"><link rel="stylesheet" href="https://cdn.defectink.com/static/highlight.js/10.0.0/styles/github-gist.min.css"><link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_ba1fz6golrf.css"><link rel="stylesheet" href="https://cdn.defectink.com/static/t/font_1736178_kmeydafke9r.css"><link rel="stylesheet" href="/css/main.css"><link rel="stylesheet" href="/css/xfy.css"><script src="/js/utils.js"></script><script src="/js/color-schema.js"></script><meta name="generator" content="Hexo 5.2.0"><link rel="alternate" href="/xml/atom.xml" title="🍭Defectink" type="application/atom+xml"><link rel="alternate" href="/xml/rss.xml" title="🍭Defectink" type="application/rss+xml"></head><body><header style="height:75vh"><nav id="navbar" class="navbar fixed-top navbar-expand-lg navbar-dark scrolling-navbar"><div class="container"><a class="navbar-brand" href="/">&nbsp;<strong>🍭Defectink</strong>&nbsp;</a> <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"><div class="animated-icon"><span></span><span></span><span></span></div></button><div class="collapse navbar-collapse" id="navbarSupportedContent"><ul class="navbar-nav ml-auto text-center"><li class="nav-item"><a class="nav-link" href="/">🏠 首页</a></li><li class="nav-item dropdown"><a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">📕 索引</a><div class="dropdown-menu" aria-labelledby="navbarDropdown"><a class="dropdown-item" href="/categories/">🎁 分类</a> <a class="dropdown-item" href="/tags/">🎐 标签</a></div></li><li class="nav-item"><a class="nav-link" href="/archives/">📂 归档</a></li><li class="nav-item"><a class="nav-link" href="/about/">🎃 关于</a></li><li class="nav-item"><a class="nav-link" href="/links/">🙆‍♀️ 小伙伴</a></li><li class="nav-item"><a class="nav-link" href="/pgp/">🔐 PGP</a></li><li class="nav-item" id="search-btn"><a class="nav-link" data-toggle="modal" data-target="#modalSearch">&nbsp;<i class="iconfont icon-search"></i>&nbsp;</a></li><li class="nav-item" id="color-toggle-btn"><a class="nav-link" href="javascript:">&nbsp;<i class="iconfont icon-dark" id="color-toggle-icon"></i>&nbsp;</a></li></ul></div></div></nav><div class="banner intro-2" id="background" parallax="true" style="background:url(/images/img/post.webp) no-repeat center center;background-size:cover"><div class="full-bg-img"><div class="mask flex-center" style="background-color:rgba(0,0,0,.3)"><div class="container page-header text-center fade-in-up"><span class="h2" id="subtitle"></span><div class="mt-3"><span class="post-meta mr-2"><i class="iconfont icon-author" aria-hidden="true"></i> Defectink</span><span class="post-meta"><i class="iconfont icon-date-fill" aria-hidden="true"></i> <time datetime="2019-05-29 16:21" pubdate>2019年5月29日 下午</time></span></div><div class="mt-1"><span class="post-meta mr-2"><i class="iconfont icon-chart"></i> 2.2k 字</span><span class="post-meta mr-2"><i class="iconfont icon-clock-fill"></i> 26 分钟</span></div></div></div></div></div></header><main><div class="container-fluid"><div class="row"><div class="d-none d-lg-block col-lg-2"></div><div class="col-lg-8 nopadding-md"><div class="container nopadding-md" id="board-ctn"><div class="py-5" id="board"><article class="post-content mx-auto" id="post"><h1 style="display:none">QinQ基础操作</h1><p class="note note-info">本文最后水于2020年11月2日 凌晨</p><div class="markdown-body" id="post-body"><blockquote><p>QwQ♥</p></blockquote><h2 id="QinQ简介"><a href="#QinQ简介" class="headerlink" title="QinQ简介"></a>QinQ简介</h2><p>QinQ技术或称为IEEE 802.1ad、Vlan stacking。是802.1q协议Virtual Bridged Local Area Networks为基础衍生出的一种通讯协议。</p><p>它是一项拓展vlan空间的技术通过在原有的以太网帧中再堆叠一个802.1q的报头来达到拓展vlan空间的功能。使其vlan数量最多可以达4094(inner)*4094(outer)。即802.1Q-in-802.1Q所以称之为QinQ协议。</p><h3 id="目的"><a href="#目的" class="headerlink" title="目的"></a>目的</h3><p>随着当前的以太网技术的发展利用传统802.1q vlan来对用户进行隔离和标识收到很大限制。因为IEEE802.1Q中定义的VLAN Tag域只有12个比特仅能表示4096个VLAN无法满足以太网中标识大量用户的需求于是QinQ技术应运而生。</p><p>而运用了QinQ协议之后可以在原有的vlan标签中再堆叠一层vlan标签使其vlan的数量达到翻倍极大的拓展了vlan的空间。</p><h3 id="优点"><a href="#优点" class="headerlink" title="优点"></a>优点</h3><ul><li>扩展VLAN对用户进行隔离和标识不再受到限制。</li><li>QinQ内外层标签可以代表不同的信息如内层标签代表用户外层标签代表业务更利于业务的部署。</li><li>QinQ封装、终结的方式很丰富帮助运营商实现业务精细化运营。</li></ul><ol><li>解决日益紧缺的公网VLAN ID 资源问题</li><li>用户可以规划自己的私网VLNA ID</li><li>提供一种较为简单的二层VPN解决方案</li><li>使用户网络具有较高的独立性</li></ol><h3 id="实现方式"><a href="#实现方式" class="headerlink" title="实现方式"></a>实现方式</h3><p>QinQ拥有两种实现方式</p><ol><li><p>基本QinQ</p><ol><li>如果收到的是带有VLAN Tag的报文该报文就成为带双Tag的报文。</li><li>如果收到的是不带VLAN Tag的报文该报文就成为带有本端口缺省VLAN Tag的报文。</li></ol></li><li><p>灵活QinQ</p><ol><li>为具有不同内层VLAN ID的报文添加不同的外层VLAN Tag。</li><li>根据报文内层VLAN的802.1p优先级标记外层VLAN的802.1p优先级和添加不同的外层VLAN Tag。通过使用灵活QinQ技术在能够隔离运营商网络和用户网络的同时又能够提供丰富的业务特性和更加灵活的组网能力。</li></ol></li></ol><ul><li><p>基本QinQ</p><p>基本QinQ是基于接口的封装是指进入一个接口的所有流量都将全部封装为一个相同的外层Vlan tag。封装方式不够灵活用户业务区分不够细致。这种封装方式称之为基本QinQ。</p></li><li><p>灵活QinQ</p><ul><li>基于Vlan ID的QinQ封装这种封装方式可以针对不同的vlan tag来决定是否封装外层vlan tag、封装何种vlan tag。这种封装方式称之为灵活QinQ。</li><li>基于802.1q优先级的QinQ封装这种封装方式可以针对用户不同优先级的数据流来决定是否封装外层vlan tag、封装何种vlan tag。这种封装方式亦称之为灵活QinQ。</li></ul></li></ul><h2 id="终结子接口"><a href="#终结子接口" class="headerlink" title="终结子接口"></a>终结子接口</h2><p>“终结”意思为设备对传过来的报文tag进行识别然后根据后续的转发行为来对单层或双层的tag进行玻璃或继续传输。</p><p>“终结”一般作用于子接口上,故称之为:终结子接口</p><p>QinQ技术在和MPLS/IP核心网连接时根据不同的情况会用到不同的终结方法</p><ul><li>如果路由子接口是对报文的单层Tag终结那么该子接口称为Dot1q终结子接口</li><li>如果路由子接口是对报文的双层Tag终结那么该子接口称为QinQ终结子接口。</li></ul><p>TipsDot1q终结子接口和QinQ终结子接口不支持透传不带VLAN的报文收到不带VLAN的报文会直接丢弃。</p><h2 id="帧格式"><a href="#帧格式" class="headerlink" title="帧格式"></a>帧格式</h2><p>QinQ报文有着固定的格式就是在802.1Q的标签上再堆叠一层802.1Q标签。QinQ报文比普通的vlan标签多4个字节。vlan帧最小帧长为68字节。</p><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/ethernet-QinQ-format2.webp" srcset="/images/img/loading.gif" alt="ethernet-QinQ-format2"></p><table><thead><tr><th>字段</th><th>长度</th><th>含义</th></tr></thead><tbody><tr><td>Destination address</td><td>6字节</td><td>目的MAC地址。</td></tr><tr><td>Source address</td><td>6字节</td><td>源MAC地址。</td></tr><tr><td>Type</td><td>2字节</td><td>长度为2字节表示帧类型。取值为0x8100时表示802.1Q Tag帧。如果不支持802.1Q的设备收到这样的帧会将其丢弃。对于内层VLAN tag该值设置为0x8100对于外层VLAN tag有下列几种类型0x8100思科路由器使用0x88A8Extreme Networks switches使用0x9100Juniper路由器使用0x9200Several路由器使用</td></tr><tr><td>PRI</td><td>3比特</td><td>Priority长度为3比特表示帧的优先级取值范围为07值越大优先级越高。用于当交换机阻塞时优先发送优先级高的数据包。</td></tr><tr><td>CFI</td><td>1比特</td><td>CFI (Canonical Format Indicator)长度为1比特表示MAC地址是否是经典格式。CFI为0说明是经典格式CFI为1表示为非经典格式。用于区分以太网帧、FDDIFiber Distributed Digital Interface帧和令牌环网帧。在以太网中CFI的值为0。</td></tr><tr><td>VID</td><td>12比特</td><td>LAN ID长度为12比特表示该帧所属的VLAN。在VRP中可配置的VLAN ID取值范围为14094。</td></tr><tr><td>Length/Type</td><td>2字节</td><td>指后续数据的字节长度但不包括CRC检验码。</td></tr><tr><td>Data</td><td>42~1500字节</td><td>负载(可能包含填充位)。</td></tr><tr><td>CRC</td><td>4字节</td><td>用于帧内后续字节差错的循环冗余检验也称为FCS或帧检验序列</td></tr></tbody></table><h3 id="报文示例"><a href="#报文示例" class="headerlink" title="报文示例"></a>报文示例</h3><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E6%8A%A5%E6%96%87-1582421531943.webp" srcset="/images/img/loading.gif" alt="报文"></p><h3 id="TPIDTag-Protocol-Identifier"><a href="#TPIDTag-Protocol-Identifier" class="headerlink" title="TPIDTag Protocol Identifier"></a>TPIDTag Protocol Identifier</h3><p>TPID标签协议标识IDTag Protocol Identifier是Vlan tag中的一个字段标识该vlan tag的协议类型。IEEE 802.1Q协议规定QinQ的外层vlan标签的type值为0x8100</p><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E5%A4%96%E5%B1%82type.webp" srcset="/images/img/loading.gif" alt="外层type"></p><blockquote><p>IEEE802.1Q协议定义的以太网帧的VLAN Tag。802.1Q Tag位于SASource Address和Length/Type之间。通过检查对应的TPID值设备可确定收到的帧承载的是运营商VLAN标记还是用户VLAN标记。接收到帧之后设备将配置的TPID值与帧中TPID字段的值进行比较。如果二者匹配则该帧承载的是对应的VLAN标记。例如如果帧承载TPID值为0x8100的VLAN标记而用户网络VLAN标记的TPID值配置为0x8200设备将认为该帧没有用户VLAN标记。也就是说设备认为该帧是Untagged报文。<br>另外不同运营商的系统可能将QinQ帧外层VLAN标记的TPID设置为不同值。为实现与这些系统的兼容性可以修改TPID值使QinQ帧发送到公网时承载与特定运营商相同的TPID值从而实现与该运营商设备之间的互操作性。以太网帧的TPID与不带VLAN标记的帧的协议类型字段位置相同。为避免在网络中转发和处理数据包时出现问题不可将TPID值设置为下表中的任意值</p></blockquote><table><thead><tr><th align="center">协议类型</th><th align="center">对应值</th></tr></thead><tbody><tr><td align="center">ARP</td><td align="center">0x0806</td></tr><tr><td align="center">RARP</td><td align="center">0x8035</td></tr><tr><td align="center">IP</td><td align="center">0x0800</td></tr><tr><td align="center">IPV6</td><td align="center">0x86DD</td></tr><tr><td align="center">PPPoE</td><td align="center">0x8863/0x8864</td></tr><tr><td align="center">MPLS</td><td align="center">0x8847/0x8848</td></tr><tr><td align="center">IPX/SPX</td><td align="center">0x8137</td></tr><tr><td align="center">LACP</td><td align="center">0x8809</td></tr><tr><td align="center">802.1x</td><td align="center">0x888E</td></tr><tr><td align="center">HGMP</td><td align="center">0x88A7</td></tr><tr><td align="center">设备保留</td><td align="center">0xFFFD/0xFFFE/0xFFFF</td></tr></tbody></table><h2 id="基本QinQ配置"><a href="#基本QinQ配置" class="headerlink" title="基本QinQ配置"></a>基本QinQ配置</h2><p>拓扑:</p><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E5%9F%BA%E6%9C%ACqinq.webp" srcset="/images/img/loading.gif" alt="基本qinq"></p><p>如图示SW2和SW3用于模拟运营商之间的InternetSW1和SW4为客户内网。基本QinQ的配置就作用于SW2和SW3之间将客户内网内的vlan10与vlan20封装上一层vlan100用于再SW2和SW3之间传输。</p><ul><li>SW1和SW4配置相同</li></ul><pre><code class="hljs routeros">sysname SW1
<span class="hljs-comment">#</span>
vlan batch 10 20
<span class="hljs-comment">#</span>
interface GigabitEthernet0/0/1
<span class="hljs-built_in"> port </span>link-type trunk
<span class="hljs-built_in"> port </span>trunk allow-pass<span class="hljs-built_in"> vlan </span>10 20
<span class="hljs-comment">#</span>
interface GigabitEthernet0/0/2
<span class="hljs-built_in"> port </span>link-type access
<span class="hljs-built_in"> port default vlan </span>10
<span class="hljs-comment">#</span>
interface GigabitEthernet0/0/3
<span class="hljs-built_in"> port </span>link-type access
<span class="hljs-built_in"> port default vlan </span>20</code></pre><p>SW1和SW4只需做基本配置用作普通二层交换。</p><ul><li>SW2和SW3配置相同</li></ul><pre><code class="hljs apache"><span class="hljs-attribute">sysname</span> SW<span class="hljs-number">2</span>
<span class="hljs-comment">#</span>
<span class="hljs-attribute">vlan</span> batch <span class="hljs-number">100</span>
<span class="hljs-comment">#</span>
<span class="hljs-attribute">interface</span> GigabitEthernet<span class="hljs-number">0</span>/<span class="hljs-number">0</span>/<span class="hljs-number">1</span>
<span class="hljs-attribute">port</span> link-type dot<span class="hljs-number">1</span>q-tunnel //开启基本二层QinQ功能
<span class="hljs-attribute">port</span> default vlan <span class="hljs-number">100</span> //并划分为vlan<span class="hljs-number">100</span>
<span class="hljs-comment">#</span>
<span class="hljs-attribute">interface</span> GigabitEthernet<span class="hljs-number">0</span>/<span class="hljs-number">0</span>/<span class="hljs-number">2</span>
<span class="hljs-attribute">port</span> link-type trunk //普通trunk
<span class="hljs-attribute">port</span> trunk <span class="hljs-literal">allow</span>-pass vlan <span class="hljs-number">100</span></code></pre><p>SW1的<code>G 0/0/1</code>为trunk接口对应连接的SW2的<code>G 0/0/1</code>为基本二层QinQ接口划分vlan为vlan 100。</p><p>使用PC1发送ICMP包到PC3数据包内容为</p><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E6%8A%A5%E6%96%872.webp" srcset="/images/img/loading.gif" alt="报文2"></p><p>其中可以看到内层的802.1q的vlan标签ID为10type为0x0800外层的也就是SW2封装的vlan标签ID为100type为0x8100</p><h2 id="灵活QinQ配置"><a href="#灵活QinQ配置" class="headerlink" title="灵活QinQ配置"></a>灵活QinQ配置</h2><p>拓扑和上述一样:</p><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E7%81%B5%E6%B4%BB%E6%8B%93%E6%89%91.webp" srcset="/images/img/loading.gif" alt="灵活拓扑"></p><p>我们在模拟internet的SW2和SW3之间添加了一个vlan 200用于配置灵活的QinQ的vlan 20堆叠一个vlan 200的tag。</p><p>SW1和SW4的配置与普通的QinQ的配置相同无需改变。</p><ul><li>SW2与SW3配置相同</li></ul><pre><code class="hljs apache"><span class="hljs-attribute">sysname</span> SW<span class="hljs-number">2</span>
<span class="hljs-comment">#</span>
<span class="hljs-attribute">vlan</span> batch <span class="hljs-number">100</span> <span class="hljs-number">200</span>
<span class="hljs-comment">#</span>
<span class="hljs-attribute">interface</span> GigabitEthernet<span class="hljs-number">0</span>/<span class="hljs-number">0</span>/<span class="hljs-number">1</span>
<span class="hljs-attribute">port</span> link-type hybrid //必须是hybrid接口模式
<span class="hljs-attribute">qinq</span> vlan-translation enable //开启vlan转换
<span class="hljs-attribute">port</span> hybrid untagged vlan <span class="hljs-number">100</span> <span class="hljs-number">200</span> //出方向时剥离vlan<span class="hljs-number">100</span><span class="hljs-number">200</span>的标签
<span class="hljs-attribute">port</span> vlan-stacking vlan <span class="hljs-number">10</span> stack-vlan <span class="hljs-number">100</span> //vlan<span class="hljs-number">10</span>堆叠vlan<span class="hljs-number">100</span>tag
<span class="hljs-attribute">port</span> vlan-stacking vlan <span class="hljs-number">20</span> stack-vlan <span class="hljs-number">200</span> ////vlan<span class="hljs-number">20</span>堆叠vlan<span class="hljs-number">200</span>tag
<span class="hljs-comment">#</span>
<span class="hljs-attribute">interface</span> GigabitEthernet<span class="hljs-number">0</span>/<span class="hljs-number">0</span>/<span class="hljs-number">2</span>
<span class="hljs-attribute">port</span> link-type trunk
<span class="hljs-attribute">port</span> trunk <span class="hljs-literal">allow</span>-pass vlan <span class="hljs-number">100</span> <span class="hljs-number">200</span></code></pre><p>从vlan10和vlan20的PC分别向各自的vlan发包可以看到数据包内容</p><ul><li>vlan10</li></ul><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E6%8A%A5%E6%96%873.webp" srcset="/images/img/loading.gif" alt="报文3"></p><ul><li>vlan20</li></ul><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/vlan20.webp" srcset="/images/img/loading.gif" alt="vlan20"><br>当两台PC机正常通信的时候可以看到不同vlan封装的外层vlan tag也是不一样的。这就是基于vlan的灵活QinQ。</p><h2 id="上述拓扑"><a href="#上述拓扑" class="headerlink" title="上述拓扑"></a>上述拓扑</h2><ul><li><a target="_blank" rel="noopener" href="http://cloud.defect.ink/s/s9l4h9rx">灵活QinQ</a></li><li><a target="_blank" rel="noopener" href="http://cloud.defect.ink/s/5ttw9ett">接口QinQ</a></li></ul><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul><li><a target="_blank" rel="noopener" href="http://www.023wg.com/message/message/cd_feature_eth_qinq.html">QinQ帧格式</a></li><li><a target="_blank" rel="noopener" href="https://blog.csdn.net/qq_38265137/article/details/80404320">QinQ基础知识</a></li></ul></div><hr><div><div class="post-metas mb-3"><div class="post-meta mr-3"><i class="iconfont icon-category"></i> <a class="hover-with-bg" href="/categories/%E7%BD%91%E7%BB%9C/">网络</a></div><div class="post-meta"><i class="iconfont icon-tags"></i> <a class="hover-with-bg" href="/tags/Network/">Network</a></div></div><p class="note note-warning"><a target="_blank" href="https://zh.wikipedia.org/wiki/Wikipedia:CC_BY-SA_3.0%E5%8D%8F%E8%AE%AE%E6%96%87%E6%9C%AC" rel="nofollow noopener noopener">CC BY-SA 3.0❤</a></p><div class="post-prevnext row"><article class="post-prev col-6"><a href="/defect/auto-backup.html"><i class="iconfont icon-arrowleft"></i> <span class="hidden-mobile">自动备份大法</span> <span class="visible-mobile">上一篇</span></a></article><article class="post-next col-6"><a href="/defect/fixed-inotify-watch-not-enough.html"><span class="hidden-mobile">解决inotify watch不够⌚</span> <span class="visible-mobile">下一篇</span><i class="iconfont icon-arrowright"></i></a></article></div></div><article class="comments" id="comments"><div id="vcomments"></div><script type="text/javascript">function loadValine(){addScript("https://cdn.defectink.com/static/valine/1.4.14/Valine.min.js",function(){new Valine({el:"#vcomments",app_id:"dD9t7mcIBVzJWag5ez6GPy2v-MdYXbMMI",app_key:"bWG6pmKsEscrH4JjrpNNAAy6",placeholder:"嘤嘤嘤???",path:window.location.pathname,avatar:"retro",meta:["nick","mail","link"],pageSize:"10",lang:"zh-CN",highlight:!0,recordIP:!1,serverURLs:""})})}waitElementVisible("vcomments",loadValine)</script><noscript>Please enable JavaScript to view the <a target="_blank" href="https://valine.js.org" rel="nofollow noopener noopener">comments powered by Valine.</a></noscript></article></article></div></div></div><div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn"><div id="toc"><p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;目录</p><div id="tocbot"></div></div></div></div></div></main><a id="scroll-top-button" href="#" role="button"><i class="iconfont icon-arrowup" aria-hidden="true"></i></a><div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel" aria-hidden="true"><div class="modal-dialog modal-dialog-scrollable modal-lg" role="document"><div class="modal-content"><div class="modal-header text-center"><h4 class="modal-title w-100 font-weight-bold">搜索</h4><button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button></div><div class="modal-body mx-3"><div class="md-form mb-5"><input type="text" id="local-search-input" class="form-control validate"> <label data-error="x" data-success="v" for="local-search-input">关键词</label></div><div class="list-group" id="local-search-result"></div></div></div></div></div><footer class="text-center mt-5 py-3"><div class="footer-content"><a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a><i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a></div><div class="beian"><a href="http://beian.miit.gov.cn/" target="_blank" rel="nofollow noopener">皖ICP备17017808号</a></div></footer><script src="https://cdn.defectink.com/static/jquery/3.4.1/jquery.min.js"></script><script src="https://cdn.defectink.com/static/twitter-bootstrap/4.5.3/js/bootstrap.min.js"></script><script src="/js/debouncer.js"></script><script src="/js/main.js"></script><script src="/js/lazyload.js"></script><script defer="defer" src="https://cdn.defectink.com/static/clipboard.js/2.0.6/clipboard.min.js"></script><script src="/js/clipboard-use.js"></script><script src="/js/xfy.js"></script><script src="https://cdn.defectink.com/static/tocbot/4.11.1/tocbot.min.js"></script><script>$(document).ready(function(){var t=$("#board-ctn").offset().top;tocbot.init({tocSelector:"#tocbot",contentSelector:"#post-body",headingSelector:"h1,h2,h3,h4,h5,h6",linkClass:"tocbot-link",activeLinkClass:"tocbot-active-link",listClass:"tocbot-list",isCollapsedClass:"tocbot-is-collapsed",collapsibleClass:"tocbot-is-collapsible",collapseDepth:3,scrollSmooth:!0,headingsOffset:-t}),0<$(".toc-list-item").length&&$("#toc").css("visibility","visible")})</script><script src="https://cdn.defectink.com/static/typed.js/2.0.11/typed.min.js"></script><script>var typed=new Typed("#subtitle",{strings:[" ","QinQ基础操作&nbsp;"],cursorChar:"❤",typeSpeed:70,loop:!1});typed.stop(),$(document).ready(function(){$(".typed-cursor").addClass("h2"),typed.start()})</script><script src="/js/local-search.js"></script><script>var path="/xml/local-search.xml",inputArea=document.querySelector("#local-search-input");inputArea.onclick=function(){searchFunc(path,"local-search-input","local-search-result"),this.onclick=null}</script><script src="https://cdn.defectink.com/static/fancybox/3.5.7/jquery.fancybox.min.js"></script><link rel="stylesheet" href="https://cdn.defectink.com/static/fancybox/3.5.7/jquery.fancybox.min.css"><script>$("#post img:not(.no-zoom img, img[no-zoom]), img[zoom]").each(function(){var t=document.createElement("a");$(t).attr("data-fancybox","images"),$(t).attr("href",$(this).attr("src")),$(this).wrap(t)})</script><script src="https://cdn.defectink.com/static/mermaid/8.5.0/mermaid.min.js"></script><script>window.mermaid&&mermaid.initialize({theme:"default"})</script></body></html>