<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>2018 on Ricky</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/</link><description>Recent content in 2018 on Ricky</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 24 Dec 2018 13:22:33 +0800</lastBuildDate><atom:link href="https://9855cc0f.linzeyan.pages.dev/posts/2018/index.xml" rel="self" type="application/rss+xml"/><item><title>Avalon (The Resistance: Avalon)</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181224-avalon/</link><pubDate>Mon, 24 Dec 2018 13:22:33 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181224-avalon/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://mj9981168.pixnet.net/blog/posts/8196168065" target="_blank" rel="noopener">Avalon (The Resistance: Avalon)&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://synn-solis.blogspot.com/2013/02/ks-resistance-avalon-kickstarter-promo.html" target="_blank" rel="noopener">[Board Game Unboxing][Rules] Avalon KS Promo The Resistance: Avalon: Kickstarter Promo&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Install Font Libraries and Chinese Fonts on Linux CentOS 7</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181218-fonts/</link><pubDate>Tue, 18 Dec 2018 22:13:40 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181218-fonts/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://hk.saowen.com/a/8e1349c5e25aaca06614d56d65fcd43156684d591da80b5a886806ceac06e199" target="_blank" rel="noopener">Install Font Libraries and Chinese Fonts on Linux CentOS 7&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>yum -y install fontconfig
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now you can see the fonts and fontconfig directories under /usr/shared (they did not exist before).&lt;/p>
&lt;p>Before that we need to create a directory. First create /usr/shared/fonts/chinese.&lt;/p>
&lt;p>&lt;code>mkdir /usr/shared/fonts/chinese&lt;/code>&lt;/p>
&lt;p>Copy the fonts you need and upload them to /usr/shared/fonts/chinese. Here I use SimSun and HeiTi (used in reports). You will see files with ttf and ttc extensions.&lt;/p></description></item><item><title>What is the SHA256 that comes on the sshd entry in auth.log?</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181217-what-is-the-sha256-that-comes-on-the-sshd-entry-in-auth-log/</link><pubDate>Mon, 17 Dec 2018 16:11:43 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181217-what-is-the-sha256-that-comes-on-the-sshd-entry-in-auth-log/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://serverfault.com/questions/888281/what-is-the-sha256-that-comes-on-the-sshd-entry-in-auth-log" target="_blank" rel="noopener">What is the SHA256 that comes on the sshd entry in auth.log?&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;code>ssh-keygen -lf .ssh/id_rsa.pub&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>cat .ssh/id_rsa.pub |
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> awk &lt;span style="color:#e6db74">&amp;#39;{ print $2 }&amp;#39;&lt;/span> | &lt;span style="color:#75715e"># Only the actual key data without prefix or comments&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> base64 -d | &lt;span style="color:#75715e"># decode as base64&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sha256sum | &lt;span style="color:#75715e"># SHA256 hash (returns hex)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> awk &lt;span style="color:#e6db74">&amp;#39;{ print $1 }&amp;#39;&lt;/span> | &lt;span style="color:#75715e"># only the hex data&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> xxd -r -p | &lt;span style="color:#75715e"># hex to bytes&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> base64 &lt;span style="color:#75715e"># encode as base64&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>What does `&lt; &lt;(command args)` mean in the shell?</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181117-what-does-command-args-mean-in-the-shell/</link><pubDate>Sat, 17 Nov 2018 22:29:23 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181117-what-does-command-args-mean-in-the-shell/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://stackoverflow.com/questions/2443085/what-does-command-args-mean-in-the-shell" target="_blank" rel="noopener">What does &lt;code>&amp;lt; &amp;lt;(command args)&lt;/code> mean in the shell?&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> IFS&lt;span style="color:#f92672">=&lt;/span> read -r -d &lt;span style="color:#e6db74">$&amp;#39;\0&amp;#39;&lt;/span> file; &lt;span style="color:#66d9ef">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dosomethingwith &lt;span style="color:#e6db74">&amp;#34;&lt;/span>$file&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#75715e"># do something with each file&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">done&lt;/span> &amp;lt; &amp;lt;&lt;span style="color:#f92672">(&lt;/span>find /bar -name *foo* -print0&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>&amp;lt;()&lt;/code> is called &lt;a href="http://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html#Process-Substitution" target="_blank" rel="noopener">&lt;strong>process substitution&lt;/strong>&lt;/a> in the manual, and is similar to a pipe but passes an argument of the form &lt;code>/dev/fd/63&lt;/code> instead of using stdin.&lt;/p>
&lt;p>&lt;code>&amp;lt;&lt;/code> reads the input from a file named on command line.&lt;/p>
&lt;p>Together, these two operators function exactly like a pipe, so it could be rewritten as&lt;/p></description></item><item><title>Netcat (Linux nc) Practical Examples for Network Admins</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181109-linux-utility-netcat-examples/</link><pubDate>Fri, 09 Nov 2018 00:17:47 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181109-linux-utility-netcat-examples/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://blog.gtwang.org/linux/linux-utility-netcat-examples/" target="_blank" rel="noopener">Netcat (Linux nc) Practical Examples for Network Admins&lt;/a>&lt;/li>
&lt;/ul>
&lt;h4 id="send-a-test-udp-packet-to-a-remote-server">Send a test UDP packet to a remote server&lt;/h4>
&lt;p>This command sends a UDP test packet to the specified host and port. The &lt;code>-w1&lt;/code> option sets the timeout to 1 second.&lt;/p>
&lt;p>&lt;code>echo -n &amp;quot;foo&amp;quot; | nc -u -w1 192.168.1.8 5000&lt;/code>&lt;/p>
&lt;h4 id="open-a-udp-port-to-receive-data">Open a UDP port to receive data&lt;/h4>
&lt;p>&lt;code>nc -lu localhost 5000&lt;/code>&lt;/p>
&lt;h4 id="port-scanning-on-a-remote-host">Port scanning on a remote host&lt;/h4>
&lt;p>This command scans TCP ports in the ranges 1-1000 and 2000-3000 on the specified host to see which ports are open.&lt;/p></description></item><item><title>vimrc Configuration Guide</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181103-vimrc/</link><pubDate>Sat, 03 Nov 2018 23:30:52 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181103-vimrc/</guid><description>&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://wiki.csie.ncku.edu.tw/vim/vimrc" target="_blank" rel="noopener">vimrc Configuration Guide&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>:set nu&lt;/p>
&lt;ul>
&lt;li>Show line numbers: useful for debugging.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>:set ai&lt;/p>
&lt;ul>
&lt;li>Auto-indent: if the previous line has two tab widths, pressing Enter keeps those two tab widths on the next line.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>:set cursorline&lt;/p>
&lt;ul>
&lt;li>Cursor line: underline the current line to help locate the cursor.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>:set bg=light&lt;/p>
&lt;ul>
&lt;li>Color scheme for light backgrounds.&lt;/li>
&lt;li>The default assumes a light background (white, etc), but if your terminal background is dark purple, text may disappear (for example, comments in dark blue). Change this to :set bg=dark.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>:set tabstop=4&lt;/p></description></item><item><title>Why do browser user-agent strings always include Mozilla/5.0?</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181017-mozilla5-0-always-user-agent-string/</link><pubDate>Wed, 17 Oct 2018 12:03:04 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20181017-mozilla5-0-always-user-agent-string/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://yulun.me/2013/mozilla5-0-always-user-agent-string/" target="_blank" rel="noopener">Why do browser user-agent strings always include Mozilla/5.0?&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://stackoverflow.com/questions/12288452/what-does-mozilla-5-0-in-user-agent-string-signify" target="_blank" rel="noopener">What does &amp;ldquo;Mozilla/5.0&amp;rdquo; in user agent string signify?&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://webaim.org/blog/user-agent-string-history/" target="_blank" rel="noopener">History of the browser user-agent string&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Quick answer&lt;/p>
&lt;p>Because website developers may output special features when they detect a browser (Mozilla in this case). When other browsers also support those good features, they try to mimic Mozilla so the site outputs the same content instead of a degraded version.&lt;/p></description></item><item><title>Simulate Network Anomalies with TC and Netem</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180915-simulate-network-anomalies-using-tc-and-netem/</link><pubDate>Sat, 15 Sep 2018 16:17:26 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180915-simulate-network-anomalies-using-tc-and-netem/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://www.hi-linux.com/posts/35699.html" target="_blank" rel="noopener">Simulate Network Anomalies with TC and Netem&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Netem and TC brief overview&lt;/p>
&lt;p>Netem is a network emulation module provided by Linux 2.6 and later kernels. It can be used on a good LAN to simulate complex Internet transmission performance, such as low bandwidth, latency, packet loss, and so on. Many Linux distributions with kernel 2.6+ enable this module by default, such as Fedora, Ubuntu, Redhat, OpenSuse, CentOS, Debian, etc.&lt;/p>
&lt;p>TC is a user-space tool in Linux, short for Traffic Control. TC controls the operating mode of the Netem module. In other words, to use Netem you need at least two conditions: the Netem module must be enabled in the kernel, and the corresponding user-space tool TC must be available.&lt;/p></description></item><item><title>Quagga Routing - Install, Configure and setup BGP</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180814-quagga-routing--install-configure-and-setup-bgp/</link><pubDate>Tue, 14 Aug 2018 22:13:12 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180814-quagga-routing--install-configure-and-setup-bgp/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://www.psychz.net/client/kb/en/quagga-routing--install-configure-and-setup-bgp.html" target="_blank" rel="noopener">Quagga Routing - Install, Configure and setup BGP&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Systemd Tutorial: Practical Part</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180809-systemd-tutorial-part-two/</link><pubDate>Thu, 09 Aug 2018 13:53:32 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180809-systemd-tutorial-part-two/</guid><description>&lt;ul>
&lt;li>&lt;a href="http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html" target="_blank" rel="noopener">Systemd Tutorial: Practical Part&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ systemctl cat sshd.service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">[&lt;/span>Unit&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Description&lt;span style="color:#f92672">=&lt;/span>OpenSSH server daemon
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Documentation&lt;span style="color:#f92672">=&lt;/span>man:sshd&lt;span style="color:#f92672">(&lt;/span>8&lt;span style="color:#f92672">)&lt;/span> man:sshd_config&lt;span style="color:#f92672">(&lt;/span>5&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>After&lt;span style="color:#f92672">=&lt;/span>network.target sshd-keygen.service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Wants&lt;span style="color:#f92672">=&lt;/span>sshd-keygen.service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">[&lt;/span>Service&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>EnvironmentFile&lt;span style="color:#f92672">=&lt;/span>/etc/sysconfig/sshd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ExecStart&lt;span style="color:#f92672">=&lt;/span>/usr/sbin/sshd -D $OPTIONS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ExecReload&lt;span style="color:#f92672">=&lt;/span>/bin/kill -HUP $MAINPID
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Type&lt;span style="color:#f92672">=&lt;/span>simple
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>KillMode&lt;span style="color:#f92672">=&lt;/span>process
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Restart&lt;span style="color:#f92672">=&lt;/span>on-failure
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>RestartSec&lt;span style="color:#f92672">=&lt;/span>42s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">[&lt;/span>Install&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WantedBy&lt;span style="color:#f92672">=&lt;/span>multi-user.target
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="unit-section-startup-order-and-dependencies">[Unit] Section: Startup Order and Dependencies&lt;/h4>
&lt;p>&lt;code>After&lt;/code> field: if &lt;code>network.target&lt;/code> or &lt;code>sshd-keygen.service&lt;/code> needs to start, then &lt;code>sshd.service&lt;/code> should start after them.&lt;/p>
&lt;p>Correspondingly, the &lt;code>Before&lt;/code> field defines which services &lt;code>sshd.service&lt;/code> should start before.&lt;/p>
&lt;p>Note that After and Before only involve startup order, not dependency relationships.&lt;/p></description></item><item><title>RAID10 Total Failure: Mirror Drives in the Same Group Failed Together</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180801-raid/</link><pubDate>Wed, 01 Aug 2018 18:21:20 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180801-raid/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://jerry2yang.wordpress.com/2013/01/09/raid10-%E5%BE%B9%E5%BA%95%E5%B4%A9%E5%A3%9E-%E5%A3%9E%E5%B0%B1%E5%A3%9E%E5%9C%A8%E5%90%8C%E7%B5%84%E4%BD%9Cmirror%E7%A1%AC%E7%A2%9F%E4%B8%80%E8%B5%B7%E6%95%85%E9%9A%9C%E3%80%82/" target="_blank" rel="noopener">RAID10 Total Failure: Mirror Drives in the Same Group Failed Together&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://zh.wikipedia.org/wiki/RAID" target="_blank" rel="noopener">RAID&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Applying HTTPS Certificates for CDN</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180724-dehydrated/</link><pubDate>Tue, 24 Jul 2018 18:35:39 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180724-dehydrated/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://github.com/lukas2511/dehydrated" target="_blank" rel="noopener">dehydrated&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/kappataumu/letsencrypt-cloudflare-hook" target="_blank" rel="noopener">letsencrypt-cloudflare-hook&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Since we cannot upload files to the CDN server, we cannot use file validation to apply for HTTPS certificates. Fortunately, Let&amp;rsquo;s Encrypt supports the dns-01 challenge via DNS validation. We use Dehydrated with the CloudFlare hook to apply for HTTPS certificates.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># First clone the dehydrated repository&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git clone https://github.com/lukas2511/dehydrated
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># In the cloned dehydrated directory, create a config file. See the example config file:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># https://github.com/dehydrated-io/dehydrated/blob/master/docs/examples/config&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Append Cloudflare info to the end of the config file&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#e6db74">&amp;#34;export CF_EMAIL=user@example.com&amp;#34;&lt;/span> &amp;gt;&amp;gt; config
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo &lt;span style="color:#e6db74">&amp;#34;export CF_KEY=K9uX2HyUjeWg5AhAb&amp;#34;&lt;/span> &amp;gt;&amp;gt; config
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Clone the Cloudflare hook&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir hooks
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git clone https://github.com/kappataumu/letsencrypt-cloudflare-hook hooks/cloudflare
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Install dependencies&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pip install -r hooks/cloudflare/requirements-python-2.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Create domains.txt, one domain per line&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">[&lt;/span>root@db-slave01 dehydrated&lt;span style="color:#f92672">]&lt;/span>&lt;span style="color:#75715e"># cat domains.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apk.kosungames.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sp-res.kosungames.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cpweb.kosungames.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Request HTTPS certificates&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>./dehydrated -c -k hooks/cloudflare/hook.py
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Use a Python script to upload the certificates. The script must be in the dehydrated directory.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/usr/bin/env python&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> aliyunsdkcore &lt;span style="color:#f92672">import&lt;/span> client
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> aliyunsdkcdn.request.v20141111 &lt;span style="color:#f92672">import&lt;/span> SetDomainServerCertificateRequest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> uuid
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">upload&lt;/span>(domain):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cli &lt;span style="color:#f92672">=&lt;/span> client&lt;span style="color:#f92672">.&lt;/span>AcsClient(&lt;span style="color:#e6db74">&amp;#34;LTAI7zSXga2D&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;ed03Mt9xcNkRgmadx0XtpyDje&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;cn-hongkong&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request &lt;span style="color:#f92672">=&lt;/span> SetDomainServerCertificateRequest&lt;span style="color:#f92672">.&lt;/span>SetDomainServerCertificateRequest()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request&lt;span style="color:#f92672">.&lt;/span>set_accept_format(&lt;span style="color:#e6db74">&amp;#34;json&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request&lt;span style="color:#f92672">.&lt;/span>set_DomainName(domain)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request&lt;span style="color:#f92672">.&lt;/span>set_CertName(domain &lt;span style="color:#f92672">+&lt;/span> str(uuid&lt;span style="color:#f92672">.&lt;/span>uuid1()))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">#request.set_CertName(domain)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">#certificate = open(&amp;#34;certs/&amp;#34; + domain + &amp;#34;/fullchain.pem&amp;#34;).read()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> certificate &lt;span style="color:#f92672">=&lt;/span> open(&lt;span style="color:#e6db74">&amp;#34;certs/&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> domain &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;/cert.pem&amp;#34;&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>read()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#34;certs/&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> domain &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;/chain.pem&amp;#34;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> f&lt;span style="color:#f92672">.&lt;/span>readline()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> f&lt;span style="color:#f92672">.&lt;/span>readline()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> chain &lt;span style="color:#f92672">=&lt;/span> f&lt;span style="color:#f92672">.&lt;/span>read()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> certificate &lt;span style="color:#f92672">+=&lt;/span> chain
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> key &lt;span style="color:#f92672">=&lt;/span> open(&lt;span style="color:#e6db74">&amp;#34;certs/&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> domain &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;/privkey.pem&amp;#34;&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>read()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request&lt;span style="color:#f92672">.&lt;/span>set_ServerCertificateStatus(&lt;span style="color:#e6db74">&amp;#39;on&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request&lt;span style="color:#f92672">.&lt;/span>set_ServerCertificate(certificate)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request&lt;span style="color:#f92672">.&lt;/span>set_PrivateKey(key)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> result &lt;span style="color:#f92672">=&lt;/span> cli&lt;span style="color:#f92672">.&lt;/span>do_action_with_exception(request)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>domain_file&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;domains.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">with&lt;/span> open(domain_file) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> line &lt;span style="color:#f92672">in&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> domain &lt;span style="color:#f92672">=&lt;/span> line&lt;span style="color:#f92672">.&lt;/span>split()[&lt;span style="color:#ae81ff">0&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> upload(domain)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Record Millisecond Precision in Nginx Access Logs</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180724-milliseconds-server-time/</link><pubDate>Tue, 24 Jul 2018 18:31:42 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180724-milliseconds-server-time/</guid><description>&lt;p>Nginx access logs can record millisecond timestamps, but they are milliseconds since &lt;code>EPOCH&lt;/code>, for example &lt;code>1503544071.865&lt;/code>. Another variable, &lt;code>$time_local&lt;/code>, records a second-level time format, for example &lt;code>24/Aug/2017:11:07:51 +0800&lt;/code>. Under heavy traffic, we need a millisecond-precision format like &lt;code>24/Aug/2017:11:07:51.865 +0800&lt;/code>. This can be done with Lua.&lt;/p>
&lt;p>First, define a variable named &lt;code>time_millis&lt;/code> in nginx.conf and initialize it to empty. This is similar to providing a fallback self-signed certificate when using &lt;code>auto-ssl&lt;/code>.&lt;/p></description></item><item><title>HA command</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180721-ha/</link><pubDate>Sat, 21 Jul 2018 14:45:29 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180721-ha/</guid><description>&lt;pre tabindex="0">&lt;code>load merge relative terminal
# On a brand-new device without HA enabled, you must define the cluster ID.
# Cluster ID must be unique and cannot duplicate other SRX, because HA creates a virtual MAC address and this ID affects it. Duplicates may cause MAC duplication and unexpected errors.
#
request system zeroize
# The following commands must be run in `&amp;gt;` mode.
set chassis cluster cluster-id &amp;lt;ID range 0~255&amp;gt; node 0 # This is on node 0
set chassis cluster cluster-id &amp;lt;ID range 0~255&amp;gt; node 1 # This is on node 1
# On the secondary node, run this command.
request chassis cluster configuration-synchronize
# After reboot, you will see Hold or standby; check whether the cluster is up.
show chassis cluster status
# This appears only after RETH interfaces are created; you must configure first.
show chassis cluster interfaces
# The following commands are run in config mode; build the config first.
---
# The backup-router is for the HA standby device management interface (fxp) so it can respond to routing; by default the standby does not enable the routing engine, so this is required.
set groups node0 system host-name SRX-node0
set groups node0 system backup-router 10.10.0.254
set groups node0 system backup-router destination 0.0.0.0/0
set groups node0 interfaces fxp0 unit 0 family inet address 10.10.0.2/24
set groups node1 system host-name SRX-node1
set groups node1 system backup-router 10.10.0.254
set groups node1 system backup-router destination 0.0.0.0/0
set groups node1 interfaces fxp0 unit 0 family inet address 10.10.0.3/24
set apply-groups &amp;#34;${node}&amp;#34;
set system time-zone Asia/Taipei
set chassis cluster control-link-recovery
set chassis cluster reth-count 10
set chassis cluster heartbeat-interval 2000
# It is recommended to enable IPv6 during setup using the following command, because enabling IPv6 later requires a reboot.
set security forwarding-options family inet6 mode flow-based
# Interface numbers vary by chassis model.
# The easiest way is to check how many slots the device has. For example, SRX550HM has expansion 0-8, so HA starts at 9, hence ge-9/x/x.
set chassis cluster redundancy-group 0 node 0 priority 150
set chassis cluster redundancy-group 0 node 1 priority 100
set chassis cluster redundancy-group 0 interface-monitor ge-0/0/3 weight 150
set chassis cluster redundancy-group 0 interface-monitor ge-0/0/5 weight 150
set chassis cluster redundancy-group 0 interface-monitor ge-9/0/3 weight 100
set chassis cluster redundancy-group 0 interface-monitor ge-9/0/5 weight 100
set chassis cluster redundancy-group 1 node 0 priority 150
set chassis cluster redundancy-group 1 node 1 priority 100
set chassis cluster redundancy-group 1 interface-monitor ge-0/0/3 weight 150
set chassis cluster redundancy-group 1 interface-monitor ge-0/0/5 weight 150
set chassis cluster redundancy-group 1 interface-monitor ge-9/0/3 weight 100
set chassis cluster redundancy-group 1 interface-monitor ge-9/0/5 weight 100
# This is the data sync setting for redundancy group 1; you must set it to enable the ge-0/0/2 heartbeat link.
set interfaces fab0 fabric-options member-interfaces ge-0/0/2
set interfaces fab1 fabric-options member-interfaces ge-9/0/2
# Add interfaces to the reth group.
set interfaces ge-0/0/3 gigether-options redundant-parent reth0
set interfaces ge-0/0/4 gigether-options redundant-parent reth0
set interfaces ge-9/0/3 gigether-options redundant-parent reth0
set interfaces ge-9/0/4 gigether-options redundant-parent reth0
set interfaces ge-0/0/5 gigether-options redundant-parent reth1
set interfaces ge-9/0/5 gigether-options redundant-parent reth1
set interfaces reth0 vlan-tagging
# You must add RETH to the data sync group, otherwise it will not work.
set interfaces reth0 redundant-ether-options redundancy-group 1
# Note: SRX uses LACP passive mode, but the switch must use LACP active mode.
set interfaces reth0 redundant-ether-options lacp passive
set interfaces reth0 redundant-ether-options lacp periodic slow
set interfaces reth1 redundant-ether-options redundancy-group 1
set interfaces reth1 unit 0 family inet address 202.99.240.100/26
&lt;/code>&lt;/pre></description></item><item><title>Fighting DDoS: nginx, iptables, and fail2ban</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180720-defend-against-ddos-with-nginx-iptable-and-fail2ban/</link><pubDate>Fri, 20 Jul 2018 18:47:42 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180720-defend-against-ddos-with-nginx-iptable-and-fail2ban/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://blog.techbridge.cc/2016/08/12/defend-against-ddos-with-nginx-iptable-and-fail2ban/" target="_blank" rel="noopener">Fighting DDoS: nginx, iptables, and fail2ban&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>[Juniper Firewall] command</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180627-juniper/</link><pubDate>Wed, 27 Jun 2018 00:58:01 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180627-juniper/</guid><description>&lt;p>The following commands are run in operational mode, or use &lt;code>run show&lt;/code> in configuration mode.&lt;/p>
&lt;p>Show current firewall session count&lt;/p>
&lt;pre tabindex="0">&lt;code>show security flow session | match 10.22.12.104
show security flow session source-prefix 10.22.12.104
&lt;/code>&lt;/pre>&lt;p>Clear current sessions&lt;/p>
&lt;pre tabindex="0">&lt;code>clear security flow session all
&lt;/code>&lt;/pre>&lt;p>Query OID&lt;/p>
&lt;pre tabindex="0">&lt;code>show snmp mib walk decimal 1.3.6.1.2.1.2.2.1.2
&lt;/code>&lt;/pre>&lt;p>Check current software version&lt;/p>
&lt;pre tabindex="0">&lt;code>show system software
&lt;/code>&lt;/pre>&lt;p>Check system uptime&lt;/p>
&lt;pre tabindex="0">&lt;code>show system uptime
&lt;/code>&lt;/pre>&lt;p>Check hardware cards and serial numbers&lt;/p>
&lt;pre tabindex="0">&lt;code>show chassis haredware
&lt;/code>&lt;/pre>&lt;p>Check current hardware status&lt;/p>
&lt;pre tabindex="0">&lt;code>show chassis environment
&lt;/code>&lt;/pre>&lt;p>Show routing table&lt;/p></description></item><item><title>Switch Firmware Update</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180614-cisco-firmware-version-update/</link><pubDate>Thu, 14 Jun 2018 12:28:29 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180614-cisco-firmware-version-update/</guid><description>&lt;h4 id="preparation">Preparation:&lt;/h4>
&lt;p>Plug in the console.&lt;/p>
&lt;p>Copy the update file to the USB drive.&lt;/p>
&lt;p>&lt;strong>&lt;em>Before starting, use &lt;code>show version&lt;/code> to check the current version&lt;/em>&lt;/strong>&lt;/p>
&lt;h4 id="update-sop">Update SOP:&lt;/h4>
&lt;ol>
&lt;li>Insert the USB with the update file into the switch. The screen will show the detected device name.&lt;/li>
&lt;li>Copy the update file from USB to the switch flash: &lt;code>copy usbflash0(device name):&amp;lt;update-file&amp;gt; flash:&lt;/code>
&lt;ol>
&lt;li>Press Enter and confirm the file name, then press Enter again. A stream of &lt;code>ccccccccc&lt;/code> means it is copying.&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>After it finishes, use &lt;code>dir flash&lt;/code> to verify the update file exists.&lt;/li>
&lt;li>&lt;code>conf t&lt;/code> to enter config mode, then &lt;code>boot system flash:&amp;lt;update-file&amp;gt;&lt;/code> to set the new IOS image.&lt;/li>
&lt;li>&lt;code>exit&lt;/code> config mode, then &lt;code>show boot&lt;/code> to confirm the new IOS is selected.&lt;/li>
&lt;li>&lt;code>write memory&lt;/code> to apply settings to the running config.&lt;/li>
&lt;li>Run &lt;code>reload&lt;/code>.&lt;/li>
&lt;li>It takes about 15-20 minutes. After it finishes, check the version to confirm the upgrade.&lt;/li>
&lt;/ol>
&lt;pre tabindex="0">&lt;code>copy usbflash0:cat.bin flash:
copy usbflash0:cat.bin flash0-2:
software install file flash:cat.bin switch 1-2
software clean
&lt;/code>&lt;/pre></description></item><item><title>Firewall Update</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180612-juniper-firmware-version-update/</link><pubDate>Tue, 12 Jun 2018 07:48:48 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180612-juniper-firmware-version-update/</guid><description>&lt;h4 id="preparation">Preparation:&lt;/h4>
&lt;p>Plug in the console.&lt;/p>
&lt;p>Copy the update file to the USB drive.&lt;/p>
&lt;p>&lt;strong>&lt;em>Before starting, use &lt;code>show version&lt;/code> to check the current version&lt;/em>&lt;/strong>&lt;/p>
&lt;h4 id="update-sop">Update SOP:&lt;/h4>
&lt;ol>
&lt;li>&lt;code>start shell&lt;/code>&lt;/li>
&lt;li>&lt;code>su&lt;/code> to root&lt;/li>
&lt;li>Create a directory: &lt;code>mkdir /var/tmp/usb&lt;/code> (name can be anything)&lt;/li>
&lt;li>Insert the USB. Note the number after &lt;code>da&lt;/code>, currently &lt;code>da1&lt;/code>.&lt;/li>
&lt;li>Mount it: &lt;code>mount -t msdos /dev/da1s1 /var/tmp/usb&lt;/code> (if &lt;code>da0&lt;/code>, then use &lt;code>da0s1&lt;/code>, etc.)&lt;/li>
&lt;li>After it finishes, &lt;code>cd /cf/var/tmp/usb/da2s1/&lt;/code> (usb)
&lt;ol>
&lt;li>&lt;code>ls&lt;/code> (junos-srxsme-15.1X49-D120.3-domestic.tgz)&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>Switch the CLI to operational mode
&lt;ol>
&lt;li>&lt;code>request system software add /var/tmp/usb/da2s1/junos-srxsme-15.1X49-D120.3-domestic.tgz&lt;/code>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;code>request system reboot&lt;/code>&lt;/li>
&lt;li>&lt;code>show version&lt;/code>&lt;/li>
&lt;/ol></description></item><item><title>Best V2Ray One-Click Install &amp; Management Script</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180208-v2ray/</link><pubDate>Thu, 08 Feb 2018 10:56:54 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180208-v2ray/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://233blog.com/post/16/" target="_blank" rel="noopener">Best V2Ray One-Click Install &amp;amp; Management Script&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/233boy/v2ray" target="_blank" rel="noopener">v2ray&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>How to Enable SNMP on a Switch</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180204-switchsnmp/</link><pubDate>Sun, 04 Feb 2018 14:48:12 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180204-switchsnmp/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://itlocation.blogspot.com/2013/10/switchsnmp.html" target="_blank" rel="noopener">How to Enable SNMP on a Switch&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Use &lt;code>snmp-server&lt;/code> as the main command.&lt;/p>
&lt;p>&lt;code>C3750(Config)#snmp-server community RO&lt;/code>&lt;/p>
&lt;p>This is the shared secret for SNMP communication.
RO means Read Only (SNMP tools are not allowed to modify settings).
RW means Read and Write (SNMP tools can modify settings).&lt;/p>
&lt;p>&lt;code>C3750(config)#snmp-server group SNMP_ROA v3 priv match exact&lt;/code>&lt;/p>
&lt;ol>
&lt;li>SNMP group name: SNMP_ROA&lt;/li>
&lt;li>Version: v3&lt;/li>
&lt;li>Highest priv level&lt;/li>
&lt;/ol>
&lt;p>&lt;code>C3750(config)#snmp-server user cater SNMP_ROA v3 auth MD5 cisco12345 priv des56 test12345&lt;/code>&lt;/p></description></item><item><title>A10</title><link>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180110-a10/</link><pubDate>Wed, 10 Jan 2018 03:44:14 +0800</pubDate><guid>https://9855cc0f.linzeyan.pages.dev/posts/2018/20180110-a10/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://jal.tw/a10:l2:link-aggregation" target="_blank" rel="noopener">A10 Link Aggregation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jal.tw/a10:slb:healthmonitor:tcl" target="_blank" rel="noopener">Health Monitor use TCL&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jal.tw/a10:slb:ssl-cipher" target="_blank" rel="noopener">A10 SSL Offload Cipher Suite Support List&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jal.tw/a10:slb:compression" target="_blank" rel="noopener">Compression&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jal.tw/a10:slb:ramcache" target="_blank" rel="noopener">A10 RAM Cache 加速&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jal.tw/a10:nat" target="_blank" rel="noopener">A10 NAT&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jal.tw/a10:basic:config" target="_blank" rel="noopener">A10 configuration template&lt;/a>&lt;/li>
&lt;/ul>
&lt;h4 id="a10-link-aggregation">A10 Link Aggregation&lt;/h4>
&lt;h5 id="8023ad-lacp">802.3ad LACP&lt;/h5>
&lt;blockquote>
&lt;p>A10 trunk can config a maximnm of 16 LACP trunks per device.&lt;/p>&lt;/blockquote>
&lt;pre tabindex="0">&lt;code>interface ethernet 1
lacp trunk 1 mode active
lacp timeout long
!
interface ethernet 2
lacp trunk 1 mode active
lacp timeout long
&lt;/code>&lt;/pre>&lt;h5 id="static-link-aggregation">Static Link Aggregation&lt;/h5>
&lt;blockquote>
&lt;p>None LACP.&lt;/p>
&lt;p>Up to 8 static trunks.&lt;/p></description></item></channel></rss>