<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>尘埃</title>
  
  <subtitle>一万年太久  &lt;br&gt; 只争朝夕</subtitle>
  <link href="http://deconf.xyz/atom.xml" rel="self"/>
  
  <link href="http://deconf.xyz/"/>
  <updated>2023-11-17T04:51:10.837Z</updated>
  <id>http://deconf.xyz/</id>
  
  <author>
    <name>Deconf</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>linux-bluetooth-console</title>
    <link href="http://deconf.xyz/2023/11/16/linux-bluetooth-console/"/>
    <id>http://deconf.xyz/2023/11/16/linux-bluetooth-console/</id>
    <published>2023-11-16T07:39:51.000Z</published>
    <updated>2023-11-17T04:51:10.837Z</updated>
    
    <content type="html"><![CDATA[# linux 下如何使用蓝牙console<p>本文基于Arch linux.</p><span id="more"></span><h2 id="安装基础软件"><a href="#安装基础软件" class="headerlink" title="安装基础软件"></a>安装基础软件</h2><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> pacman -S bluez bluez-utils-compat</span><br></pre></td></tr></tbody></table></figure><h2 id="配对"><a href="#配对" class="headerlink" title="配对"></a>配对</h2><ul><li>注意,由于 BLE_SPP 无法完成连接,因此只达到可连接状态即可</li></ul><p>即状态如下即可</p><p><img src="/2023/11/16/linux-bluetooth-console/bluetooth-status.png" alt="img"></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 命令行方式</span></span><br><span class="line"><span class="comment"># systemctl start bluetooth</span></span><br><span class="line"><span class="comment"># bluetoothctl</span></span><br><span class="line">Agent registered</span><br><span class="line">[bluetooth]# power on</span><br><span class="line">[bluetooth]# agent on</span><br><span class="line">[bluetooth]# scan on</span><br><span class="line">... <span class="built_in">wait</span> ...</span><br><span class="line">[bluetooth]# scan off</span><br><span class="line">[bluetooth]# pair &lt;dev-mac&gt;</span><br></pre></td></tr></tbody></table></figure><h2 id="创建虚拟串口"><a href="#创建虚拟串口" class="headerlink" title="创建虚拟串口"></a>创建虚拟串口</h2><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rfcomm <span class="built_in">bind</span> 0 &lt;dev-mac&gt;</span><br></pre></td></tr></tbody></table></figure><p><code>ls /dev/rfcomm0</code> 可看到虚拟console设备</p><h2 id="连接虚拟console-口"><a href="#连接虚拟console-口" class="headerlink" title="连接虚拟console 口"></a>连接虚拟console 口</h2><ul><li><p>使用虚拟终端软件 <code>minicom</code> 连接虚拟终端 <code> /dev/rfcomm0</code></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ minicom -s #设置各项参数,串行设备,比特率等 进行连接</span><br></pre></td></tr></tbody></table></figure></li><li><p>也可使用支持串口的终端,eg: <code>tabby</code><br><img src="/2023/11/16/linux-bluetooth-console/connect-rfcomm.png"></p></li></ul><h2 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h2><p><img src="/2023/11/16/linux-bluetooth-console/rfcomm.png"></p>]]></content>
    
    
    <summary type="html"># linux 下如何使用蓝牙console


&lt;p&gt;本文基于Arch linux.&lt;/p&gt;</summary>
    
    
    
    <category term="Linux" scheme="http://deconf.xyz/categories/Linux/"/>
    
    
    <category term="console,switch,linux" scheme="http://deconf.xyz/tags/console-switch-linux/"/>
    
  </entry>
  
  <entry>
    <title>zabbix-dingdingtalk-bot</title>
    <link href="http://deconf.xyz/2023/11/16/zabbix-dingdingtalk-bot/"/>
    <id>http://deconf.xyz/2023/11/16/zabbix-dingdingtalk-bot/</id>
    <published>2023-11-16T01:53:22.000Z</published>
    <updated>2023-11-17T04:52:54.027Z</updated>
    
    <content type="html"><![CDATA[# zabbix 对接钉钉企业内部机器人<p>由于钉钉自定义机器人下线 <span class="exturl" data-url="aHR0cHM6Ly9vcGVuLmRpbmd0YWxrLmNvbS9kb2N1bWVudC9vcmdhcHAvd2ViaG9vay1ib3Qtb2ZmbGluZS1ub3RpY2U=">见此<i class="fa fa-external-link-alt"></i></span>.新同事需要无法再添加告警机器人,需要通过另一种方式实现钉钉机器人和zabbix告警对接.通过查阅,可以发现使用钉钉付费的企业内部机器人也可以进行告警通知.下文主要描述实现方式.</p><span id="more"></span><h2 id="获取权限"><a href="#获取权限" class="headerlink" title="获取权限"></a>获取权限</h2><ol><li>获取企业内部开发者权限</li><li>创建钉钉应用—开通机器人</li><li>机器人授予相关权限,请见钉钉<span class="exturl" data-url="aHR0cHM6Ly9vcGVuLmRpbmd0YWxrLmNvbS9kb2N1bWVudC9vcmdhcHAvY2FsbC1yb2JvdC1hcGktb3BlcmF0aW9ucw==">开发者文档<i class="fa fa-external-link-alt"></i></span></li><li>记录关键信息. 包括应用 <code>Client ID</code> <code>Client Secret</code> <code> RobotCode</code></li><li>机器人消息接收模式此项不需要勾选(此为服务端接受消息通道)</li></ol><h2 id="告警脚本实现"><a href="#告警脚本实现" class="headerlink" title="## 告警脚本实现"></a>## 告警脚本实现</h2><p>放置于zabbix server  的 <code>alertscripts</code> 相关目录下</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#! /usr/bin/python3</span></span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> logging</span><br><span class="line"><span class="keyword">import</span> ast</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置常量</span></span><br><span class="line">API_BASE_URL = <span class="string">"https://api.dingtalk.com/v1.0"</span></span><br><span class="line">APP_KEY = <span class="string">"*************"</span></span><br><span class="line">APP_SECRET = <span class="string">"************************"</span></span><br><span class="line">ROBOT_CODE = <span class="string">"********************"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_access_token</span>():</span><br><span class="line">    url = <span class="string">f"<span class="subst">{API_BASE_URL}</span>/oauth2/accessToken"</span></span><br><span class="line">    headers = {<span class="string">"Content-Type"</span>: <span class="string">"application/json"</span>}</span><br><span class="line">    data = {<span class="string">"appKey"</span>: APP_KEY, <span class="string">"appSecret"</span>: APP_SECRET}</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        response = requests.post(url, json=data, headers=headers)</span><br><span class="line">        response.raise_for_status()</span><br><span class="line">        json_response = response.json()</span><br><span class="line">        <span class="keyword">return</span> json_response.get(<span class="string">"accessToken"</span>)</span><br><span class="line">    <span class="keyword">except</span> requests.exceptions.RequestException <span class="keyword">as</span> e:</span><br><span class="line">        logging.error(<span class="string">f"Error getting access token: <span class="subst">{e}</span>"</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">send_to_message</span>(<span class="params">access_token, user_ids, msg_param_data</span>):</span><br><span class="line">    url = <span class="string">f"<span class="subst">{API_BASE_URL}</span>/robot/oToMessages/batchSend"</span></span><br><span class="line">    headers = {<span class="string">"Content-Type"</span>: <span class="string">"application/json"</span>, <span class="string">"x-acs-dingtalk-access-token"</span>: access_token}</span><br><span class="line">    data = {<span class="string">"robotCode"</span>: ROBOT_CODE, <span class="string">"userIds"</span>: user_ids, <span class="string">"msgKey"</span>: <span class="string">"officialMarkdownMsg"</span>, <span class="string">"msgParam"</span>: msg_param_data}</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        response = requests.post(url, json=data, headers=headers)</span><br><span class="line">        response.raise_for_status()</span><br><span class="line">        <span class="built_in">print</span>(response.text)</span><br><span class="line">    <span class="keyword">except</span> requests.exceptions.RequestException <span class="keyword">as</span> e:</span><br><span class="line">        logging.error(<span class="string">f"Error sending message: <span class="subst">{e}</span>"</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_user_id</span>(<span class="params">access_token, phone</span>):</span><br><span class="line">    url = <span class="string">f"<span class="subst">{API_BASE_URL}</span>/topapi/v2/user/getbymobile?access_token=<span class="subst">{access_token}</span>"</span></span><br><span class="line">    headers = {<span class="string">"Content-Type"</span>: <span class="string">"application/json"</span>}</span><br><span class="line">    data = {<span class="string">"mobile"</span>: phone}</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        response = requests.post(url, json=data, headers=headers)</span><br><span class="line">        response.raise_for_status()</span><br><span class="line">        json_response = response.json()</span><br><span class="line">        <span class="keyword">return</span> json_response.get(<span class="string">"result"</span>, {}).get(<span class="string">"userid"</span>)</span><br><span class="line">    <span class="keyword">except</span> requests.exceptions.RequestException <span class="keyword">as</span> e:</span><br><span class="line">        logging.error(<span class="string">f"Error getting user ID: <span class="subst">{e}</span>"</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_trigger_color</span>(<span class="params">severity</span>):</span><br><span class="line">    color_dict = {</span><br><span class="line">        <span class="string">"Not classified"</span>: <span class="string">"#808080"</span>,</span><br><span class="line">        <span class="string">"Information"</span>: <span class="string">"#008000"</span>,</span><br><span class="line">        <span class="string">"Warning"</span>: <span class="string">"#FFFF00"</span>,</span><br><span class="line">        <span class="string">"Average"</span>: <span class="string">"#FFA500"</span>,</span><br><span class="line">        <span class="string">"High"</span>: <span class="string">"#FF0000"</span>,</span><br><span class="line">        <span class="string">"Disaster"</span>: <span class="string">"#8B0000"</span>,</span><br><span class="line">        <span class="string">"default_color"</span>: <span class="string">"#808080"</span></span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> color_dict.get(severity, color_dict[<span class="string">"default_color"</span>])</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="comment"># 获取企业内部应用的accessToken</span></span><br><span class="line">    access_token = get_access_token()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> access_token:</span><br><span class="line">        logging.error(<span class="string">"Failed to obtain access token. Exiting."</span>)</span><br><span class="line">        sys.exit(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 获取用户手机号</span></span><br><span class="line">    phone_id = sys.argv[<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 根据用户手机号获取userid</span></span><br><span class="line">    user_id = get_user_id(access_token, phone_id)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> user_id:</span><br><span class="line">        logging.error(<span class="string">"Failed to obtain user ID. Exiting."</span>)</span><br><span class="line">        sys.exit(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    user_ids = [user_id]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 获取需要发送的消息</span></span><br><span class="line">    subject = sys.argv[<span class="number">2</span>]</span><br><span class="line">    message = sys.argv[<span class="number">3</span>]</span><br><span class="line"></span><br><span class="line">    message_data = json.loads(message)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 把字符串转为字典</span></span><br><span class="line">    message_dictionary  = ast.literal_eval(message)</span><br><span class="line">    HOSTNAME = <span class="string">': '</span>.join((<span class="string">'&gt; 告警主机'</span>,message_dictionary[<span class="string">"HOSTNAME"</span>]))</span><br><span class="line">    HOSTIP = <span class="string">': '</span>.join((<span class="string">'告警地址'</span>,message_dictionary[<span class="string">"HOSTIP"</span>]))</span><br><span class="line">    ITEMNAME = <span class="string">': '</span>.join((<span class="string">'监控项目'</span>,message_dictionary[<span class="string">"ITEMNAME"</span>]))</span><br><span class="line">    ITEMLASTVALUE = <span class="string">': '</span>.join((<span class="string">'监控取值'</span>,message_dictionary[<span class="string">"ITEMLASTVALUE"</span>]))</span><br><span class="line">    TRIGGERSEVERITY = <span class="string">': '</span>.join((<span class="string">'告警等级'</span>,message_dictionary[<span class="string">"TRIGGERSEVERITY"</span>]))</span><br><span class="line">    TRIGGERSTATUS = <span class="string">': '</span>.join((<span class="string">'当前状态'</span>,message_dictionary[<span class="string">"TRIGGERSTATUS"</span>]))</span><br><span class="line">    TRIGGERNAME = <span class="string">': '</span>.join((<span class="string">'告警信息'</span>,message_dictionary[<span class="string">"TRIGGERNAME"</span>]))</span><br><span class="line">    EVENTTIME = <span class="string">': '</span>.join((<span class="string">'告警时间'</span>,message_dictionary[<span class="string">"EVENTTIME"</span>]))</span><br><span class="line">    EVENTAGE = <span class="string">': '</span>.join((<span class="string">'持续时间'</span>,message_dictionary[<span class="string">"EVENTAGE"</span>]))</span><br><span class="line">    EVENTID = <span class="string">': '</span>.join((<span class="string">'事件ID'</span>,message_dictionary[<span class="string">"EVENTID"</span>]))</span><br><span class="line">    sendtext = <span class="string">'\n\n &gt;'</span>.join((HOSTNAME,HOSTIP,ITEMNAME,ITEMLASTVALUE,TRIGGERSEVERITY,TRIGGERSTATUS,TRIGGERNAME,EVENTTIME,EVENTAGE,EVENTID))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 获取触发器严重程度对应的颜色代码</span></span><br><span class="line">    trigger_severity = message_data.get(<span class="string">'TRIGGERSEVERITY'</span>, <span class="literal">None</span>)</span><br><span class="line">    rgb_code = get_trigger_color(trigger_severity)</span><br><span class="line"></span><br><span class="line">    msg_data = {</span><br><span class="line">    <span class="string">"title"</span>: <span class="string">"zabbix告警消息"</span>,</span><br><span class="line">    <span class="string">"text"</span>: <span class="string">''</span>.join((<span class="string">'&lt;font color='</span> + rgb_code + <span class="string">' '</span> + <span class="string">'face="黑体"&gt;'</span></span><br><span class="line">                     +</span><br><span class="line">                        subject</span><br><span class="line">                     +</span><br><span class="line">                     <span class="string">'&lt;/font&gt;'</span> </span><br><span class="line">                     +</span><br><span class="line">                     <span class="string">'\n\n'</span></span><br><span class="line">                     + </span><br><span class="line">                     sendtext </span><br><span class="line">                     + </span><br><span class="line">                    <span class="string">'\n\n'</span></span><br><span class="line">                    <span class="string">'#### [点击转到ZABBIX](https://zabbix.wenet.com.cn/)'</span></span><br><span class="line">                    ))</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 将字典转换为 JSON 格式的字符串</span></span><br><span class="line">    msg_data_string = json.dumps(msg_data)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 调用发送消息的接口</span></span><br><span class="line">    send_to_message(access_token, user_ids, msg_data_string)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 设置日志记录</span></span><br><span class="line">    logging.info(<span class="string">f"user_id: <span class="subst">{user_id}</span>"</span>)</span><br><span class="line">    logging.info(<span class="string">f"subject: <span class="subst">{subject}</span>"</span>)</span><br><span class="line">    logging.info(<span class="string">f"message: <span class="subst">{message}</span>"</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line">    main()</span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><h2 id="zabbix-配置"><a href="#zabbix-配置" class="headerlink" title="zabbix 配置"></a>zabbix 配置</h2><ol><li>建立新告警媒介:  ( 消息模板里面勾引问题以及问题恢复)<br><img src="/2023/11/16/zabbix-dingdingtalk-bot/Alarm-medium.png" alt="img"></li><li>动作中添加触发器动作:<br><img src="/2023/11/16/zabbix-dingdingtalk-bot/tigger-action.png" alt="img"><br> <img src="/2023/11/16/zabbix-dingdingtalk-bot/tigger-operate.png" alt="img"> <figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"> 主题:</span><br><span class="line">发生故障: {EVENT.NAME}</span><br><span class="line">消息:</span><br><span class="line">{</span><br><span class="line"> "HOSTNAME":"{HOST.NAME}",</span><br><span class="line"> "HOSTIP":"{HOST.IP}",</span><br><span class="line"> "ITEMNAME":"{ITEM.NAME}",</span><br><span class="line"> "ITEMLASTVALUE":"{ITEM.LASTVALUE}",</span><br><span class="line"> "TRIGGERSEVERITY":"{TRIGGER.SEVERITY}",</span><br><span class="line"> "TRIGGERSTATUS":"{TRIGGER.STATUS}",</span><br><span class="line"> "TRIGGERNAME":"{TRIGGER.NAME}",</span><br><span class="line"> "EVENTTIME":"{EVENT.DATE} {EVENT.TIME}",</span><br><span class="line"> "EVENTAGE":"{EVENT.AGE}",</span><br><span class="line"> "EVENTID":"{EVENT.ID}"</span><br><span class="line"> }</span><br></pre></td></tr></tbody></table></figure></li><li>在具体用户上添加告警媒介<br> <img src="/2023/11/16/zabbix-dingdingtalk-bot/user-report-medium.png" alt="img"></li></ol><h2 id="实现效果"><a href="#实现效果" class="headerlink" title="实现效果"></a>实现效果</h2><p><img src="/2023/11/16/zabbix-dingdingtalk-bot/Effect.png" alt="img"></p><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><ol><li><span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXIuYWxpeXVuLmNvbS9hcnRpY2xlLzg3NTYwMg==">如何优雅地用Python3发送Zabbix告警推送<i class="fa fa-external-link-alt"></i></span></li></ol>]]></content>
    
    
    <summary type="html"># zabbix 对接钉钉企业内部机器人


&lt;p&gt;由于钉钉自定义机器人下线 &lt;span class=&quot;exturl&quot; data-url=&quot;aHR0cHM6Ly9vcGVuLmRpbmd0YWxrLmNvbS9kb2N1bWVudC9vcmdhcHAvd2ViaG9vay1ib3Qtb2ZmbGluZS1ub3RpY2U=&quot;&gt;见此&lt;i class=&quot;fa fa-external-link-alt&quot;&gt;&lt;/i&gt;&lt;/span&gt;.新同事需要无法再添加告警机器人,需要通过另一种方式实现钉钉机器人和zabbix告警对接.通过查阅,可以发现使用钉钉付费的企业内部机器人也可以进行告警通知.下文主要描述实现方式.&lt;/p&gt;</summary>
    
    
    
    <category term="Zabbix,bot" scheme="http://deconf.xyz/categories/Zabbix-bot/"/>
    
    
    <category term="zabbix,bot" scheme="http://deconf.xyz/tags/zabbix-bot/"/>
    
  </entry>
  
  <entry>
    <title>windows11-pppoe-disconnect</title>
    <link href="http://deconf.xyz/2023/06/21/windows11-pppoe-disconnect/"/>
    <id>http://deconf.xyz/2023/06/21/windows11-pppoe-disconnect/</id>
    <published>2023-06-21T08:31:25.000Z</published>
    <updated>2023-11-17T04:52:21.314Z</updated>
    
    <content type="html"><![CDATA[<h1 id="win-11-系统pppoe-掉线"><a href="#win-11-系统pppoe-掉线" class="headerlink" title="win 11 系统pppoe 掉线"></a>win 11 系统pppoe 掉线</h1><p>win11 系统在内网进行pppoe拨号,拨号完成大概3-10秒后会立即断开连接. 在BRAS 看上看到是下线原因为 <code>User-request</code> ,尝试使用win10,linux,未出现相同故障,判断为系统因素.</p><span id="more"></span><h2 id="排查如下"><a href="#排查如下" class="headerlink" title="排查如下:"></a>排查如下:</h2><ol><li>抓取<a href="pppoe-disconnect.pcap">数据包</a>分析.  仅发现客户端主动发起PADT 报文.未见ppp 异常报文.<br><img src="/2023/06/21/windows11-pppoe-disconnect/pppoe-disconnect.png"></li><li>查看win 下的事件查看器,仅有 <code>Rasclient </code> 客户端已停止信息.</li><li>排查win11 pppoe 拨号模块, 确认拨号模块为 <code>raspppoe.sys</code></li><li>尝试更换其他版本win <code>raspppoe.sys</code> 进行拨号,发现无法拨号.</li><li>怀疑win网络探测导致主动下线:<br>查询win网络探测机制:  <span class="exturl" data-url="aHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL3Ryb3VibGVzaG9vdC93aW5kb3dzLWNsaWVudC9uZXR3b3JraW5nL2ludGVybmV0LWV4cGxvcmVyLWVkZ2Utb3Blbi1jb25uZWN0LWNvcnBvcmF0ZS1wdWJsaWMtbmV0d29yayNuY3NpLWFjdGl2ZS1wcm9iZXMtYW5kLXRoZS1uZXR3b3JrLXN0YXR1cy1hbGVydA==">NCSI active probes<i class="fa fa-external-link-alt"></i></span></li><li>尝试禁用该探测机制</li><li>不再出现拨号后掉线问题,确认win11 pppoe模块加入联网探测机制.</li></ol><h2 id="修复办法"><a href="#修复办法" class="headerlink" title="修复办法:"></a>修复办法:</h2><p>依据官网 <code>NCSI active probes</code> 相关注册表项目,写了一个简单bat脚本处理该问题.</p><p>下载下述文件运行<br><a href="%E6%8E%89%E7%BA%BF%E4%BF%AE%E5%A4%8D.bat">掉线修复</a></p><p>内容如下:</p><figure class="highlight bat"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">@<span class="built_in">echo</span> off</span><br><span class="line">%<span class="number">1</span> mshta vbscript:CreateObject("Shell.Application").ShellExecute("<span class="built_in">cmd</span>.exe","/c %~s0 ::","","runas",<span class="number">1</span>)(window.close)&amp;&amp;<span class="keyword">exit</span>                ::以管理员的身份运行<span class="built_in">cmd</span>，其中runas有提权的作用，成功后关闭退出</span><br><span class="line"></span><br><span class="line">:main</span><br><span class="line"><span class="built_in">cls</span>                               ::清屏</span><br><span class="line"></span><br><span class="line">reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet" /v EnableActiveProbing /t REG_DWORD /d "<span class="number">0</span>" /f</span><br><span class="line">reg add "HKLM\Software\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" /v NoActiveProbe /t  REG_DWORD /d "<span class="number">0</span>" /f</span><br><span class="line">reg add "HKLM\Software\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" /v DisablePassivePolling /t REG_DWORD /d "<span class="number">0</span>" /f</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span>.-----------------------------------------------------------</span><br><span class="line"><span class="built_in">echo</span>.</span><br><span class="line"><span class="built_in">echo</span>.</span><br><span class="line"><span class="built_in">echo</span> 已修复掉线问题</span><br><span class="line"><span class="built_in">echo</span>.</span><br><span class="line"><span class="keyword">goto</span> end</span><br><span class="line"></span><br><span class="line">:end</span><br><span class="line"><span class="built_in">echo</span> 请按任意键退出。</span><br><span class="line">@<span class="built_in">Pause</span>&gt;<span class="built_in">nul</span>          ::&gt;<span class="built_in">nul</span>表示不显示前面命令的结果信息</span><br><span class="line"></span><br><span class="line"><span class="built_in">ipconfig</span> /flushdns</span><br></pre></td></tr></tbody></table></figure><h2 id="吐槽"><a href="#吐槽" class="headerlink" title="吐槽"></a>吐槽</h2><p>win11 是真的烂,这么重要的变更居然官网找不到任何信息,排查的时候简直把人头都想秃了!</p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;win-11-系统pppoe-掉线&quot;&gt;&lt;a href=&quot;#win-11-系统pppoe-掉线&quot; class=&quot;headerlink&quot; title=&quot;win 11 系统pppoe 掉线&quot;&gt;&lt;/a&gt;win 11 系统pppoe 掉线&lt;/h1&gt;&lt;p&gt;win11 系统在内网进行pppoe拨号,拨号完成大概3-10秒后会立即断开连接. 在BRAS 看上看到是下线原因为 &lt;code&gt;User-request&lt;/code&gt; ,尝试使用win10,linux,未出现相同故障,判断为系统因素.&lt;/p&gt;</summary>
    
    
    
    <category term="Windows" scheme="http://deconf.xyz/categories/Windows/"/>
    
    
  </entry>
  
  <entry>
    <title>nftables-port-policy</title>
    <link href="http://deconf.xyz/2022/06/27/nftables-port-policy/"/>
    <id>http://deconf.xyz/2022/06/27/nftables-port-policy/</id>
    <published>2022-06-27T05:21:46.000Z</published>
    <updated>2022-06-27T05:21:46.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Nftables-防火墙端口策略"><a href="#Nftables-防火墙端口策略" class="headerlink" title="Nftables 防火墙端口策略"></a>Nftables 防火墙端口策略</h1><p>服务器上搭建了KMS激活服务器，但是由于国外版权保护和DMCA 限制，我需要限制国外ip访问我的服务器1688 端口，网上大部分关于这方面问题的教程采取了ipset + iptables 的解决方案，暂无nftables解决方案，所以写一篇供大家参考。</p><span id="more"></span><h1 id="获取nft-geoip-脚本"><a href="#获取nft-geoip-脚本" class="headerlink" title="获取nft_geoip 脚本"></a>获取nft_geoip 脚本</h1><p>来源:  <span class="exturl" data-url="aHR0cHM6Ly93aWtpLm5mdGFibGVzLm9yZy93aWtpLW5mdGFibGVzL2luZGV4LnBocC9HZW9JUF9tYXRjaGluZw==">https://wiki.nftables.org/wiki-nftables/index.php/GeoIP_matching<i class="fa fa-external-link-alt"></i></span></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mkdir /opt/script/nft-geoip</span></span><br><span class="line"><span class="comment"># git clone https://github.com/pvxe/nftables-geoip.git /opt/script/nft-geoip </span></span><br><span class="line"><span class="comment"># mkdir -p /etc/nft.d</span></span><br></pre></td></tr></tbody></table></figure><h1 id="构建定时更新脚本"><a href="#构建定时更新脚本" class="headerlink" title="构建定时更新脚本"></a>构建定时更新脚本</h1><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># sudo vim  /etc/systemd/system/nft-geoip.service</span><br></pre></td></tr></tbody></table></figure><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=Nftables GeoIP </span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">User=root</span><br><span class="line">Type=oneshot</span><br><span class="line">ExecStart=/usr/bin/python3 /opt/script/nft-geoip/nft_geoip.py  --file-location /opt/script/nft-geoip/location.csv  -d -o /etc/nft.d/</span><br><span class="line">ExecStartPost= /usr/sbin/nft -f /etc/nftables.conf</span><br></pre></td></tr></tbody></table></figure><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># sudo vim /etc/systemd/system/nft-geoip.timer</span><br></pre></td></tr></tbody></table></figure><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=Every Friday AM 3:00 renewal of  nftables geoip</span><br><span class="line"></span><br><span class="line">[Timer]</span><br><span class="line">OnCalendar=Fri *-*-* 03:00:00</span><br><span class="line">RandomizedDelaySec=1h</span><br><span class="line">Persistent=true</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=timers.target</span><br></pre></td></tr></tbody></table></figure><h1 id="参考配置"><a href="#参考配置" class="headerlink" title="参考配置"></a>参考配置</h1><p>nftables 引用geoip区域文件做区域限制<br>给出我的 inet filter  input 示例以供参考： </p><div class="note info"><p>载入文件较大，需要超过 300M 的可用内存空间！！！</p></div><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/sbin/nft -f</span><br><span class="line"># vim:set ts=2 sw=2 et:</span><br><span class="line"></span><br><span class="line"># IPv4/IPv6 Simple &amp; Safe firewall ruleset.</span><br><span class="line"># More examples in /usr/share/nftables/ and /usr /share/doc/nftables/examples/.</span><br><span class="line"></span><br><span class="line"># A simple firewall</span><br><span class="line"></span><br><span class="line">flush ruleset</span><br><span class="line"></span><br><span class="line">table inet filter {</span><br><span class="line">include "/etc/nft.d/geoip-def-all.nft"</span><br><span class="line">include "/etc/nft.d/geoip-ipv4.nft"</span><br><span class="line">include "/etc/nft.d/geoip-ipv6.nft"</span><br><span class="line">    chain input {</span><br><span class="line">        type filter hook input priority 0; policy drop;</span><br><span class="line"></span><br><span class="line">        # insert geoip map</span><br><span class="line">        meta mark set ip saddr map @geoip4</span><br><span class="line">        meta mark set ip6 saddr map @geoip6</span><br><span class="line"></span><br><span class="line">        # established/related connections</span><br><span class="line">        ct state established,related accept</span><br><span class="line"></span><br><span class="line">        # invalid connections</span><br><span class="line">        # ct state invalid drop</span><br><span class="line"></span><br><span class="line">        # loopback interface</span><br><span class="line">        iif lo accept</span><br><span class="line"></span><br><span class="line">        # ICMP &amp; IGMP</span><br><span class="line">        ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, mld-listener-query, mld-listener-report, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert, mld2-listener-report } accept</span><br><span class="line">        ip protocol icmp icmp type { destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem } accept</span><br><span class="line">        ip protocol igmp accept</span><br><span class="line">        ip protocol icmp accept</span><br><span class="line"></span><br><span class="line">        # SSH (port 22)</span><br><span class="line">        # recommend nftables geoip zones limit </span><br><span class="line">        meta mark $CN tcp dport ssh log prefix "cn-zones-ssh-accept" counter packets 0 bytes 0 accept </span><br><span class="line"></span><br><span class="line">        # HTTP (ports 80 &amp; 443)</span><br><span class="line">        tcp dport { http, https }  accept </span><br><span class="line">        # vlmcsd -- Windows Key Management Services</span><br><span class="line">        # recommend nftables geoip zones limit </span><br><span class="line">        meta mark $CN tcp dport 1688  log prefix "cn-zones-kms-accept" counter packets 0 bytes 0  accept </span><br><span class="line">        # count and drop any other traffic </span><br><span class="line">        counter packets 0 bytes 0 drop </span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h1 id="效果展示"><a href="#效果展示" class="headerlink" title="效果展示"></a>效果展示</h1><p>如图：</p><p><img src="/2022/06/27/nftables-port-policy/result.png"></p><h1 id="错误示例："><a href="#错误示例：" class="headerlink" title="错误示例："></a>错误示例：</h1><p>网上有大量从apnic获取国内ip地址端的示例： </p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cn_ipv4=$(curl http://ftp.apnic.net/stats/apnic/delegated-apnic-latest | awk -F '|' '/CN/&amp;&amp;/ipv4/ {print $4 "/" 32-log($5)/log(2)}' )  </span><br></pre></td></tr></tbody></table></figure><p>错误示例： <del>cn_ipv6=$(curl <span class="exturl" data-url="aHR0cDovL2Z0cC5hcG5pYy5uZXQvc3RhdHMvYXBuaWMvZGVsZWdhdGVkLWFwbmljLWxhdGVzdA==">http://ftp.apnic.net/stats/apnic/delegated-apnic-latest<i class="fa fa-external-link-alt"></i></span> | awk -F ‘|’ ‘/CN/&amp;&amp;/ipv6/ {print $4 “/“ 32-log($5)/log(2)}’ )</del></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cn_ipv6=$(curl http://ftp.apnic.net/stats/apnic/delegated-apnic-latest | awk -F '|' '/CN/&amp;&amp;/ipv6/ {print $4 "/" $5 }'  </span><br></pre></td></tr></tbody></table></figure><p>ipv4 子网掩码可通过 32- 分配位数2的对数取余 获取，ipv6 掩码也这么算，明显是错误的,例如会算出这样一个奇怪的掩码：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">240a:6000::/27.415</span><br></pre></td></tr></tbody></table></figure><p>可见，大部分都，没有思考ipv4 地址端计算方式，<br>ipv6 合适的地址段表示：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">apnic|CN|ipv6|2001:7fa:5::|48|20031106|assigned</span><br><span class="line">转换为：</span><br><span class="line">2001:7fa:5::-2001:7fa:5:ffff:ffff:ffff:ffff:ffff </span><br><span class="line">2001:7fa:5::/48 </span><br></pre></td></tr></tbody></table></figure><h1 id="F-A"><a href="#F-A" class="headerlink" title="F &amp; A:"></a>F &amp; A:</h1><ul><li>为何不使用iptables + ipset ？</li></ul><p>debian 12 自带的防火墙为nft,并且主流发行版新版本后端都采用了nft,这篇文章是学习nft用法。另外nft 可以省略ip6tables 规则的书写，直接使用inet表覆盖了ip和ip6.</p><ul><li>这个场景下nft 性能更好?</li></ul><p>性能比较见 <span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXJzLnJlZGhhdC5jb20vYmxvZy8yMDE3LzA0LzExL2JlbmNobWFya2luZy1uZnRhYmxlcyNtYXRjaGluZ19hX2NvbWJpbmF0aW9uX29mX2FkZHJlc3NfYW5kX3BvcnQ=">redhat-benchmarking-nftables<i class="fa fa-external-link-alt"></i></span><br>可见iptables如果规则写的好，不要有太多的jump和goto,性能甚至比nftables略胜一筹</p><ul><li>iptables 如何实现？</li></ul><p>可以使用iptables + ipset 实现，你可以google搜索，相信相关blog很多。</p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;Nftables-防火墙端口策略&quot;&gt;&lt;a href=&quot;#Nftables-防火墙端口策略&quot; class=&quot;headerlink&quot; title=&quot;Nftables 防火墙端口策略&quot;&gt;&lt;/a&gt;Nftables 防火墙端口策略&lt;/h1&gt;&lt;p&gt;服务器上搭建了KMS激活服务器，但是由于国外版权保护和DMCA 限制，我需要限制国外ip访问我的服务器1688 端口，网上大部分关于这方面问题的教程采取了ipset + iptables 的解决方案，暂无nftables解决方案，所以写一篇供大家参考。&lt;/p&gt;</summary>
    
    
    
    <category term="Linux" scheme="http://deconf.xyz/categories/Linux/"/>
    
    
    <category term="Linux,firewall,nftables" scheme="http://deconf.xyz/tags/Linux-firewall-nftables/"/>
    
  </entry>
  
  <entry>
    <title>Linux下 VirtualBox 启动本地磁盘上的其它系统</title>
    <link href="http://deconf.xyz/2021/03/16/start-local-other-os-in-virtualbox/"/>
    <id>http://deconf.xyz/2021/03/16/start-local-other-os-in-virtualbox/</id>
    <published>2021-03-16T14:30:00.000Z</published>
    <updated>2021-03-16T14:30:00.000Z</updated>
    
    <content type="html"><![CDATA[---<h1 id="使用-VirtualBox-启动本地磁盘上的其它系统"><a href="#使用-VirtualBox-启动本地磁盘上的其它系统" class="headerlink" title="使用 VirtualBox 启动本地磁盘上的其它系统"></a>使用 VirtualBox 启动本地磁盘上的其它系统</h1><span id="more"></span><h2 id="Virtualbox直接运行物理分区的系统"><a href="#Virtualbox直接运行物理分区的系统" class="headerlink" title="Virtualbox直接运行物理分区的系统"></a>Virtualbox直接运行物理分区的系统</h2><ol><li>创建虚拟硬盘<br>首先查看下分区情况，我的如下<figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">/dev/nvme0n1p1      2048   2099199   2097152    1G EFI 系统</span><br><span class="line">/dev/nvme0n1p2   2099200   3147775   1048576  512M Microsoft 保留</span><br><span class="line">/dev/nvme0n1p3   3147776   4196351   1048576  512M Windows 恢复环境</span><br><span class="line">/dev/nvme0n1p4   4196352 318769151 314572800  150G Microsoft 基本数据</span><br></pre></td></tr></tbody></table></figure></li></ol><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#将当前用户加入到vboxusers,disk用户组</span></span><br><span class="line"><span class="built_in">sudo</span> usermod -G vboxusers,disk -a `<span class="built_in">whoami</span>`</span><br><span class="line">VBoxManage internalcommands createrawvmdk -filename windows.vmdk -rawdisk /dev/nvme0n1 -partitions 1,2,3,4 -relative</span><br></pre></td></tr></tbody></table></figure><p>现在你得到了 <code>windows.vmdk</code> 和 <code>windows-pt.vmdk</code> 的虚拟磁盘<br>2. 加入虚拟磁盘到Virtualbox<br>移动 虚拟磁盘文件到 <code>/opt/virtualbox/Windows</code> 下，在Virtualbox中注册 管理—&gt;虚拟介质管理—&gt; 注册 windwos.vmdk<br>3. 启动虚拟机<br>注意下如果是EFI引导，记得虚拟机选项勾选，就ok了，同理windows下的D盘，E盘也可按照相同方法添加，不过多叙述！</p><p>参考：</p><p><span class="exturl" data-url="aHR0cHM6Ly9zdXBlcnVzZXIuY29tL3F1ZXN0aW9ucy80OTUwMjUvdXNlLXBoeXNpY2FsLWhhcmRkaXNrLWluLXZpcnR1YWwtYm94">https://superuser.com/questions/495025/use-physical-harddisk-in-virtual-box<i class="fa fa-external-link-alt"></i></span></p>]]></content>
    
    
    <summary type="html">---
&lt;h1 id=&quot;使用-VirtualBox-启动本地磁盘上的其它系统&quot;&gt;&lt;a href=&quot;#使用-VirtualBox-启动本地磁盘上的其它系统&quot; class=&quot;headerlink&quot; title=&quot;使用 VirtualBox 启动本地磁盘上的其它系统&quot;&gt;&lt;/a&gt;使用 VirtualBox 启动本地磁盘上的其它系统&lt;/h1&gt;</summary>
    
    
    
    <category term="虚拟机，Linux" scheme="http://deconf.xyz/categories/%E8%99%9A%E6%8B%9F%E6%9C%BA%EF%BC%8CLinux/"/>
    
    
    <category term="虚拟化，VirtualBox" scheme="http://deconf.xyz/tags/%E8%99%9A%E6%8B%9F%E5%8C%96%EF%BC%8CVirtualBox/"/>
    
  </entry>
  
  <entry>
    <title>阿里云安装Arch Linux</title>
    <link href="http://deconf.xyz/2019/09/06/dd-aliyun/"/>
    <id>http://deconf.xyz/2019/09/06/dd-aliyun/</id>
    <published>2019-09-06T12:54:42.000Z</published>
    <updated>2019-09-06T12:54:42.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前记"><a href="#前记" class="headerlink" title="前记"></a>前记</h1><p>一直在想入手一台国内服务器,做流量中继<br>9月3日,阿里云活动好像有漏洞,免费拿到了200元的免门槛代金券,果断入手一台</p><span id="more"></span><h1 id="闲聊"><a href="#闲聊" class="headerlink" title="闲聊"></a>闲聊</h1><ol><li>作为一个Archer怎么能忍受Linux发行版不是Arch呢?以及不想后台有阿里系的毒瘤监控,想要一个干干静静的系统,开始了我的折腾</li><li>使用著名的<a href="">vps2arch</a>,<a href="">digitalocean-debian-to-arch</a>项目都不行,脚本根本跑不起来,不知道阿里做了啥操作</li><li>常规操作 阅读<span class="exturl" data-url="aHR0cHM6Ly9ibG9nLnBob2VuaXhsenguY29tLzIwMTgvMDIvMDEvYnVpbGQtYXJjaGxpbnV4LWltYWdlLXRlbXBsYXRlLWZvci1hbGl5dW4v">凤凰酱的文章<i class="fa fa-external-link-alt"></i></span>,按照阿里要求制作启动镜像,在用oss上传,啊 ,感觉步骤真繁琐,而且阿里肯定要在系统里塞私货 </li><li>然后我在<span class="exturl" data-url="aHR0cHM6Ly90Lm1lL2FyY2hsaW51eGNuX2dyb3Vw">archlinux-cn<i class="fa fa-external-link-alt"></i></span>group提问,非常感谢[Whyme Lyu]的回答,提供一种全新思路,本文基于谈话和<span class="exturl" data-url="aHR0cHM6Ly93d3cuamlhbnNodS5jb20vcC9iOTg0MTJiNWZlNjk=">文章<i class="fa fa-external-link-alt"></i></span>补充整理而成</li><li>大致流程:<br>     1. debian 改 grub.cfg 加 arch linux iso<br>     2. 启动arch iso载入到内存中<br>     3. 使用内存中的系统格式化物理磁盘<br>     4. 安装Arch linux</li></ol><h1 id="开始操作"><a href="#开始操作" class="headerlink" title="开始操作"></a>开始操作</h1><p><code>   默认系统: debain 9 </code></p><h2 id="准备操作"><a href="#准备操作" class="headerlink" title="准备操作"></a>准备操作</h2><ol><li>note: 内部主机特有的网络需要记录<br>2.我们需要做的就是搞定内网网络就OK了. 使用 <code>ip addr</code> 查看内网地址和子网掩码,使用 <code>ip route</code> 查看网关地址 ### 敲黑板,这些信息之后需要使用,需要记录</li></ol><h2 id="开始"><a href="#开始" class="headerlink" title="开始"></a>开始</h2><ol><li><p>下载Arch iso到根目录</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd /</span><br><span class="line">wget https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/archlinux-2019.09.01-x86_64.iso  #下载最新Arch操作系统</span><br></pre></td></tr></tbody></table></figure></li><li><p>硬核,直接改 <code>/boot/grub/grub.cfg</code></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">set timeout=60</span><br><span class="line">menuentry 'ArchISO' --class iso {</span><br><span class="line">  set isofile=/archlinux-2019.09.01-x86_64.iso</span><br><span class="line">  loopback loop0 $isofile</span><br><span class="line">  #archisolabel设置archiso文件驻留的文件系统标签。</span><br><span class="line">  #img_dev指明archiso文件驻留的设备</span><br><span class="line">  #img_loop是archiso文件在img_dev里的绝对位置</span><br><span class="line">  linux (loop0)/arch/boot/x86_64/vmlinuz archisolabel=ARCH20181201 img_dev=/dev/vda1 img_loop=$isofile</span><br><span class="line">  initrd (loop0)/arch/boot/x86_64/archiso.img</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>这个时候Arch iso就直接添加到启动项了<br>现在控制台vnc连接服务器,现在已经启动arch iso了</p></li><li><p>格盘,装Arch<br><code>df -h</code> 看下挂载情况<br>你会发现原来的物理磁盘已经挂载到了 <code>/run/archiso/img_dev</code><br>但是现在这个是只读的,需要使用 <code>mount -o remount,rw /run/archiso/img_dev</code> 重新可读挂载下,现在操作系统在内存上,所以可以放心的使用 <code>rm -rf /run/archiso/img_dev/*</code>了,等执行完成进去 <code>ls -al</code>看看,完全干净,nice!<br>现在 常规操作 <code>pacstrap /run/archiso/img_dev base base-devel</code><br>后续 arch-chroot …..不在详细说明!<br>另外阿里虚拟机系统是BIOS方式引导,grub如何安装,自行参照arch wiki<br>多提一句 arch-chroot 进去之后最好装上 <code>rng-tools</code>并<code>systemctl enable rngd --now</code> 增加熵值,不然你会发现重启系统后直接 <code>ssh </code>连接不上,原因就是随机数池耗尽,更多细节参见 <span class="exturl" data-url="aHR0cHM6Ly93aWtpLmFyY2hsaW51eC5vcmcvaW5kZXgucGhwL1JhbmRvbV9udW1iZXJfZ2VuZXJhdGlvbiNBbHRlcm5hdGl2ZXM=">Random number generation<i class="fa fa-external-link-alt"></i></span></p></li><li><p>重启后,Arch linux真香,现在修复网络,还记得前面的重点吗?<br>使用netctl配置网络,就是添加内网,OK之后,重启netctl服务,OK,现在使用ssh直接连接,你就得到了一个干净的Arch!</p></li></ol><h1 id="转载文章"><a href="#转载文章" class="headerlink" title="转载文章"></a>转载文章</h1><p><span class="exturl" data-url="aHR0cHM6Ly93d3cuamlhbnNodS5jb20vcC9iOTg0MTJiNWZlNjk=">替换云服务器操作系统为Archlinux<i class="fa fa-external-link-alt"></i></span></p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;前记&quot;&gt;&lt;a href=&quot;#前记&quot; class=&quot;headerlink&quot; title=&quot;前记&quot;&gt;&lt;/a&gt;前记&lt;/h1&gt;&lt;p&gt;一直在想入手一台国内服务器,做流量中继&lt;br&gt;9月3日,阿里云活动好像有漏洞,免费拿到了200元的免门槛代金券,果断入手一台&lt;/p&gt;</summary>
    
    
    
    <category term="Linux" scheme="http://deconf.xyz/categories/Linux/"/>
    
    
  </entry>
  
  <entry>
    <title>如何构建路由drcom认证</title>
    <link href="http://deconf.xyz/2019/04/13/openwrt-dogcom/"/>
    <id>http://deconf.xyz/2019/04/13/openwrt-dogcom/</id>
    <published>2019-04-12T16:24:28.000Z</published>
    <updated>2019-04-12T16:24:28.000Z</updated>
    
    <content type="html"><![CDATA[# 0x00. 简介:<ol><li>这是针对我校(西安石油)路由器认证给出的解决方案(包括ipv6 认证)<span id="more"></span></li><li>drcom程序禁止开启热点,为此有大佬逆向了drcom程序,分析出了认证数据包的关键字,并且模拟了认证数据包,程序核心是发送认证数据包维持心跳包,由于跳过了drcom程序,所以可以使得一直保持在线状态.</li><li>程序已经开源,有<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2RyY29tcy9kcmNvbS1nZW5lcmlj">python版本<i class="fa fa-external-link-alt"></i></span>,和<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL21jaG9tZS9kb2djb20=">C语言版本<i class="fa fa-external-link-alt"></i></span><br>本文主要记录C语言版本使用方法(python对于小容量nand flash闪存芯片就是灾难,根本放不下)</li><li>2019.09.06 更新日志: 优化ipv6认证shell脚本</li></ol><h1 id="0x01-OpenWrt"><a href="#0x01-OpenWrt" class="headerlink" title="0x01. OpenWrt"></a>0x01. OpenWrt</h1><p>简介:<br>OpenWrt项目是一个针对嵌入式设备的Linux操作系统。OpenWrt不是一个单一且不可更改的固件，而是提供了具有软件包管理功能的完全可写的文件系统。(划重点: Linux,可写文件系统)</p><h2 id="0x01-1如何使用OpenWrt"><a href="#0x01-1如何使用OpenWrt" class="headerlink" title="0x01 .1如何使用OpenWrt"></a>0x01 .1如何使用OpenWrt</h2><ol start="0"><li>准备工作:<br> 0.1 一个任意Linux发行版(如果你使用win,需要准备虚拟机)<br> 0.2 网线,路由器</li><li>硬件基础<br>支持的设备 <span class="exturl" data-url="aHR0cHM6Ly9vcGVud3J0Lm9yZy96aC90b2gvc3RhcnQ=">见链接<i class="fa fa-external-link-alt"></i></span></li><li>如何刷入<mark class="label danger">高度危险</mark><mark class="label warning">风险提示:误操作可能导致路由器变砖</mark>(<mark class="label danger">无编程器可能导致报废</mark>)某些设备支持直接刷入(eg:linksyswrt 系列<br>某些不支持直接刷入(eg: 小米路由青春版<br>相关信息可以查阅 <code>goole 你的设备型号 openwrt</code>来判断<br>另外,<mark class="label success">推荐使用OpenWrt官方固件</mark><mark class="label warning">注意,版本最好为Current Stable Release</mark>(或自己构建),毕竟你不知道他人固件里有没有私货,还有一点就是下文中的SDK和刷入版本需要一致,不然会遇到编译出来的安装包无法安装的问题!!!OpenWrt官方固件刷入<span class="exturl" data-url="aHR0cHM6Ly9vcGVud3J0Lm9yZy96aC90b2gvdmlld3MvdG9oX2Z3ZG93bmxvYWQ=">下载地址<i class="fa fa-external-link-alt"></i></span></li></ol><h2 id="0x02-构建drcom安装包"><a href="#0x02-构建drcom安装包" class="headerlink" title="0x02. 构建drcom安装包"></a>0x02. 构建drcom安装包</h2><ol><li>(win: 打开虚拟机,选择nat网络模式,打开你的Linux发行版 查看发现版命令 <code>lsb_release -a</code></li><li>根据自己的Linux发行版安装必要的依赖<br><span class="exturl" data-url="aHR0cHM6Ly9vcGVud3J0Lm9yZy9kb2NzL2d1aWRlLWRldmVsb3Blci9idWlsZC1zeXN0ZW0vaW5zdGFsbC1idWlsZHN5c3RlbSNleGFtcGxlc19vZl9wYWNrYWdlX2luc3RhbGxhdGlvbnM=">参考链接<i class="fa fa-external-link-alt"></i></span></li><li>下载OpenWrt SDK<br>使用ssh 连接路由cat /proc/cpuinfo查看路由信息<br>根据路由选择SDK (这里以常用的mtk7620芯片举例)<br>下载地址: <span class="exturl" data-url="aHR0cHM6Ly9kb3dubG9hZHMub3BlbndydC5vcmcv">https://downloads.openwrt.org/<i class="fa fa-external-link-alt"></i></span></li></ol><p>下载openwrt-sdk-18.06.1-ramips-mt7620_gcc-7.3.0_musl.Linux-x86_64.tar.xz注意是有gcc的!</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ wget https://downloads.openwrt.org/releases/18.06.2/targets/ramips/mt7620/openwrt-sdk-18.06.1-ramips-mt7620_gcc-7.3.0_musl.Linux-x86_64.tar.xz #mtk7620 SDK</span><br><span class="line">$ tar -vxf openwrt-sdk*</span><br><span class="line">$ cd openwrt-sdk*</span><br></pre></td></tr></tbody></table></figure><p>接下来拉取drcom源码</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git clone https://github.com/mchome/openwrt-dogcom.git package/openwrt-dogcom</span><br><span class="line">$ git clone https://github.com/mchome/luci-app-dogcom.git package/luci-app-dogcom</span><br></pre></td></tr></tbody></table></figure><p>接下来编译路由安装包</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ make package/openwrt-dogcom/compile</span><br><span class="line">$ make package/luci-app-dogcom/compile</span><br></pre></td></tr></tbody></table></figure><p>如果没有问题,现在就已经构建好了<br>现在可以去当前目录下的bin文件夹下找到dogcom.ipk,luci-app-dogcom.ipk,之后cd进该目录/在此处打开终端</p><ol start="4"><li>录屏教程<div id="compile.cast"></div><script>AsciinemaPlayer.create("compile.cast",document.getElementById("compile.cast"));</script></li></ol><h2 id="0x03-安装dogcom安装包-启动认证程序"><a href="#0x03-安装dogcom安装包-启动认证程序" class="headerlink" title="0x03 安装dogcom安装包,启动认证程序"></a>0x03 安装dogcom安装包,启动认证程序</h2><ol><li>上传并安装dogcom软件<figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$scp dogcom*.ipk luci-app-dogcom*.ipk root@192.168.1.1:/rooot/</span><br><span class="line">$ ssh root@192.168.1.1</span><br><span class="line">root@OpenWrt:~# ls #查看文件是否上传成功</span><br><span class="line">root@OpenWrt:~# opkg install dogcom*.ipk luci-app-dogcom*.ipk</span><br></pre></td></tr></tbody></table></figure></li><li>现在可以把网线插入路由器的<code>wan</code>口了</li><li>修改配置文件<br>1.登录路由器<br><code>ssh root@192.168.1.1</code><br>2.修改配置文件<br><code>vim /etc/dogcom.conf</code><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">server = '192.168.255.249'</span><br><span class="line">username='***********'          #校园网账号</span><br><span class="line">password='***********'          #校园网密码</span><br><span class="line">CONTROLCHECKSTATUS = '\x20'</span><br><span class="line">ADAPTERNUM = '\x05'</span><br><span class="line">host_ip = '10.29.6.70'         #主机地址</span><br><span class="line">IPDOG = '\x01'</span><br><span class="line">host_name = 'boom'  </span><br><span class="line">PRIMARY_DNS = '10.200.4.1'</span><br><span class="line">dhcp_server = '10.29.6.254'    #楼层路由地址</span><br><span class="line">AUTH_VERSION = '\x0a\x00'</span><br><span class="line">mac = 0xb025aa1               #mac地址，前面加0x</span><br><span class="line">host_os = 'Windows'</span><br><span class="line">KEEP_ALIVE_VERSION = '\xdc\x02'</span><br><span class="line">ror_version = False</span><br></pre></td></tr></tbody></table></figure>修改好了之后<code>:wq</code>保存退出</li><li>启动drcom程序<br><code>/etc/init.d/dogcom start &amp;&amp; /etc/init.d/dogcom enable</code></li><li>测试连通性<br>方法一: ping baidu.com<br>二: 打开 <span class="exturl" data-url="aHR0cDovLzE5Mi4xNjguMjU1LjI0OS8=">http://192.168.255.249/<i class="fa fa-external-link-alt"></i></span> 看是否在线<br>三: <code>ps |grep dogcom</code> #看是否有dogcom进程</li></ol><h2 id="0x04-添加ipv6认证"><a href="#0x04-添加ipv6认证" class="headerlink" title="0x04 添加ipv6认证"></a>0x04 添加ipv6认证</h2><p>概述:由于我校新加了ipv6认证,所以ipv6访问会出现一定问题.<br>经过观察,发现访问ipv6地址时浏览器会跳转到 <span class="exturl" data-url="aHR0cDovLzE5Mi4xNjguMjU1LjI0OSzmiYDku6XmipPkuobkuIDmrKHljIUsd2lyZXNoYXJr5oiq5Zu+5aaC5LiLLw==">http://192.168.255.249,所以抓了一次包,wireshark截图如下<i class="fa fa-external-link-alt"></i></span><br><img src="/2019/04/13/openwrt-dogcom/drcom-ipv6-auth.png" alt="ipv6-auth"><br>所以ipv6认证方式显而易见,是通过一次GET请求来实现的,模拟这一过程就好!</p><h3 id="依赖软件"><a href="#依赖软件" class="headerlink" title="依赖软件"></a>依赖软件</h3><p><code>opkg update &amp;&amp; opkg install curl</code><br>如果遇到超时,需要换下openwrt的源<br><code>sed -i 's_downloads.openwrt.org_mirrors.tuna.tsinghua.edu.cn/openwrt_' /etc/opkg/distfeeds.conf</code></p><h3 id="ipv6-auth脚本"><a href="#ipv6-auth脚本" class="headerlink" title="ipv6-auth脚本"></a>ipv6-auth脚本</h3><p><code>vim /etc/ipv6-auth.sh</code></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">#! /bin/sh</span><br><span class="line">ip6=`ip address show | grep "2001" |awk '{print $2}' |cut -d '/' -f 1`</span><br><span class="line">number=0</span><br><span class="line">while [ -z "$ip6"]; do</span><br><span class="line">    sleep 3</span><br><span class="line">    ip6=`ip address show | grep "2001" |awk '{print $2}' |cut -d '/' -f 1`</span><br><span class="line">    ((number ++));</span><br><span class="line">    if [ $number -gt 6 ]; then</span><br><span class="line">        break;</span><br><span class="line">    fi</span><br><span class="line">done</span><br><span class="line">if [ -z "$ip6"  ]; then</span><br><span class="line">    echo "get ipv6 address fail" &gt; /tmp/ipv6.log</span><br><span class="line">    logger -t IPV6 "get ipv6 address fail"</span><br><span class="line">else</span><br><span class="line">    curl -s -o /dev/null http://192.168.255.249/1.htm?mv6=$ip6&amp;url=http://npupt.com/ 2&gt;&amp;1</span><br><span class="line">    echo "ipv6 auth success" &gt; /tmp/ipv6.log</span><br><span class="line">    logger -t IPv6 "IPv6 auth sucess."</span><br><span class="line">fi</span><br><span class="line"></span><br><span class="line">exit 0</span><br></pre></td></tr></tbody></table></figure><p>开机认证<br><code>/etc/rc.local</code></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sh /etc/ipv6-auth.sh</span><br></pre></td></tr></tbody></table></figure><p>另外ipv6认证维持时间据我观察好像是12小时<br>故还得写个定时任务<br><code>/etc/crontabs/root</code></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">0 */3 * * * /etc/ipv6-auth.sh #每三小时发送一次认证请求</span><br></pre></td></tr></tbody></table></figure><p>重启路由器<br>测试 <code>ping ipv6.google.com</code></p><p>但是这个时候只是路由器ipv6连通了,下面的设备ipv6依旧不通,鉴于认证方式基于ipv6地址,故无法采用<code>ipv6 relay</code>,<code>ipv6 passthrougth</code>技术,可选的只有<code>ipv6 nat</code></p><h3 id="0x05-ipv6-NAT"><a href="#0x05-ipv6-NAT" class="headerlink" title="0x05 ipv6 NAT"></a>0x05 ipv6 NAT</h3><p>这部分参考了清华大学的openwrt ipv6讨论<br><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3R1bmEvaXB2Ni50c2luZ2h1YS5lZHUuY24vYmxvYi9tYXN0ZXIvb3BlbndydC5tZA==">见地址<i class="fa fa-external-link-alt"></i></span>推荐阅读</p><ol><li>安装需求包<br><code>opkg install ip6tables kmod-ipt-nat6 kmod-ip6tables kmod-ip6tables-extra luci-proto-ipv6 iputils-traceroute6</code></li><li>开启默认通告<figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">uci set dhcp.lan.ra_default='1'</span><br><span class="line">uci commit dhcp</span><br></pre></td></tr></tbody></table></figure></li><li>加入nat6的路由表<br>在<code>/etc/firewall.user</code>加上<figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">WAN6=eth0</span><br><span class="line">LAN=br-lan</span><br><span class="line">ip6tables -t nat -A POSTROUTING -o $WAN6 -j MASQUERADE</span><br><span class="line">ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT</span><br><span class="line">ip6tables -A FORWARD -i $LAN -j ACCEPT</span><br></pre></td></tr></tbody></table></figure>WAN6和LAN分别改成外网IPv6和内网网卡(interface)的名字，注意不是防火墙区域(zone)的名字，也不是LuCI里面Network-&gt;Interfaces里面看到的名字，而是ifconfig看到的名字</li><li>默认网关设置<br>添加<code>/etc/hotplug.d/iface/99-ipv6</code><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/sh</span><br><span class="line">[ "$ACTION" = ifup ] || exit 0</span><br><span class="line">iface=wan6</span><br><span class="line">[ -z "$iface" -o "$INTERFACE" = "$iface" ] || exit 0</span><br><span class="line">ip -6 route add `ip -6 route show default|sed -e 's/from [^ ]* //'`</span><br><span class="line">logger -t IPv6 "Add IPv6 default route."</span><br></pre></td></tr></tbody></table></figure>记得加可执行权限<br><code>chmod +x /etc/hotplug.d/iface/99-ipv6</code></li><li>重启,收工<br>如果没特殊情况,现在你的路由器可以下发ipv6地址了,并且ipv6可以连通了,但是针对某些网站(npupt.com)访问依旧会出现问题,这是由于ipv6 nat下发的是私有ipv6地址,经过转换之后出去的.所以浏览器默认你没有公网ipv6,导致couldflare防火墙认为你没有ipv6地址造成的.暂无解决办法(已解决,见下文)</li><li>浏览器ipv6问题<br>经过朋友提醒,浏览器有一个特性,它不认 <code>fd</code>开头</li></ol><p>的ipv6地址,它认为你拿的是私有地址,所以浏览页面一直使用ipv4,也就造成npupt.com等只允许ipv6的网站上不去,所以把fd开头改成dd开头就好了!<br>#修改ipv6前缀 (修改ula_prefix那一行)</p><p><code>vim /etc/config/network </code> </p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">config globals 'globals'</span><br><span class="line">        option ula_prefix 'dd86:acf7:b93b::/48'</span><br></pre></td></tr></tbody></table></figure><h2 id="0x06-后记"><a href="#0x06-后记" class="headerlink" title="0x06. 后记"></a>0x06. 后记</h2><p>个人文章,难免有错误,欢迎各位留言和指正!<br>当然如果你按照此文配置遇到了问题,欢迎留言,我会尽力帮助!233<br>完结了!!!</p><mark class="label danger">FBI Warning</mark><mark class="label warning"> 本文仅限于研究,不得用于商业用途!!!负责后果自负!!!</mark>]]></content>
    
    
    <summary type="html"># 0x00. 简介:
&lt;ol&gt;
&lt;li&gt;这是针对我校(西安石油)路由器认证给出的解决方案(包括ipv6 认证)&lt;/li&gt;&lt;/ol&gt;</summary>
    
    
    
    <category term="Linux" scheme="http://deconf.xyz/categories/Linux/"/>
    
    
    <category term="openwrt,linux" scheme="http://deconf.xyz/tags/openwrt-linux/"/>
    
  </entry>
  
  <entry>
    <title>Rebuild Blog</title>
    <link href="http://deconf.xyz/2019/02/25/rebuild/"/>
    <id>http://deconf.xyz/2019/02/25/rebuild/</id>
    <published>2019-02-25T15:30:14.000Z</published>
    <updated>2019-02-25T15:30:14.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="从头开始"><a href="#从头开始" class="headerlink" title="从头开始"></a>从头开始</h1><p>非常悲催,由于一次误操作,导致了我的Blog源文件丢失.然后由于本人懒散 <span class="github-emoji"><span>😀</span><img src="https://github.githubassets.com/images/icons/emoji/unicode/1f600.png?v8" aria-hidden="true" onerror="this.parent.classList.add('github-emoji-fallback')"></span> ,一直拖到现在才重建Blog. </p><span id="more"></span><h1 id="新科技"><a href="#新科技" class="headerlink" title="新科技"></a>新科技</h1><ol><li>为了上次经验教训采用了github保存blog源文件</li><li>采用了 Travis-CI 自动化部署 (<span class="github-emoji"><span>😏</span><img src="https://github.githubassets.com/images/icons/emoji/unicode/1f60f.png?v8" aria-hidden="true" onerror="this.parent.classList.add('github-emoji-fallback')"></span>)</li></ol><h1 id="具体流程"><a href="#具体流程" class="headerlink" title="具体流程"></a>具体流程</h1><p>tarvis-ci服务器不断地监听blog主线开发的变更内容， 一旦有任何变更（可以理解为 git commit ）就自动调用测试和部署脚本。然后我的blog就自动更新了.<br>(好处就是可以直接在github web页面写文章了,而且也不需要担心多设备同步问题.2333 黑科技不? <span class="github-emoji"><span>😉</span><img src="https://github.githubassets.com/images/icons/emoji/unicode/1f609.png?v8" aria-hidden="true" onerror="this.parent.classList.add('github-emoji-fallback')"></span></p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;从头开始&quot;&gt;&lt;a href=&quot;#从头开始&quot; class=&quot;headerlink&quot; title=&quot;从头开始&quot;&gt;&lt;/a&gt;从头开始&lt;/h1&gt;&lt;p&gt;非常悲催,由于一次误操作,导致了我的Blog源文件丢失.然后由于本人懒散 &lt;span class=&quot;github-emoji&quot;&gt;&lt;span&gt;😀&lt;/span&gt;&lt;img src=&quot;https://github.githubassets.com/images/icons/emoji/unicode/1f600.png?v8&quot; aria-hidden=&quot;true&quot; onerror=&quot;this.parent.classList.add(&#39;github-emoji-fallback&#39;)&quot;&gt;&lt;/span&gt; ,一直拖到现在才重建Blog. &lt;/p&gt;</summary>
    
    
    
    <category term="hexo blog" scheme="http://deconf.xyz/categories/hexo-blog/"/>
    
    
    <category term="blog" scheme="http://deconf.xyz/tags/blog/"/>
    
  </entry>
  
</feed>
