Linux 中的網路指令:如何檢視一個域名有哪些 NS 記錄?

守望碼靈發表於2021-01-04

遠端操作指令

  • 遠端操作指令用的最多的是ssh,ssh指令允許遠端登入到目標計算機並進行遠端操作和管理。
  • 還有一個比較常用的遠端指令是scp,scp幫助我們遠端傳送檔案。

ssh (Secure Shell)

  • 有一種場景需要遠端登入一個 Linux 系統,這時我們會用到ssh指令。比如你想遠端登入一臺機器,可以使用ssh user@ip的方式

  • 上圖中,我在使用ssh指令從機器u1登入我的另一臺虛擬機器u2。這裡u1和u2對應著 IP 地址,是我在/etc/hosts中設定的,如下圖所示:

  •  /etc/hosts這個檔案可以設定 IP 地址對應的域名。我這裡是一個小叢集,總共有兩臺機器,因此我設定了方便記憶和操作的名字。

scp

  • 另一種場景是我需要拷貝一個檔案到遠端,這時可以使用scp指令,如下圖,我使用scp指令將本地計算機的一個檔案拷貝到了 ubuntu 虛擬機器使用者的家目錄中。
  • 比如從u1拷貝家目錄下的檔案a.txt到u2。家目錄有一個簡寫,就是用~。具體指令見下圖:

  •  輸入 scp 指令之後會彈出一個提示,要求輸入密碼,系統驗證通過後檔案會被成功拷貝。

檢視本地網路狀態

  • 如果你想要了解本地的網路狀態,比較常用的網路指令是ifconfig和netstat

ifconfig

  • 當你想知道本地ip以及本地有哪些網路介面時,就可以使用ifconfig指令。你可以把一個網路介面理解成一個網路卡,有時候虛擬機器會裝虛擬網路卡,虛擬網路卡是用軟體模擬的網路卡。
  • 比如:VMware 為每個虛擬機器創造一個虛擬網路卡,通過虛擬網路卡接入虛擬網路。當然物理機也可以接入虛擬網路,它可以通過虛擬網路向虛擬機器的虛擬網路卡上傳送資訊。
  • 下圖是我的 ubuntu 虛擬機器用 ifconfig 檢視網路介面資訊。

  • 可以看到我的這臺 ubuntu 虛擬機器一共有 2 個網路卡,ens33 和 lo。
  • lo是本地迴路(local lookback),傳送給lo就相當於傳送給本機。
  • ens33是一塊連線著真實網路的虛擬網路卡。

netstat

  • 另一個檢視網路狀態的場景是想看目前本機的網路使用情況,這個時候可以用netstat
  • 預設行為
    • 不傳任何引數的netstat幫助查詢所有的本地 socket,下圖是netstat | less的結果。
    • 如上圖,我們看到的是 socket 檔案。socket 是網路插槽被抽象成了檔案,負責在客戶端、伺服器之間收發資料。當客戶端和服務端發生連線時,客戶端和服務端會同時各自生成一個 socket 檔案,用於管理這個連線。這裡,可以用wc -l數一下有多少個socket。
    • 你可以看到一共有 615 個 socket 檔案,因為有很多 socket 在解決程式間的通訊。就是將兩個程式一個想象成客戶端,一個想象成服務端。並不是真的有 600 多個連線著網際網路的請求。
    •  

檢視 TCP 連線

  • 如果想看有哪些 TCP 連線,可以使用netstat -t。比如下面我通過netstat -t看tcp協議的網路情況:
  • 這裡沒有找到連線中的tcp,因為我們這臺虛擬機器當時沒有發生任何的網路連線。因此我們嘗試從機器u2(另一臺機器)ssh 登入進u1,再看一次:
  • 如上圖所示,可以看到有一個 TCP 連線了。

檢視埠占用

還有一種非常常見的情形,我們想知道某個埠是哪個應用在佔用。如下圖所示:

  • 這裡我們看到 22 埠被 sshd,也就是遠端登入模組被佔用了。
  • -n是將一些特殊的埠號用數字顯示,-t是指看 TCP 協議,-l是隻顯示連線中的連線,-p是顯示程式名稱。

網路測試

  • 當我們需要測試網路延遲、測試服務是否可用時,可能會用到ping和telnet指令。

ping

  • 想知道本機到某個網站的網路延遲,就可以使用ping指令。如下圖所示:
  •  ping一個網站需要使用 ICMP 協議。因此你可以在上圖中看到 icmp 序號。 這裡的時間time是往返一次的時間。ttl叫作 time to live,是封包的生存時間。就是說,一個封包從發出就開始倒數計時,如果途中超過 128ms,這個包就會被丟棄。如果包被丟棄,就會被算進丟包率。
  • 另外ping還可以幫助我們看到一個網址的 IP 地址。 通過網址獲得 IP 地址的過程叫作 DNS Lookup(DNS 查詢)。ping利用了 DNS 查詢,但是沒有顯示全部的 DNS 查詢結果。

telnet

  • 有時候我們想知道本機到某個 IP + 埠的網路是否通暢,也就是想知道對方伺服器是否在這個埠上提供了服務。這個時候可以用telnet指令。 如下圖所示:
  • telnet 執行後會進入一個互動式的介面,比如這個時候,我們輸入下圖中的文字就可以傳送 HTTP 請求了

DNS 查詢

  • 我們排查網路故障時想要進行一次 DNS Lookup,想知道一個網址 DNS 的解析過程。這個時候有多個指令可以用。

host

  • host 就是一個 DNS 查詢工具。比如我們查詢拉勾網的 DNS,如下圖所示:
  •  我們看到拉勾網 www.lagou.com 是一個別名,它的原名是 lgmain 開頭的一個域名,這說明拉勾網有可能在用 CDN 分發主頁
  • 上圖中,可以找到 3 個域名對應的 IP 地址。
  • 如果想追查某種型別的記錄,可以使用host -t。比如下圖我們追查拉勾的 AAAA 記錄,因為拉勾網還沒有部署 IPv6,所以沒有找到。

dig

  • dig指令也是一個做 DNS 查詢的。不過dig指令顯示的內容更詳細。下圖是dig拉勾網的結果。

 HTTP 相關

curl

  • 如果要在命令列請求一個網頁,或者請求一個介面,可以用curl指令。curl支援很多種協議,比如 LDAP、SMTP、FTP、HTTP 等。
  • 我們可以直接使用 curl 請求一個網址,獲取資源,比如我用 curl 直接獲取了拉勾網的主頁,如下圖所示:
  • 如果只想看 HTTP 返回頭,可以使用curl -I。
  • 另外curl還可以執行 POST 請求,比如下面這個語句:
  • curl -d '{"x" : 1}' -H "Content-Type: application/json" -X POST http://localhost:3000/api
    

    curl在向localhost:3000傳送 POST 請求。-d後面跟著要傳送的資料, -X後面是用到的 HTTP 方法,-H是指定自定義的請求頭。

總結

  • 遠端登入的 ssh 指令;

  • 遠端拷貝檔案的 scp 指令;

  • 檢視網路介面的 ifconfig 指令;

  • 檢視網路狀態的 netstat 指令;

  • 測試網路延遲的 ping 指令;

  • 可以互動式除錯和服務端的 telnet 指令;

  • 兩個 DNS 查詢指令 host 和 dig;

  • 可以傳送各種請求包括 HTTPS 的 curl 指令。

 

相關文章