<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Network on Freedom Wolf</title>
    <link>https://www.freedomwolf.cc/tags/network/</link>
    <description>Recent content in Network on Freedom Wolf</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-tw</language>
    <lastBuildDate>2020-01-06 00:15 +0800</lastBuildDate><atom:link href="https://www.freedomwolf.cc/tags/network/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>使用 systemd 自動切換路由至 USB 網路分享</title>
      <link>https://www.freedomwolf.cc/2020/01/auto_switching_usb_tethering/</link>
      <pubDate>2020-01-06 00:15 +0800</pubDate>
      
      <guid>https://www.freedomwolf.cc/2020/01/auto_switching_usb_tethering/</guid>
      <description>&lt;p&gt;

&lt;div class=&#34;pure-g&#34;&gt;

  
  
  
  
  &lt;div class=&#34;pure-u-1-1&#34;&gt;
    &lt;div style=&#34;padding: 0 .2em&#34;&gt;
      
    
    
    
      &lt;a target=&#34;_blank&#34; href=&#34;https://www.freedomwolf.cc/2020/01/auto_switching_usb_tethering/images/00-cover.svg&#34;&gt; 
        &lt;img 
    
          class=&#34;pure-img-responsive&#34;
          
          src=&#34;https://www.freedomwolf.cc/2020/01/auto_switching_usb_tethering/images/00-cover.svg&#34;
          
          alt=&#34;Cover,icons from wikipedia commons.&#34;
          &gt;
        &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  

&lt;/div&gt;

前面的文章有說明了如何改用 systemd-networkd 進行系統的網路管理，但是在沒有另外設定的情況下並不會自動幫你切路由，所以必須要手動把裝置的設定檔寫好，讓系統自動去設定。&lt;br&gt;
配合之前的文章&lt;a href=&#34;https://www.freedomwolf.cc/2019/10/network_by_systemd/&#34;&gt;《使用 systemd-networkd 設定網路組態》&lt;/a&gt;要重新寫一個針對手機的 .link 檔以及 .network 檔，再外加一個 udev rule 讓手機插上去時可以自動重新啟動 systemd-networkd 服務達成目的。&lt;/p&gt;
&lt;h2 id=&#34;準備&#34;&gt;準備&lt;/h2&gt;
&lt;p&gt;首先，你要是 Android 手機，如果不是的話，那這篇就不是給你看的了，iPhone 好像不適用，手邊沒有 iPhone 我也無從測試。&lt;br&gt;
然後拿出你的傳輸線，把手機插上電腦，手機選擇什麼模式都不影響（應該是可以不要理它），接著開啟  terminal 後輸入 &lt;code&gt;lsusb&lt;/code&gt;，接著找到自己的手機。&lt;br&gt;


&lt;div class=&#34;pure-g&#34;&gt;

  
  
  
  
  &lt;div class=&#34;pure-u-1-1&#34;&gt;
    &lt;div style=&#34;padding: 0 .2em&#34;&gt;
      
    
    
    
      &lt;a target=&#34;_blank&#34; href=&#34;https://www.freedomwolf.cc/2020/01/auto_switching_usb_tethering/images/01-lsusb.png&#34;&gt; 
        &lt;img 
    
          class=&#34;pure-img-responsive&#34;
          
          src=&#34;https://www.freedomwolf.cc/2020/01/auto_switching_usb_tethering/images/01-lsusb.png&#34;
          
          alt=&#34;lsusb.&#34;
          &gt;
        &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  

&lt;/div&gt;

這邊我們需要的是手機的那條，我的是 Sony 手機，所以位於圖片中第一條。接著找到 &lt;code&gt;ID&lt;/code&gt; 後方的 &lt;code&gt;0fce:01ba&lt;/code&gt;，前四碼是 vendor ID，後四碼是 product ID，基本上同樣的廠商會是一樣的 vendor ID，所以同品牌手機愛好者就有福了，不過先假設只有這隻手機需要拿來分享網路，所以請記住&lt;font color=&#34;red&#34;&gt; vender ID &lt;/font&gt; ，後面會需要它。&lt;/p&gt;
&lt;h2 id=&#34;設定-systemd-networkd&#34;&gt;設定 systemd-networkd&lt;/h2&gt;
&lt;p&gt;知道手機 &lt;code&gt;vendor ID&lt;/code&gt; 後，接著要設定手機接上電腦後的裝置辨識，因為 systemd 的緣故，NIC 命名都是 &lt;code&gt;enpxxxx&lt;/code&gt; 之類的，然後每次插手機後裝置名稱都會不一樣，所以要先來固定住 NIC 名稱。&lt;/p&gt;
&lt;h3 id=&#34;編寫-30-rndislink&#34;&gt;編寫 30-rndis.link&lt;/h3&gt;
&lt;p&gt;當然名稱隨便填都可以，但是數字可以往後安排一點（數字影響讀取的順序），以下給一個範例：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Match]
Driver=rndis_host

[Link]
Description=Adnroid Rndis Link
NamePolicy=keep
Name=rndis
MACAddressPolicy=persistent
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在 &lt;code&gt;[Match]&lt;/code&gt; 中，可以選擇使用 &lt;code&gt;MACAddress=&lt;/code&gt; 來指令沒錯，但是考量到可能會更換手機的關係，所以使用&lt;code&gt;驅動程式&lt;/code&gt;來作為判斷標準，&lt;code&gt;rndis_host&lt;/code&gt; 也就是 &lt;a href=&#34;https://zh.wikipedia.org/wiki/RNDIS&#34;&gt;RNDIS&lt;/a&gt; 在 Linux 下的驅動，多數情況都是手機網路分享才會用到這個驅動，如果讀者會有其他情況用到 RNDIS 的話就自己更改一下匹配規則囉。&lt;br&gt;
&lt;code&gt;NamePolicy=keep&lt;/code&gt; 讓他不會被系統自動命名，然後下行的 &lt;code&gt;Name=&lt;/code&gt;可以自己取名字，這裡就會成為之後在系統中對於手機 NIC 的辨識名稱。&lt;br&gt;
&lt;code&gt;MACAddressPolicy=persisten&lt;/code&gt; 就是使用原本的 Mac 位置，除非無法取得就隨機產生一個，基本上不會影響使用。&lt;/p&gt;
&lt;p&gt;然後這段就完成了。&lt;/p&gt;
&lt;h3 id=&#34;編寫-30-rndisnetwork&#34;&gt;編寫 30-rndis.network&lt;/h3&gt;
&lt;p&gt;名稱盡量跟前面一樣，可以做一組配對方便辨識，以下給一組範例：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Match]
Name=rndis

[Network]
DHCP=true

[DHCP]
RouteMetric=10
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;[Match&lt;/code&gt; 的話採用 &lt;code&gt;Name=&lt;/code&gt; 匹配裝置，因為前面已經有指定裝置名稱了，所以可以這樣用，當然如果名稱設定不一樣請記得做更改。&lt;br&gt;
&lt;code&gt;[Network]&lt;/code&gt; 部份，&lt;code&gt;DHCP&lt;/code&gt; 一般來說是 &lt;code&gt;yes&lt;/code&gt;，手機自己會做分配。&lt;br&gt;
&lt;code&gt;[DHCP]&lt;/code&gt; 底下的 &lt;code&gt;RouteMetric=&lt;/code&gt; 是重點，這邊設定為 &lt;code&gt;10&lt;/code&gt;，代表權重，數字越小權重越大，之後會用到。&lt;br&gt;
到這邊就算完成了讓系統在手機接上去後可以自動連接設定網路的部份。&lt;/p&gt;
&lt;h3 id=&#34;修改原本的網路&#34;&gt;修改原本的網路&lt;/h3&gt;
&lt;p&gt;因為原本有連線存在，如果沒有的話就可以略過這段。&lt;br&gt;
假設原本的網路是 &lt;code&gt;enp3s0&lt;/code&gt; 好了，設定檔在 &lt;code&gt;20-enp3s0.network&lt;/code&gt;（這時候的 &lt;code&gt;20-enp3s0.link&lt;/code&gt; 不重要，因為這是管理硬體連線用的），打開設定檔後，在 &lt;code&gt;[DHCP]&lt;/code&gt; 下多加一條:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[DHCP]
RouteMetric=20
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這邊的 &lt;code&gt;RouteMetric=&lt;/code&gt; 基本上只要比前面設定的小就可以了，這會影響到路由的權重，所以看起來會像這樣：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;NIC&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;RouterMetric&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;RNDIS&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;enp3s0&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;當然，只有 &lt;code&gt;enp3s0&lt;/code&gt; 存在時也只有它可以走，權重就不影響了，只有在兩者同時存在時才會有權重問題。&lt;/p&gt;
&lt;h2 id=&#34;測試設定&#34;&gt;測試設定&lt;/h2&gt;
&lt;p&gt;這時候把手機插上電腦，手機選擇「USB 數據連線」，然後重新啟動 systemd-networkd：&lt;br&gt;
&lt;code&gt;# systemctl restart systemd-networkd&lt;/code&gt;&lt;br&gt;
這時候可以用查詢 IP 位置的方式看看是不是有改變，如果沒有的話可以看是不是裝置沒有被變更到：&lt;br&gt;
&lt;code&gt;$ ip l s&lt;/code&gt; 應該要出現 &lt;code&gt;rndis&lt;/code&gt;，像是這樣：&lt;br&gt;


&lt;div class=&#34;pure-g&#34;&gt;

  
  
  
  
  &lt;div class=&#34;pure-u-1-1&#34;&gt;
    &lt;div style=&#34;padding: 0 .2em&#34;&gt;
      
    
    
    
      &lt;a target=&#34;_blank&#34; href=&#34;https://www.freedomwolf.cc/2020/01/auto_switching_usb_tethering/images/02-ip_a_s.png&#34;&gt; 
        &lt;img 
    
          class=&#34;pure-img-responsive&#34;
          
          src=&#34;https://www.freedomwolf.cc/2020/01/auto_switching_usb_tethering/images/02-ip_a_s.png&#34;
          
          alt=&#34;ip a s.&#34;
          &gt;
        &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  

&lt;/div&gt;

如果有出現裝置，但是名稱不對的話，應該是設定檔沒有寫好，再看看是不是打錯了什麼。&lt;/p&gt;
&lt;h2 id=&#34;設定-udev&#34;&gt;設定 udev&lt;/h2&gt;
&lt;p&gt;前面的部份如果插入拔出的話都要自己手動重新啟動 systemd-networkd 才能套用網路，但是這裡可以透過 &lt;code&gt;udev&lt;/code&gt; 來偵測裝置行為後進行動作，還記的前面的 &lt;code&gt;vendor ID&lt;/code&gt; 嗎？這時候派上用場了！&lt;br&gt;
我們要先新增一個 &lt;code&gt;udev rule&lt;/code&gt;，要放置在 &lt;code&gt;/etc/udev/rules.d/&lt;/code&gt; 底下，名稱的話也是隨便取，這邊就叫它 &lt;code&gt;90-android-tethering.rules&lt;/code&gt;，裡面長這樣：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ACTION==&amp;#34;add|remove&amp;#34;, SUBSYSTEM==&amp;#34;net&amp;#34;, ATTR{idVendor}==&amp;#34;18d1&amp;#34; ENV{ID_USB_DRIVER}==&amp;#34;rndis_host&amp;#34;, SYMLINK+=&amp;#34;android&amp;#34;, RUN+=&amp;#34;/usr/bin/systemctl restart systemd-networkd.service&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中的 &lt;code&gt;18d1&lt;/code&gt; 要改成自己的 vendor ID，所以實際上會像這樣：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ACTION==&amp;#34;add|remove&amp;#34;, SUBSYSTEM==&amp;#34;net&amp;#34;, ATTR{idVendor}==&amp;#34;0fce&amp;#34; ENV{ID_USB_DRIVER}==&amp;#34;rndis_host&amp;#34;, SYMLINK+=&amp;#34;android&amp;#34;, RUN+=&amp;#34;/usr/bin/systemctl restart systemd-networkd.service&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後保存，接著再重新把手機插上去，這次就不要手動下指令重新啟動 systemd-networkd 了，看看是不是可以正常切換呢？&lt;br&gt;
如果可以的話，恭喜你完成了這樣方便的功能！&lt;/p&gt;
&lt;h2 id=&#34;結論&#34;&gt;結論&lt;/h2&gt;
&lt;p&gt;筆者之前都沒有這樣的需求，是後來租屋處的網路竟然是 cable 網路還只有 12/3，根本要人命啊，只好拿手機 4G 網路出來壓壓驚，但是有線網路在，手機插上去又不會自動改順序，只好自己看一下要怎樣處理這個問題了，也順便分享給大家，如果遇到這樣的情況也可以輕鬆解決。&lt;br&gt;
然後讚嘆 ArchLinux Wiki 可以方便查資料。&lt;br&gt;
附上資料來源囉：&lt;a href=&#34;https://wiki.archlinux.org/index.php/Android_tethering&#34;&gt;Android tethering&lt;/a&gt;，裡面還有很多種方法，筆者自己覺得這樣是最好用最方便的，推薦給大家。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>使用 systemd-resolved 設定 DNS 域名解析</title>
      <link>https://www.freedomwolf.cc/2020/01/dns_by_systemd/</link>
      <pubDate>2020-01-03 19:30 +0800</pubDate>
      
      <guid>https://www.freedomwolf.cc/2020/01/dns_by_systemd/</guid>
      <description>&lt;p&gt;

&lt;div class=&#34;pure-g&#34;&gt;

  
  
  
  
  &lt;div class=&#34;pure-u-1-1&#34;&gt;
    &lt;div style=&#34;padding: 0 .2em&#34;&gt;
      
    
    
    
      &lt;a target=&#34;_blank&#34; href=&#34;https://www.freedomwolf.cc/2020/01/dns_by_systemd/images/00-cover.svg&#34;&gt; 
        &lt;img 
    
          class=&#34;pure-img-responsive&#34;
          
          src=&#34;https://www.freedomwolf.cc/2020/01/dns_by_systemd/images/00-cover.svg&#34;
          
          alt=&#34;Cover&#34;
          &gt;
        &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  

&lt;/div&gt;

接續上一篇 systemd-networkd 後，是說明 DNS 解析的部份。&lt;br&gt;
一般來說都是給系統（普遍都是 DHCP 配發 DNS server 給各位）處理，也就是系統內的 &lt;code&gt;Name Service Switch&lt;/code&gt;（簡稱 NSS）去做解析，但是這東西有些年頭了，新的協定像是 &lt;a href=&#34;https://zh.wikipedia.org/zh-tw/%E5%9F%9F%E5%90%8D%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8%E6%89%A9%E5%B1%95&#34;&gt;DNSSEC&lt;/a&gt;、&lt;a href=&#34;https://zh.wikipedia.org/zh-tw/DNS_over_TLS&#34;&gt;DNS over TLS&lt;/a&gt; 都沒有支援，對於安全性來說是減少了許多。&lt;br&gt;
於是在 systemd 裡面就有了 systemd-resolved 出現來代替 NSS 的位置。&lt;/p&gt;
&lt;p&gt;大部分前面都說過了，就從設定檔開始說起吧！&lt;br&gt;
大致上跟域名解析會有幾個檔案有關係：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/etc/hosts&lt;br&gt;
這是本機的 DNS 查詢，這個優先權最大，有符合的話會直接被套用不會再查詢。&lt;/li&gt;
&lt;li&gt;/etc/resolv.conf&lt;br&gt;
這是 DNS 伺服器設定的位置，需要查詢就會從這裡抓伺服器。&lt;/li&gt;
&lt;li&gt;/etc/systemd/resolved.conf&lt;br&gt;
這是 systemd-resolved 的設定檔，也是今天的主軸。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;設定系統使用-systemd-resolved&#34;&gt;設定系統使用 systemd-resolved&lt;/h2&gt;
&lt;p&gt;預設來說都不會採用 systemd-resolved  作為 DNS 查詢，所以都要自己設定一下。&lt;br&gt;
&lt;code&gt;systemd-resolved&lt;/code&gt; 是一個獨立的 DNS 服務，有 API 可以呼叫查詢，但是同時也提供的傳統的 &lt;code&gt;nameserver&lt;/code&gt; 監聽服務，也就是說，如果你開啟了 systemd-resolved 服務，但是沒有用任何 API 或是對它發送查詢的話也是沒有用的，接下來就是讓查詢會往 systemd-resolved 送囉。&lt;br&gt;
一般來說都是透過 &lt;code&gt;/etc/resolv.conf&lt;/code&gt; 更改 nameserver 去指定 DNS 位置，不過 systemd-resolved 自己有提供文件，所以這邊就直接 link 過去就可以了。&lt;br&gt;
&lt;code&gt;# ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf&lt;/code&gt;&lt;br&gt;
這樣的話就會把一般的 DNS 查詢也丟過去了，也不用自己管理 &lt;code&gt;/etc/resolv.conf&lt;/code&gt; ，最方便的設定方式了。之後看 &lt;code&gt;/etc/resolv.conf&lt;/code&gt;  會長像這樣：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run &amp;#34;resolvectl status&amp;#34; to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.53
options edns0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;基本上就是跟 &lt;code&gt;/etc/resolv.conf&lt;/code&gt; 長差不多，就是 nameserver 指定到 &lt;code&gt;127.0.0.53&lt;/code&gt;，這就是 systemd-resolved 監聽的位置，這邊就完成 DNS 查詢的轉換了。&lt;/p&gt;
&lt;h2 id=&#34;設定-systemd-resolved&#34;&gt;設定 systemd-resolved&lt;/h2&gt;
&lt;p&gt;設定檔位置在 &lt;code&gt;/etc/systemd/resolved.conf &lt;/code&gt;，打開就像這樣（我把註解刪掉）：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Resolve]
#DNS=
#FallbackDNS=1.1.1.1 9.9.9.10 8.8.8.8 2606:4700:4700::1111 2620:fe::10 2001:4860:4860::8888
#Domains=
#LLMNR=yes
#MulticastDNS=yes
#DNSSEC=allow-downgrade
#DNSOverTLS=no
#Cache=yes
#DNSStubListener=yes
#ReadEtcHosts=yes
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;一般來說其實不太用動它，自己可以運作很好，不過還是稍微說一下幾個重點：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DNS=&lt;br&gt;
基本上是會從 DHCP 裡面撈，如果撈不到就會抓 &lt;code&gt;/etc/resolv.conf&lt;/code&gt; 來用。&lt;/li&gt;
&lt;li&gt;FallbackDNS=&lt;br&gt;
如果連 &lt;code&gt;/etc/resolv.conf&lt;/code&gt; 都沒有可以用的，就會抓這裡的來用，基本上不太會用到這裡的位置。&lt;/li&gt;
&lt;li&gt;DNSSEC=&lt;br&gt;
有 &lt;code&gt;yes&lt;/code&gt;、&lt;code&gt;no&lt;/code&gt; 以及 &lt;code&gt;allow-downgrade&lt;/code&gt;，最後一個（也是預設選項）就是如果查詢時簽名驗證失敗的話，也允許使用結果。&lt;br&gt;
但是有開啟 DNSSEC 的話都會增加一點反應時間，如果覺得查詢變很慢的話，可以考慮關閉一下 DNSSEC。&lt;/li&gt;
&lt;li&gt;Cache=&lt;br&gt;
開啟本機快取，算是最主要得功能之一，因為你查詢過後，就可以直接從本機撈不用再往外跑一次，速度會快上許多，又如果有開啟 DNSSEC 的話，更不用走大老遠再次查詢已經驗證過的資料了。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;筆者個人人為，需要改的就只有 &lt;code&gt;DNSSEC&lt;/code&gt; 視情況可以關閉，&lt;code&gt;DNS&lt;/code&gt; 的話可以在 AP 上 或是 systemd-networkd 上就設定好不需要這邊手動指定。&lt;br&gt;
詳細可以參考 &lt;a href=&#34;https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd-resolved.8&#34;&gt;systemd-resolved(8)&lt;/a&gt; 以及 &lt;a href=&#34;https://jlk.fjfi.cvut.cz/arch/manpages/man/resolved.conf.5&#34;&gt;resolved.conf(5)&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&#34;一些工具&#34;&gt;一些工具&lt;/h2&gt;
&lt;p&gt;上面設定完後，可以看一下下面的工具，方便偵錯或是檢視運作情況。&lt;/p&gt;
&lt;h3 id=&#34;resolvectl&#34;&gt;resolvectl&lt;/h3&gt;
&lt;p&gt;常用的會有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;resolvectl query &lt;code&gt;domain | ip address&lt;/code&gt;&lt;br&gt;
用於 DNS 的正向或反向查詢，取決於輸入資料。&lt;br&gt;
裡面也會寫查詢的協議、回應時間等等資料。&lt;/li&gt;
&lt;li&gt;resolvectl status&lt;br&gt;
查詢目前 systemd-resolved 的設定。&lt;/li&gt;
&lt;li&gt;resolvectl statistics&lt;br&gt;
查詢 systemd-resolved 的統計資料，像是快取數量及命中率。&lt;/li&gt;
&lt;li&gt;resolvectl flush-caches&lt;br&gt;
清除本機 DNS 快取，一般來說應該用不到，除非 DNS 被污染而快取錯誤的資料吧。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;結論&#34;&gt;結論&lt;/h2&gt;
&lt;p&gt;雖然有這麼多新的功能，但是我只是要查詢 DNS 而已啊要這麼多東西幹麻呢？至少在台灣用不到吧，沒有網路封鎖的地方，不怕被 &lt;a href=&#34;https://zh.wikipedia.org/zh-tw/%E4%B8%AD%E9%96%93%E4%BA%BA%E6%94%BB%E6%93%8A&#34;&gt;MITM&lt;/a&gt; 也不怕域名污染。&lt;br&gt;
不過如果哪一天我們面臨到這樣的問提，或許就可以有恃無恐的解決這問題了。&lt;/p&gt;
&lt;h3 id=&#34;補充&#34;&gt;補充&lt;/h3&gt;
&lt;p&gt;我不太清楚是為什麼，筆者自己之前會有 &lt;code&gt;ping&lt;/code&gt; 回不來的問題，也有 &lt;code&gt;gpg&lt;/code&gt; 無法連接金鑰伺服的問題，如果有遇到上述問題的話，就還是改回 &lt;code&gt;nameserver 1.1.1.1&lt;/code&gt; 吧，這篇就當長知識就好。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>使用 systemd-networkd 設定網路組態</title>
      <link>https://www.freedomwolf.cc/2019/10/network_by_systemd/</link>
      <pubDate>2019-10-21 01:30 +0800</pubDate>
      
      <guid>https://www.freedomwolf.cc/2019/10/network_by_systemd/</guid>
      <description>&lt;p&gt;

&lt;div class=&#34;pure-g&#34;&gt;

  
  
  
  
  &lt;div class=&#34;pure-u-1-1&#34;&gt;
    &lt;div style=&#34;padding: 0 .2em&#34;&gt;
      
    
    
    
      &lt;a target=&#34;_blank&#34; href=&#34;https://www.freedomwolf.cc/2019/10/network_by_systemd/images/00-cover.svg&#34;&gt; 
        &lt;img 
    
          class=&#34;pure-img-responsive&#34;
          
          src=&#34;https://www.freedomwolf.cc/2019/10/network_by_systemd/images/00-cover.svg&#34;
          
          alt=&#34;Cover&#34;
          &gt;
        &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  

&lt;/div&gt;

對於現在來說，網路是十分重要的一種資源，「網路若不好，人生是黑白的」，現在要你沒有網路大概就跟死了一樣吧 XD。在 Windows 下比較沒有網路問題，畢竟你連選擇都沒有，不過在 Linux 下你選擇就很多了。&lt;br&gt;
從以前 Gnome 提供的 &lt;code&gt;NetworkManager&lt;/code&gt; 到現在各式這樣的網路管理器，大家都有各自的優缺點，端看自己想要怎麼選擇了。&lt;br&gt;
於是今天我要介紹的是近期的新秀 &lt;code&gt;systemd&lt;/code&gt; 所提供的 &lt;code&gt;systemd-networkd&lt;/code&gt;，包含怎麼去設定、調整以及後續的整合，這篇算是前導文，之後還會有一系列的延伸應用。&lt;/p&gt;
&lt;h2 id=&#34;network-managers&#34;&gt;Network Managers?&lt;/h2&gt;
&lt;p&gt;說到網路，一定要有東西來管它，那就是「網路管理器（Network Managers）」了，常見的有上述說的 NetworkManager、netctl 及 systemd-networkd，這些東西都是管理整個系統的網路組態，其中當然包含 NIC（Network Interface Controller：網路卡）的管理，以及連線、路由、IP 設定等都是由網路管理器負責。&lt;br&gt;
這樣說起來，網路管理器的身份就非常重要了，除非你不需要網路，那就跟你一點關係都沒有XD。說回來，如果要網路乖乖，除了放一包乖乖外，跟網路管理器搞好關係也是非常重要的事情，只要適當的處理好，之後要修改或是維護都非常的容易，所以第一步就是要選一個你喜歡的網路管理器。&lt;/p&gt;
&lt;h3 id=&#34;networkmanager&#34;&gt;NetworkManager?&lt;/h3&gt;
&lt;p&gt;你說你不知道要選什麼？也是，雖然本文主題是 systemd-networkd，不過就先從大多數都會有的 NetworkManager 開始吧！但是因為主題不是著重在 NetworkManager 上，所以容許我簡單帶過。&lt;br&gt;
NetworkManager（以下簡稱 NM）名字就跟網路管理器一模一樣，在 systemd 中的 service 就是長這樣大小寫有區分，如果需要操作它還請注意大小寫。&lt;br&gt;
NM 跟 Gnome 的關係非常好，幾乎都會在安裝 Gnome 時連同依賴關係一起安裝，所以選擇 Gnome 系的 Window Manager 都會看見 NM 的蹤影，基本上不會讓你沒有網路用就是了。&lt;br&gt;
NM 有不好嗎？幹麻要換掉它？也不是說 NM 不好，就單純不喜歡，或許對一般使用者來說算是非常親民，易用的設定畫面，還有配合桌面的小工具，其實算是非常方便的，但是對於我來說就稍稍不適合了，又或者對於非使用 Gnome 的人，NM 的優勢也就沒這麼明顯，不過如果你用 Gnome 的話，NM 應該會因為依賴關係無法移除，那就不要理它，把它停用就好 XD。&lt;br&gt;
&lt;code&gt;sudo systemctl disable NetworkManager&lt;/code&gt; 給他下去就對了 XD。&lt;/p&gt;
&lt;h3 id=&#34;systemd-networkd&#34;&gt;systemd-networkd?&lt;/h3&gt;
&lt;p&gt;簡單說完 NM 了，現在來到主軸 systemd-networkd，其實會選用 systemd-networkd 的關係還有是現在多數發行版都改用 systemd 來取代 System V，所以統一用 systemd 來管理也比較方便，systemd 也提供完整的元件可以使用，而不需要另外安裝東西或依賴，在同一套系統內也比較好釐清之間的關係。所以其實如果沒有特別需求的話（就是一般的使用者啦，只需要上網的那種），我都會比較推薦用 systemd-networkd，目前大多數的情況下都沒有問題，等一下會講說哪種情況下不建議使用。&lt;/p&gt;
&lt;h4 id=&#34;我該不該用-systemd-networkd&#34;&gt;我該不該用 systemd-networkd？&lt;/h4&gt;
&lt;p&gt;目前我知道有一種情況你不要用比較好，就是&lt;font color=&#34;red&#34;&gt;你是直接撥號的 (PPPoE)&lt;/font&gt;，因為 systemd-networkd 目前不支援 ppp，所以沒有辦法幫你處理這問題，必須藉由 &lt;code&gt;pppd&lt;/code&gt; 幫你撥號完才能完成後續，不過本文就先以位於 AP 後面的機器（也就是 AP 幫你撥號完了）為例子，一般家裡多數應該也會是這樣的狀態，無論是用中華電信提供的 DSL 或是額外接的 AP，我應該之後會補一篇用 ppp 接進 systemd-networkd 的文，至少我現在沒有設備可以測試就是了。&lt;/p&gt;
&lt;h2 id=&#34;dhcp-client&#34;&gt;DHCP Client?&lt;/h2&gt;
&lt;p&gt;如果用 NM 的話，有三種方式使用 DHCP，透過 systemd-networkd、dhcpcd 或 dhclient，不過不建議用 dhcpcd，因為&lt;font color=&#34;red&#34;&gt;因為 NM 不支援透過 dhcpcd取得 IPv6&lt;/font&gt;，而 systemd-networkd 自己就可以處理 DHCP 了，也不需要安裝其他元件。&lt;/p&gt;
&lt;h2 id=&#34;dns-解析&#34;&gt;DNS 解析?&lt;/h2&gt;
&lt;p&gt;一樣的 systemd 提供了 systemd-resolved 負責處理 DNS 解析的工作，除了一般解析外，還支援 &lt;a href=&#34;https://zh.wikipedia.org/zh-tw/%E5%9F%9F%E5%90%8D%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8%E6%89%A9%E5%B1%95&#34;&gt;DNSSEC&lt;/a&gt;、&lt;a href=&#34;https://zh.wikipedia.org/zh-tw/DNS_over_TLS&#34;&gt;DNS over TLS&lt;/a&gt;、群播 DNS (mDNS) 及 LLNMR，後兩者比較不常見，前兩者算是目前比較新的規範，提昇了 DNS 查詢的安全性。&lt;br&gt;
有關 systemd-resolved 的部份應該會另外寫一篇來說明。&lt;/p&gt;
&lt;h2 id=&#34;設定-systemd-networkd&#34;&gt;設定 systemd-networkd&lt;/h2&gt;
&lt;p&gt;終於來到這裡了，在經過上面的講解不知道有沒有更了解 systemd-networkd 扮演什麼角色呢？這裡就再簡單說明一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;管理網路卡
&lt;ul&gt;
&lt;li&gt;名稱&lt;/li&gt;
&lt;li&gt;MTU&lt;/li&gt;
&lt;li&gt;雙工模式&lt;/li&gt;
&lt;li&gt;還有其他東西&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;管理網路連線
&lt;ul&gt;
&lt;li&gt;DHCP 設定&lt;/li&gt;
&lt;li&gt;IP 設定&lt;/li&gt;
&lt;li&gt;路由設定&lt;/li&gt;
&lt;li&gt;還有其他東西&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 systemd-networkd 中，有三種設定檔，存放在 &lt;code&gt;/etc/systemd/network/&lt;/code&gt; 之中，分別是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.link&lt;br&gt;
負責處理 NIC 配置。&lt;/li&gt;
&lt;li&gt;.netdev&lt;br&gt;
負責處理虛擬 NIC 配置。&lt;/li&gt;
&lt;li&gt;.network&lt;br&gt;
負責處理網路連線配置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在這邊就不提 &lt;code&gt;.netdev&lt;/code&gt; 了，一般來說是用不到虛擬 NIC 的。&lt;/p&gt;
&lt;h3 id=&#34;設定-link-檔&#34;&gt;設定 .link 檔&lt;/h3&gt;
&lt;p&gt;這檔案攸關 NIC 是否運作正常，這裡貼出一個範例檔案：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Match]
MACAddress= 01:5a:f3:a8:84:76

[Link]
NamePolicy=kernel database onboard slot path
MACAddressPolicy=persistent
WakeOnLan=magic
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;[Match]&lt;/code&gt; 的部份，只有&lt;font color=&#34;red&#34;&gt;完全符合&lt;/font&gt;其中的設定值，才會把以下的設定都套進這個 NIC 中。範例中是以 MAC 位置做為判斷標準，其他還可以用像是 &lt;code&gt;Driver&lt;/code&gt; 作為判斷標準，詳細可以在 &lt;a href=&#34;https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd.link.5#_MATCH__SECTION_OPTIONS&#34;&gt;systemd.link(5)&lt;/a&gt; 找到。&lt;br&gt;
&lt;code&gt;[Link]&lt;/code&gt; 的話，包含命名方式、MAC 位置設定、WOL 設定及雙工模式都在這裡設定。範例中的 &lt;code&gt;NamePolicy&lt;/code&gt; 是設定命名順序，符合後就停止往後尋找，一般來說是不需要去設定或更動的。&lt;code&gt;MACAddressPolicy&lt;/code&gt; 設定 MAC 位置，一般來說也是固定位置，不太需要更動。最後是 &lt;code&gt;WakeOnLan&lt;/code&gt;，設定只有 &lt;code&gt;magic 封包&lt;/code&gt;可以喚醒電腦，細部設定一樣可以在 &lt;a href=&#34;https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd.link.5#_LINK__SECTION_OPTIONS&#34;&gt;systemd.link(5)&lt;/a&gt; 找到。&lt;br&gt;
如果你懶的話，可以拿上面的設定檔去用，把 &lt;code&gt;MACAddress=&lt;/code&gt; 換成自己的就可以。&lt;/p&gt;
&lt;h4 id=&#34;設定範例更改-nic-名稱&#34;&gt;設定範例：更改 NIC 名稱&lt;/h4&gt;
&lt;p&gt;以往都要用更改 udev  rule 的方式會有點討厭，NIC 的部份就可以用 .link 檔案做到。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Link]
NamePolicy=keep
Name=MyNic
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在 &lt;code&gt;[Link]&lt;/code&gt; 中改寫這兩行，把 &lt;code&gt;Name=&lt;/code&gt; 的值改成自己要的後存檔，重新啟動 systemd-networkd（內建網卡的話應該要重開機？），就會生效了。&lt;/p&gt;
&lt;h3 id=&#34;設定-network-檔&#34;&gt;設定 .network 檔&lt;/h3&gt;
&lt;p&gt;確定好 NIC 設定後就是設定網路連線了，以下是一個簡易的設定：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Match]
Name=enp3s0

[Network]
DHCP=true
IPv6PrivacyExtensions=true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;[Match]&lt;/code&gt; 跟 .link 檔一樣，全部符合才會採用，條件一樣多元，但是在上面已經以 MAC 位置設定好 NIC 名稱了，所以就直接以 &lt;code&gt;Name=&lt;/code&gt; 來指定 NIC 做設定。&lt;br&gt;
（請注意，Name 可以使用萬用字元進行比對，像是 &lt;code&gt;enp*&lt;/code&gt; 就會指定到所有 &lt;code&gt;enp&lt;/code&gt; 開頭的 NIC）&lt;br&gt;
&lt;code&gt;[Network]&lt;/code&gt; 就是最主要設定的部份了，一般來說 DHCP 選項可以設定成：true、ipv4、ipv6，true 的話就是同時使用 IPv4 以及 IPv6，如果不在 IPv6 網路的話就可以只啟用 IPv4 的 DHCP 服務，又或者只需要透過 DHCP 使用 IPv6 的話，下面可以手動設定 IPv4 位置。&lt;br&gt;
其他還有 &lt;code&gt;[Link]&lt;/code&gt; &lt;code&gt;[Address]&lt;/code&gt; &lt;code&gt;[Route]&lt;/code&gt; &lt;code&gt;[DHCP]&lt;/code&gt;，因為 &lt;code&gt;[Link]&lt;/code&gt; 在 .link 中設定過了就不理它，至於其他部份是手動設定才需要輸入的。&lt;code&gt;[Address]&lt;/code&gt; 與 &lt;code&gt; [Route]&lt;/code&gt; 都可以在 &lt;code&gt;[Network]&lt;/code&gt; 中簡單設定，沒有特殊需求也可以不需要獨立寫出來。&lt;br&gt;
另外值得注意的是，在上面的範例中有一條 &lt;code&gt;IPv6PrivacyExtensions=true&lt;/code&gt;，這是根據 &lt;a href=&#34;https://tools.ietf.org/html/rfc4941&#34;&gt;RFC 4941&lt;/a&gt; 所設計的，代表在使用 IPv6 時，如果採用 SLAAC 的方式取得 IPv6 位置，會另外產生一個 IPv6 位置，而不是使用前一個基於 MAC 位置所產生的 IPv6 位置，如果你是用 IPv6 網路的話可以把這個選項加進去。&lt;/p&gt;
&lt;p&gt;其他設定檔的細項可以在 &lt;a href=&#34;https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd.network.5&#34;&gt;systemd.network(5)&lt;/a&gt; 中找到。&lt;/p&gt;
&lt;h4 id=&#34;設定範例手動指定-ip-位置及-gateway&#34;&gt;設定範例：手動指定 IP 位置及 Gateway&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Match]
Name=enp3s0

[Network]
Address=192.168.0.2/24
Gateway=192.168.0.1
DNS=1.1.1.1
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;結論&#34;&gt;結論&lt;/h2&gt;
&lt;p&gt;看起來應該不會太難吧？自己在摸索的過程中覺得算是很好寫的設定檔，簡單又直覺，很多比較複雜的保持預設值都不會有太大的問題，簡單幾行自己需要的填上去就大公告成了！&lt;br&gt;
&lt;strong&gt;歡迎大家改用 systemd-networkd！&lt;/strong&gt;&lt;br&gt;
然後啊，請記得所有設定檔修改完後都需要重新啟動 systemd-networkd ，也就是 &lt;code&gt;sudo systemctl restart systemd-networkd&lt;/code&gt; 要給它執行過一次嘿，不然自己改得很開心卻都沒有套用進去真的會給它氣死。&lt;br&gt;
大致上就這樣吧，有線網路就到這邊了，無線網路可能要等等，要弄的東西更多了，而且在沒有 GUI 的情況下都用指令操作無線網路連線確實是有點複雜，應該是系列文擺在最後再寫吧。&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>