--- tags: 1091, lsa --- - Book mode https://hackmd.io/@ncnu-opensource/book Week 05(2020/10/22) === :::info **預習方向** :face_with_monocle: **輸入 URL 後的奇妙世界** 1. 域名解析(Domain_Name --> IP) - 透過 DNS Server 解析 domain_name 對應的 IP 2. 根據 IP 向 web server 發送 request - 傳送過程 TCP/IP 四層架構 - `Link` 根據封包 Mac_address switching (ARP table) - `Network` 根據封包 IP Routing (Routing table) - `Transport` 常見通訊協定為 UDP,TCP,根據不同 port 來連接不同服務 - `Application` 應用解析封包並處裡,常見應用 HTTP, FTP, SSH, telnet... 3. web server 對 request 進行處理並 response - Web Server 的介紹 (nginx, apache2, lighttpd) - Web Server 的設定 - `Virtual host` 透過 domain_name, port, IP 等方式,讓一台或多台 host 可以提供多個服務 - `proxy` 藉由 proxy 設定將封包導向後方主機。可以達到 load balance 或 保護後方主機 的效果 ::: :::warning 問題: 1. UDP 和 TCP 封包有什麼差異特性?封包最大可以到多大? 2. ARP / RARP 在哪一層?作用是什麼? 3. A / AAAA / PTR 紀錄在哪一層?作用是什麼? 4. HTTP 協定在哪一層?有哪些特性? ::: ## 輸入網址: - [FQDN](https://zh.wikipedia.org/wiki/%E5%AE%8C%E6%95%B4%E7%B6%B2%E5%9F%9F%E5%90%8D%E7%A8%B1) = [host name](https://zh.wikipedia.org/zh-tw/%E4%B8%BB%E6%A9%9F%E5%90%8D%E7%A8%B1) + [domain name](https://zh.wikipedia.org/wiki/%E5%9F%9F%E5%90%8D) - domian name轉IP : 向 DNS 伺服器查詢 - `cat /etc/nsswitch.conf` - 可以知道這台電腦是怎麼一步一步去查的 - 預設查找順序 /etc/hosts -> mdns -> dns - ![](https://i.imgur.com/K1ESIIN.png) - host + 網址: 找尋紀錄 - `sudo vim /etc/hosts ` : 可以為domain、host name指定ip - EX: - 當加入 `1.2.3.4 google.com` 之後每次查詢 google.com 都會連到ip為1.2.3.4的電腦,連不上 https://google.com - DNS記錄 - A記錄 : Domain name指定到某IPv4 - AAAA記錄 : Domain name指定到某IPv6 - CNAME記錄 : 將某個Domain name映射到另一個Domain name上 - MX記錄 : 為Domain設定Mail Server位置 - SRV記錄 : 為某個特定服務指定到其他伺服器及port,權限高於其他記錄 - PTR 記錄 : ip 轉 domain name - `dig` + domain name - 出來是 A/AAAA 記錄 - ![](https://i.imgur.com/F8aMRhs.png) - `dig +trace`:把整個路徑都查出來 - `dig @8.8.8.8 +trace www.bluet.org` - 回傳不只一個路徑,挑一個連(用 DNS 分散流量) - `dig www.bluet.org AAAA` - `dig bluet.org ns`: 這個Domain的 name server 是哪一台 - `dig bluet.org mx`: 這個mail exchange - `host ocisly` : not found - 至 `cat /etc/nsswitch.conf` 的 `hosts` 中的 `myhostname` 查詢 - `#files` : 在 `etc /host` 改東西無效 - `cat /etc/resolv.conf` : - nameserver 127.0.0.53(會回傳127.x.x.x,只要是127開頭的都屬於自己的網域) - `route` : 查Routing table(會將 ip address 轉回 domain name) - `route -n`: 查 Routing table(不會將 ip address 轉回 domain name,比較清楚,因為通常不會知道 domain name 指的是誰) - `ifconfig` : 查網卡IP - ![](https://i.imgur.com/feWeBEu.png) - lo: flags底下 - `inet`: 必為127.0.0.1 - `netmask`: 必為255.0.0.0 - ![](https://i.imgur.com/kfOztrl.png) - `nslookup` : 查詢DNS記錄(查詢域名系統以獲得域名或IP地址映射或其他DNS記錄)。 - ~~`sudo vim /etc/nsswitch.conf`裡頭~~ - `sudo vim /etc/resolv.conf` 裡頭 - ![](https://i.imgur.com/p8mcPbq.png) - search xxx.xxx.xxx - 當你 host 不到位置時,它會自動幫你加上xxx.xxx.xxx - eg: host www - ![](https://i.imgur.com/CJiB7aj.png) - [arp](https://zh.wikipedia.org/wiki/%E5%9C%B0%E5%9D%80%E8%A7%A3%E6%9E%90%E5%8D%8F%E8%AE%AE) - `arp -an`: 目前電腦連線過的 ip 對上 MAC address - 只能用在區網(一般 router 不會幫你轉送) - [`arp spoofing`](https://zh.wikipedia.org/wiki/ARP%E6%AC%BA%E9%A8%99) >在學校不要亂用,計中很厲害抓的到。在外租屋就...[name=BlueT] - `arp -n`: 將主機名稱以 IP 的型態顯示 - [rarp](https://zh.wikipedia.org/wiki/%E9%80%86%E5%9C%B0%E5%9D%80%E8%A7%A3%E6%9E%90%E5%8D%8F%E8%AE%AE): 從 mac address 查 ip (與 arp 相反) - 如何知道 IP 是否在某個網段內? - 1. 看網卡 - 2. `route -n` : 查 router 表 - ![](https://i.imgur.com/xoZWWxh.png) - `Genmask: 0.0.0.0` 表示需要有 0 bit 符合 => 顧名思義就是任何 IP 都屬於這網段 (EX: <IP>/0 ) - 查表時如果發現IP非自己網域,就會將封包透過連接對外網域的 gateway 傳出去,而 gateway 在 router 表中的 destination 是 0.0.0.0,也就是所有IP皆會符合,所以其他的找不到才會去配對0.0.0.0的 gateway - 先從 destination 跟 genmask 檢查要送的封包會送去哪,再看 Use Iface 看要送出封包的網卡位置 - `Gateway:192.168.1.1` 代表封包要透過192.168.1.1 傳出去 - 在 IP(Network 層) 紀錄的是 google IP 再往下傳 Gate way 的 MAC address,非自己 IP 就轉送 ,Gateway 會再去查 route table,再看要送往哪裡 - 除非在內網不然都會經過Gate way傳送 - DNS 查看要經過IP->==UDP(**預設**)== - TCP([三向交握!](https://notfalse.net/7/three-way-handshake)+詢問+取得資料,總共5次封包傳送) - UDP(不需三向交握,總共2次封包傳送!對方僅依據 source IP 來判斷來源) - 相對不安全,但速度快 - 被利用作反射式DoS攻擊 : 向Server丟大量、但小的封包,偽造 source IP,Server會將反饋的資料全部丟到被僞造的source IP - ![](https://i.imgur.com/UgWLSxr.png) - > [LMGTFY](https://en.lmgtfy.app/#gsc.tab=0) 超棒的 [name=BlueT] - `telnet`: 以純文字連線 - `telnet google.com 80`: 經由 telnet 將 google.com 經由 80 port 以明文方式傳送 - 對方把網頁內容傳給我們 - `GET /HTTP/1.0`: 使用HTTP/1.0以GET的方式取得/預設內容 - Server 會回覆網頁狀況 EX: HTTP/1.0 200 OK - [HTTP return code](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) - `telnet ammon.bluet.org 80`:會回傳 OK (不一定,會有 400 bad request 等狀況,依據 GET 打的內容或網頁 server 狀況) - `GET / HTTP/1.0` - `Host: bluet.org` - [virtual host](https://zh.wikipedia.org/zh-tw/%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA) - 一台Server上,可以執行多個網站與服務 - 經由 client 端傳送不同的指令(Host:...)而導到不同的顯示內容 - 當 client 傳送的 host 內容, server 這沒有辦法提供,則直接回傳預設的 host - ![](https://i.imgur.com/vgGpDHG.png) > 西北多的[name=BlueT] ## 指令補充 - `ps`:觀察 process 的資訊、狀態、包含pid(只會顯示正在執行的 process) - 過濾自己要的東西出來 - 假設要過濾所有chro的字串輸出: `ps aux | grep chro` - `|`: pipe,將左邊指令的輸出傳到右邊指令的輸入 - `>`: 把後面檔案洗掉,把前面指令的標準輸出重新導向並寫入 - `2>`: 和上面一樣,但是把標準Error輸出重新導向並寫入 - `>>`: 和上面同理,但是不會洗掉檔案,而是把前面的標準輸出插入到後面檔案的最後面 - `grep`: 搜尋有沒有包含或符合某個字串 - `grep -i 1H`: - `-i`:**不分大小寫**的搜尋 ~~- 搜尋特定字母(不是ㄅ)~~ - `grep -irn us ./` - `-r`: 包含子目錄 - `-n`: 顯示行數 - `grep chro > lala`: 重導到lala中 - `>`: 將標準輸出 I/O 的內容,重新導向,把後面檔案的內容洗掉(在這裡目標檔案為 lala) - `grep -c` :計數(在資料裡有幾個搜尋字) - `wc`: 查詢有多少個字元、多少個單字 - ex: `wc lala` - `grep chro >> lala`: - `>>` : 把輸出接在後面 - `tail -n 10 lala`:印出檔案最後幾行(10行) - `ls &`: 把檔案丟背景執行 - `ls &&`:先執行完第一個指令再執行第二個指令 - `watch -n X ls` :每固定X秒數幫我執行ls幾次(X) - `kill PID` (process id) : 終止特定的process - `kill -9 PID`: 強制終止 - `awk` : LINUX 的文字處理工具 - `xargs`: 把輸出,串在後續輸入指令的後面,例如,刪除這個目錄下所有 html 檔:`ls | grep .html | xargs rm` # Linux 輸入輸出特性 - 標準表代碼: - `0`: 輸入 - `1`: 標準輸出 - `2`: 標準Error輸出 - 就是跑出error訊息 - 1、2都是預設直接顯示出來 - `2>&1`: 把這個放到指令最後就可以把標準Error輸出導到標準輸出 - eg.`ls /var/log/lala > lala 2>&1`: 把錯誤的訊息(2) merge 到正確的訊息(1) - eg.`ls /var/log/lala > lala 2>lala2` > ==很多小指令(就像積木一樣),只做一件簡單的事,可以串起來執行,靈活變化==[name=BlueT] > linux有甚麼做不到,除了殺人放火...ㄟ好像也可以[name=BlueT] > 媽的不管,我一定要 [name=BlueT] > 幹,對不起,我現在不太能思考 [name=BlueT] ## Q & A * 可以用 telnet 連到 https 的網站嗎? * 不行,因為沒有SSL加密,但是可以使用 `openssl s_client -connect <domain_name>`,連上 https 的 443 port