第 12 章 - Linux 作業系統 - 網路設定、軟體管理與基礎服務管理
上次更新日期 2020/05/29
網路設定是很有點麻煩的,不過,確實也需要網路設定妥當才好!另外,當你的網路不通時,可以自己找到解決方案,這才會是重點。 搞定了網路之後,再來就是處理軟體自動升級機制,以及一些服務的管理功能。當然,有可能的話,網路服務的處理, 讓你的 Linux 系統變成伺服器的角色概念,也是相當重要的!
學習目標
- 了解 Linux 網路卡代號查詢功能
- 學會使用 nmcli 設定/查詢網路參數
- 間單操作/查看 Linux 防火牆
- 了解如何安裝/啟動/開機啟動/防火牆/測試一個網路服務
12.1: Linux 網路設定
在學校與企業,網路參數的取得通常是手動設定或自動設定,底下先來複習一下上網需要的參數與取得的方式,然後就可以開始設定網路參數了。
- 上網需要的網路參數與網路參數的取得方法
先來總結一下第八章談到的網路基礎概念資料:
- IP 位址等級,預設分為三個等級,分別是:
- Class A: 第一組 IP 位址由 0~127,子網路遮罩為 255.0.0.0
- Class B: 第一組 IP 位址由 128~191,子網路遮罩為 255.255.0.0
- Class C: 第一組 IP 位址由 191~223,子網路遮罩為 255.255.255.0
- IP 的種類主要分為兩大類:
- public IP (公共 IP 或公開 IP 位址):該 IP 位址可以直接連上網際網路
- private IP (私有 IP 或保留 IP 位址):保留給企業內部使用,需要透過 IP 分享功能才能上網
- IPv4 的 private IP 網段:
- Class A: 10.0.0.0/8 (一組)
- Class B: 172.16.0.0/16 ~ 172.31.0.0/16 (16 組)
- Class C: 192.168.0.0/24 ~ 192.168.255.0/24 (256 組)
- 每一部主機內部都會具有的網路界面與該界面的預設 IP 與網域:
- 預設界面通常稱為 loopback,簡稱為 lo 界面;
- 該界面通常的 IP 位址與參數為: 127.0.0.1/8
- 在區域網路內與離開區域網路傳輸網路封包的狀態:
- 在區域網路 (LAN) 裡面,所有的連線系統可以透過廣播來傳遞封包
- 要離開區域網路,需要透過區域網路內的某部路由器 (gateway, router) 才能夠離開。
- 使用主機名稱上網才行,這需要 DNS 服務的協助,所以需要 DNS 伺服器的設定值!
- 一組可以上網的網路參數 (由 ISP 提供) ,基本上需要有:
- IP 位址與子網路遮罩: 例如 192.168.1.10/24,上面這組 IP 位址可以得到四個參數喔!分別是:
- IP Address: 192.168.1.10
- Netmask: 255.255.255.0
- Network IP: 192.168.1.0
- Broadcast IP: 192.168.1.255
- Gateway IP: 例如 192.168.1.254
- DNS IP: 例如 168.95.1.1
- IP 位址與子網路遮罩: 例如 192.168.1.10/24,上面這組 IP 位址可以得到四個參數喔!分別是:
- 至於上述 LAN 可以上網的網路參數取得的方式,主要則有:
- 自動取得:學名為 DHCP,設定常用 auto 處理
- 手動設定:管理員自己手動設定好上述的網路參數 (manual)
- 撥接取得
- 第四台纜線取得
CentOS 8 使用 Network Manager 這個服務來管理網路,同時提供一個名為 nmcli 的簡易指令,搭配 bash-completion 軟體,可以快速的使用 [tab] 按鍵配合,完成所有的任務。
- 觀察網路連線界面與網路卡
系統上的所有網路界面都可以透過 ifconfig 這個指令來觀察,不過這個指令在某些系統上並不一定會提供。 因此,近來我們建議使用 ip link show 這個指令來查閱!方法如下:
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group
link/ether 52:54:00:85:b1:54 brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT g
link/ether 52:54:00:b0:2f:5d brd ff:ff:ff:ff:ff:ff
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFA
link/ether 52:54:00:b0:2f:5d brd ff:ff:ff:ff:ff:ff
上述的 lo, ens3, virbr0, virbr0-nic 等等就是網路介面卡!系統實際上就是透過這些介面卡來連線到網路的。讀者應該要知道, 一張介面卡可以同時提供多個網路位址 (IP address),而利用這些介面卡來達成連線的方式就稱為網路連線代號。查詢網路連線代號的方式如下:
[root@localhost ~]# nmcli connection show
NAME UUID TYPE DEVICE
ens3 1eff13ae-e436-407c-bf67-ac0932bd1ed2 ethernet ens3
virbr0 efe9b94d-5d0c-4f93-b55c-4c4156c7aa9f bridge virbr0
讀者們應該要注意的是:
- NAME:即為網路連線代號,接下來我們要處理的任務均是針對此連線代號而來。
- UUID:Linux 的裝置識別碼,在系統當中幾乎是獨一無二的存在。
- TYPE:網路連線的類型,包括乙太網路、無線網路、橋接等等功能
- DEVICE:即是網路介面卡。
由於讀者們所操作的系統是本教材提供的複製品,對於您的環境來說,可能有些許的差異,因此,建議你應該要刪除 ens3 這個連線代號, 然後重建一次 ens3 比較妥當。刪除連線與建立連線的方式如下:
[root@localhost ~]# nmcli connection delete ens3 [root@localhost ~]# nmcli connection add con-name ens3 ifname ens3 type ethernet Connection 'ens3' (167e8cf0-05b5-4ea9-8685-7775441d5d04) successfully added. [root@localhost ~]# nmcli connection show NAME UUID TYPE DEVICE ens3 167e8cf0-05b5-4ea9-8685-7775441d5d04 ethernet ens3 virbr0 efe9b94d-5d0c-4f93-b55c-4c4156c7aa9f bridge virbr0
讀者會發現到 ens3 連線代號的 UUID 改變了,同時 DEVICE 會搭配到你的網路界面卡,此時系統就幫你建置好 ens3 這個連線代號。
目前大部分的系統在網路卡的命名上面已經不再使用過去的 eth0, eth1... 之類的命名方式,而是使用該介面卡的匯流排作為代號來命名。 因此,未來大家可能會常見到不同的名稱喔!
- con-name
- ifname
- type
- 觀察網路連線代號的詳細設定
詳細的網路連線代號內容的觀察,可以這樣做:
[root@localhost ~]# nmcli connection show 連線名稱(con-name) [root@localhost ~]# nmcli connection show ens3 connection.id: ens3 connection.uuid: 167e8cf0-05b5-4ea9-8685-7775441d5d04 connection.stable-id: -- connection.type: 802-3-ethernet connection.interface-name: ens3 connection.autoconnect: 是 ....... ipv4.method: auto ipv4.dns: -- ipv4.dns-search: -- ipv4.dns-options: -- ipv4.dns-priority: 0 ipv4.addresses: -- ipv4.gateway: -- ipv4.routes: -- ....... ipv6.method: auto ipv6.dns: -- ipv6.dns-search: -- ipv6.dns-options: -- ipv6.dns-priority: 0 ipv6.addresses: -- ipv6.gateway: -- ipv6.routes: -- ....... IP4.ADDRESS[1]: 172.16.5.237/16 IP4.GATEWAY: 172.16.200.254 IP4.ROUTE[1]: dst = 0.0.0.0/0, nh = 172.16.200.254, mt = 100 IP4.ROUTE[2]: dst = 172.16.0.0/16, nh = 0.0.0.0, mt = 100 IP4.DNS[1]: 172.16.200.254 IP4.DOMAIN[1]: gocloud.vm DHCP4.OPTION[1]: dhcp_lease_time = 259200 DHCP4.OPTION[2]: dhcp_rebinding_time = 226800 ....... IP6.ADDRESS[1]: fe80::d9bf:d115:c5dc:248f/64 IP6.GATEWAY: -- IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 100 IP6.ROUTE[2]: dst = ff00::/8, nh = ::, mt = 256, table=255
一般來說,輸出的資訊有小寫字元與大寫字元,小寫字元大多為『設定值』,大寫字元大多為『現在運作中的狀態資料』。 上表僅列出較為重要的資訊,包括有:
- connection.autoconnect [yes|no] :是否於開機時啟動這個連線,預設通常是 yes
- ipv4.method [auto|manual] :自動還是手動設定網路參數
- ipv4.dns [dns_server_ip] :填寫 DNS 伺服器的 IP 位址
- ipv4.addresses [IP/Netmask] :IP 與 netmask 的集合,中間用斜線 / 來隔開
- ipv4.gateway [gw_ip] : gateway 的 IP 位址!
至於大寫字元裡頭,比較常見的重要項目:
- IP4.ADDRESS[1]: 目前運作中的 IPv4 的 IP 位址參數
- IP4.GATEWAY: 目前運作中的 IPv4 的通訊閘
- IP4.DNS[1]: 目前運作中的 DNS 伺服器 IP 位址
- DHCP4.OPTION[XX]: 由 DHCP 伺服器所提供的相關參數
基本上,如果看到 DHCP4.OPTION 之類的字樣,代表這個網路連線代號主要是透過『自動取得 IP 』的方式來處理的。
- 自動取得 IP 參數的設定
所謂的自動取得 IP 參數,代表使用 DHCP 伺服器來管理網路參數的給予,因此讀者的環境中應該具有 IP 分享器或其他提供 DHCP 功能的設備。 由於所有的設定均來自於 DHCP 服務,因此讀者僅須提供 ipv4.method 為自動 (auto) 即可。
[root@localhost ~]# nmcli connection modify ens3 ipv4.method auto [root@localhost ~]# nmcli connection up ens3 連線已成功啟用(D-Bus 啟用路徑:/org/freedesktop/NetworkManager/ActiveConnection/5)
上表『 nmcli connection up ens3 』代表使用設定值來重新啟動這個網路連線代號之意。
- 手動設定 IP 參數
網路環境的設定主要由 ISP 來提供,假設你的系統所在的 ISP 告知你的網路設定如下:
- IP/Netmask: 172.16.150.NN/16
- Gateway: 172.16.200.254
- DNS: 172.16.200.254
上述 NN 為你的學號 (介於 1~254 之間的數值皆可),底下假設為 1 號時的情況, 讀者可以透過底下的方式來處理手動設定 IP 的方式:
[root@localhost ~]# nmcli connection modify ens3 \ > connection.autoconnect yes \ > ipv4.method manual \ > ipv4.addresses 172.16.150.1/16 \ > ipv4.gateway 172.16.200.254 \ > ipv4.dns 172.16.200.254 [root@localhost ~]# nmcli connection show ens3 ....... ipv4.method: manual ipv4.dns: 172.16.200.254 ipv4.dns-search: ipv4.addresses: 172.16.150.1/16 ipv4.gateway: 172.16.200.254 ....... [root@localhost ~]# nmcli connection up ens3
確認啟動網路之後,觀察一下最下方的大寫字樣的資料,是否正確顯示出跟你設定值相同的資訊?
[root@localhost ~]# nmcli connection show ens3
.......
IP4.ADDRESS[1]: 172.16.150.1/16
IP4.GATEWAY: 172.16.200.254
IP4.ROUTE[1]: dst = 172.16.0.0/16, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 172.16.200.254, mt = 100
IP4.DNS[1]: 172.16.200.254
.......
- 主機名稱設定
一般連線到 Internet 的伺服器應該都有一個主機名稱,主機名稱的觀察方式可以直接使用 hostname 來觀察, 如果是設定,則需要編寫 /etc/hostname 這個檔案。但如果手動編輯設定檔,通常都需要透過重新開機 (reboot) 來讓主機名稱生效。 為了解決這個 reboot 的問題, centos 提供了名為 hostnamectl 的指令來管理,假設主機名稱為 www.centos 時,可以這樣設定:
[root@localhost ~]# hostnamectl set-hostname www.centos [root@localhost ~]# hostnamectl Static hostname: www.centos Icon name: computer-vm Chassis: vm Machine ID: 502dbaaf2a074134909a59ef9ab651c1 Boot ID: b2952f724af0470cafc231c72afbcf9e Virtualization: kvm Operating System: CentOS Linux 8 (Core) CPE OS Name: cpe:/o:centos:centos:8 Kernel: Linux 4.18.0-147.el8.x86_64 Architecture: x86-64
這樣立刻設定好主機名稱,且可以不用重新開機。另外,如果你需要在自己的 Linux 系統上面『指定你同學的 IP 與他主機名稱的對應』時, 可以改 /etc/hosts 這個檔案喔!這個檔案的內容大致上是:
remote.station.ip servername servername2 servername3 ...
- 使用 vim 編輯 /etc/hosts 這個檔案,記得要使用 root 的身份來處理才行
- 設計底下的資料:
172.16.150.200 teacher 172.16.150.10 aa10
- 分別 ping teacher 與 ping aa10 ,看看有什麼結果?
因為網路可以有多個 IP 位址的設定,因此,如果你要將手動的設定改回原本的自動取得 IP 設定時,要記得將給予的資料取消才行。 取消的方法可以是給予空值 ('') 即可!
- 直接修改 ipv4.method 成為 auto 時,會出現問題!
[root@www ~]# nmcli connection modify ens3 ipv4.method auto [root@www ~]# nmcli connection show ens3 | grep ipv4 | head ipv4.method: auto ipv4.dns: 172.16.200.254 ipv4.dns-search: -- ipv4.dns-options: -- ipv4.dns-priority: 0 ipv4.addresses: 172.16.150.200/16 ipv4.gateway: 172.16.200.254 ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec)
你可以發現,剛剛的手動設定資料還存在!這將導致系統會同時存在兩個以上的 IP,造成困擾。 - 設定 ipv4.method 為 auto 之後,將其他改過得參數改回空值:
[root@www ~]# nmcli connection modify ens3 ipv4.method auto \ > ipv4.addresses '' ipv4.gateway '' ipv4.dns '' [root@www ~]# nmcli connection show ens3 | grep ipv4 | head ipv4.method: auto ipv4.dns: -- ipv4.dns-search: -- ipv4.dns-options: -- ipv4.dns-priority: 0 ipv4.addresses: -- ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec)
- 開始讓系統 IP 生效
[root@www ~]# nmcli connection up ens3
- 綜合練習
底下這組設定值將會使用到期末喔!所以,設定請非常注意喔!
- 請依據底下提供的資料來設定好你的網路參數 (應該依據您的教師提供的資料為主):
- IP/netmask: 172.16.160.XX/16 (XX 為你的學號尾數,以全班不重複為主)
- gateway: 172.16.200.254
- DNS: 120.114.100.1 與 168.95.1.1 (此為中華電信慣用的 DNS 伺服器,因此你的環境中須有 Internet)
- Hostname: stationXX.centos (XX為你的學號尾數)
- 依據底下的對應,設計好你的 /etc/hosts 內容
- 讓 172.16.160.200 的主機名稱為 teacher
- 讓 172.16.160.1~172.16.160.100 對應到 station1.centos ~ station100.centos
- 處理 IP 位址參數的行為:
[root@www ~]# nmcli connection modify ens3 ipv4.method manual \ > ipv4.addresses 172.16.160.200/16 ipv4.gateway 172.16.200.254 \ > ipv4.dns 120.114.100.1,168.95.1.1 [root@www ~]# nmcli connection up ens3 [root@www ~]# hostnamectl set-hostname station200.centos [root@www ~]# hostnamectl
- 開始處理主機名稱與 IP 的對應
[root@www ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.160.200 teacher 172.16.160.1 station1.centos station1 172.16.160.2 station2.centos station2 172.16.160.3 station3.centos station3 172.16.160.4 station4.centos station4 172.16.160.5 station5.centos station5 172.16.160.6 station6.centos station6 .....
- 網路問題檢測
想一想,如果你需要連線到 youtube 去,卻無法連線,你需要怎麼查詢你的系統資訊呢? 基本上的想法是這樣的:
- 檢查自己的網路參數是否正確?是否如同 ISP 給我們的情況?
- 檢查自己到 gateway 之間的連線是否正常?若不正常,很可能是:
- 是不是 gateway 有問題? (忘記開、停電、故障了?)
- 是不是網路線沒有接好?(看網路接孔的燈是否有亮)
- 檢查連線到 168.95.1.1 之間的 ping 是否正常?若不正常,需要查詢 gateway 的設定是否正確?
- 使用 dig youtube.com 看看能不能有回應?若沒有回應,看看 DNS 是否設定有問題? 或許需要換一台 DNS 系統測試看看。
上述的流程如果都沒問題,還是無法連上 youtube 時,可能就是本機軟體的問題,或者是 youtube 真的暫時無法連線成功, 可能需要到社群網路詢問一下大家的狀態了 (曾經發生過 facebook 斷線、google 也曾斷線過!)
- 檢查自己的網路參數是否正確:
使用『 nmcli connection show 』查詢 (1)設定與 (2)目前運作中的網路參數,看看是否正確? 若正確則繼續後續檢查,若不正確,請再以『 nmcli connection modify ens3 ... 』的方式修改完畢,再以『 nmcli connection up ens3 』 重啟網路設定即可。 - 檢查本機到路由器 (gateway) 之間的連線是否正確:
你的機器到路由器之間很容易出問題,這可能由於你的機器經常搬來搬去,或者是由於網路線有問題等等,另外,路由器也可能出問題。 所以,透過『 ping gateway_IP 』的方式來檢查兩者之間的回應是否正常?包括 time 回應是否正常?是否有正確回應封包等。 你也可以檢查交換器或路由器本身的燈號,看看是否有跟你的 ping 回應封包的出現訊息相同。若相同則繼續後續檢查,若不同, 你應該要檢查數據機是否有開機、網路線是否有鬆脫、網路接頭是否正常(或許可能需要使用測線器測量)等等。 - 檢查本機封包連線到 internet 是否正常:
中華電信的 168.95.1.1 似乎沒有抵擋任何人的 ping 要求,我們可以透過『 ping 168.95.1.1 』看看我們的系統能不能連上 Internet, 若可以有 time 的回應,一般代表連線沒問題,如果沒有回應,很有可能是 (1)你所在的環境具有防火牆管制,所以連不上 168.95.1.1 為正常。 (2)你所在環境為家裡時,很可能就代表你的數據機或者是電信公司機房有點狀況了,要注意,可能需要回報 ISP。 - 檢查 DNS 設定是否正常:
透過『 dig www.google.com 』或『 dig www.facebook.com 』看看有沒有任何回應,注意,要仔細看『 Question, Answer, Server 』等階段的訊息, 確認這些階段沒有問題,而且有正確的接收到 IP 資訊,這才能夠順利上網。
12.2: Linux 軟體管理
你為什麼需要啟動防火牆?為什麼需要安裝防毒軟體?為什麼需要關閉不需要的服務?為什麼某些針對本機才放行的服務可以直接放行不用理他? 因為這都涉及到網路連線的功能所致。舉例來說,你的 windows 主機預設有針對內網放行網路磁碟機 (網路芳鄰) 的功能,這個預設是對內部區網放行喔! 那如果你不小心有啟用網路磁碟機,然後你的區網內的電腦有人不小心中了病毒或木馬,那麼你的系統預設就可能被攻擊! 而攻擊會不會生效?這就不一定了!
- 網際網路上受主動攻擊的情況
一般來說,如果你的主機取得的是 public IP 的話,那麼等於是你的主機就是直接連網的,因此,你的主機就是直接暴露在 Internet 上面的意思。 任何人,只要知道你主機的 IP,他是可以嘗試主動的跟你發起連線的。除非你的上層 gateway 有加一些額外的保護 (例如在學校單位的計算機中心), 否則對方就是可以直接跟你的主機連線。這種方式也是比較適合架設網站的情況。
不過,也因為是直接連上 Internet 這個沒有王法的地方,所以任何在 Internet 上面的攻擊,都可能會嘗試到你的系統上! 所以,如果你沒有任何防護,那麼當你主機上面的軟體或者是系統有漏洞時,就可能會被攻擊而遺失資料或系統損毀,或變成殭屍電腦而被操控。 但注意,是『當你的主機有漏洞』的情況下才會發生!如果沒有漏洞,基本上,你的系統只會頻繁的收到攻擊碼,而不會有太嚴重的問題發生。
也因為直接暴露在 Internet 上面很容易直接遭受到攻擊,所以筆者的工作用主機或辦公室內主機,就很不喜歡直接使用 public IP, 而是喜歡將工作機放置於 IP 分享器後面,透過 IP 分享器連網。這有個好處,就是我只需要一個 public IP 即可,其他的設備可以躲在 IP 分享器後面, 包括網路印表機、notebook、手機等設備,都是透過 IP 分享器後端的 private IP 連網。因為是共用 IP 分享器的連網功能,因此 Internet 看到的我的連線, 其實是 IP 分享器,所以外界若嘗試要攻擊我的 IP,其實不是攻擊我的工作機,而是我的 IP 分享器。這種行為讓我的工作機有稍微好一點點的保護。
- 區域網路內受主動攻擊的情況
底下是將工作機放置於 IP 分享器後端的簡單示意圖,在 IP share 後面 (右邊) 的所有設備透過 hub/switch 連接,再透過 IP share 發派的 private IP 後, 以 IP share 作為 gateway 上網。如此一來,你的所有設備都在同一個區網內,因此很容易溝通與設定,另外,也因為是 private IP, 所以基本上就有一些些保護的功能在。
理論上,在區網內的主機是不會被 Internet 主動攻擊到的!這是因為別人根本不知道你的 IP 是什麼!即使知道那也是知道 public IP,就是 IP share 那一台, 根本就攻擊不到你啊!但是,為什麼你還是可能會被打擊到呢?其實,大多數是由於內部網路先有人不小心中毒或中木馬的緣故! 區網內中毒的電腦會透過宿主機器的網路去搜尋區網內或外網的其他主機,然後主動的發起攻擊!此時,區網內的主機還是會被主動攻擊! 而主動攻擊的兇手,其實是你的室友或同事...並不是直接來自於 Internet 喔!
- 連線行為的問題
那麼為什麼有的人就是會『不小心』呢?這是因為網路是『雙向』的!當你去瀏覽別人的網站時,或前去抓取別人的資料時,那是你主動發起連線去連接別人的伺服器電腦, 然後別人的伺服器電腦將資料傳輸到你本機的連線軟體。以網頁來說,是你用瀏覽器去要求網站給你資料,而給你的資料你可接受也可不接受, 不過,通常瀏覽器預設都是接受的!因此,當你連線到有問題的網站時,那表示是你要求別人將有問題的資料直接傳輸給你的瀏覽器的意思! 此時就很可能會受到攻擊!這也是為啥大家都說,要保持良好的網路使用行為!不要亂點不知名的連結!
如果你安裝某些莫名其妙的軟體,這些軟體也很可能將你的資訊暴露到 Internet 上!例如好久以前有個 foxy 的軟體, 他很容易將你的資料上傳/下載到本地端電腦,然後...當然很可能將你的資訊或者是別人放在 foxy 平台上面的有問題的檔案傳輸到你的電腦上, 如果你還不小心的點開這些檔案,那就嘿嘿嘿嘿~
也就是說,其實以工作機的角度來看,大部分的中毒、中木馬、被攻擊、被安裝側錄軟體、被取得系統管理員操作權限,大部分的問題, 都在於使用者的網路連線行為不佳所致。如果不點擊莫名其妙的連結,不下載莫名奇妙的軟體,不因好奇而點擊或安裝某些怪異的檔案, 基本上,你的系統是不容易出問題的!
- 網路封包進入你系統的流程
雖然如此,但前面談到,即使在區網內,你是有可能被區網內的其他同事攻擊的!那...你明明沒有連線,為啥會被攻擊呢?來來來,瞧一瞧底下的圖示:
無論是伺服器還是工作機,你都要先有 IP 位址才行!然後,當有封包連線來的時候,(1)他得要先經過你本機的防火牆, (2)然後跟你的某個服務做連動~之後(3)透過你的服務來取得所需要的資源。當你的防火牆有放行對方的連線,加上你的某個軟體本身就有問題, 此時當然就會被攻擊成功!所以說:
- 關閉沒有用到的網路服關閉
- 讓你操作的軟體隨時保持在最新的狀況下
只要符合上述兩點,那就具有最基礎的保護!
- 使用 netstat -tulnp 找出目前系統中正在監聽的服務
- 為何有些服務有 LISTEN 有些沒有呢?他與 TCP/UDP 有何關係?
- 如果只找 TCP 的服務,無論是否有監聽,可以用『 netstat -antp 』來查閱
- netstat -tulnp (仔細看最前面的 tcp 與 udp 是否搭配 LISTEN 的關鍵字?)
- TCP 因為需要 Server/Client 溝通,所以才需要 LISTEN。UDP 是射後不理
- netstat -antp
- systemd 軟體管理
一般來說,服務的啟動有兩個階段,一個是『開機的時候設定要不要啟動這個服務』, 以及『現在要不要啟動這個服務』兩個階段。 這兩個階段都可以使用 systemctl 指令來管理。systemctl 的基本語法為:
[root@localhost ~]# systemctl [command] [unit]
上表所謂的 command 主要有:
- start :立刻啟動後面接的 unit
- stop :立刻關閉後面接的 unit
- restart :立刻關閉後啟動後面接的 unit,亦即執行 stop 再 start 的意思
- reload :不關閉後面接的 unit 的情況下,重新載入設定檔,讓設定生效
- enable :設定下次開機時,後面接的 unit 會被啟動
- disable :設定下次開機時,後面接的 unit 不會被啟動
- status :目前後面接的這個 unit 的狀態,會列出有沒有正在執行、開機預設執行否、登錄等資訊等!
- netstat 是否有找到名為 cups 以及 avahi 這兩個關鍵字的執行檔
- 直接輸入 systemctl 之後,按下 /cups 是否可以找到相關的服務?
- 使用 systemctl 觀察 cups 這個玩意兒的相關資料
- 立刻關閉 cups.* 的所有相關服務資訊
- 取消 cups.* 的開機啟動功能
- 透過相同的辦法處理其他任務。除了某些 port 53 無法關閉之外,最終應該剩下 port 22, 111, 53 而已。 port 53 我們會在下個章節關閉他。
將不必要的網路服務關閉之後,再來則要讓自己系統的軟體比較沒有漏洞。CentOS 具有線上升級機制, 使用的方法稱為 YUM 或 DNF,目前兩者都能支援。在這裡我們主要介紹 yum 這個指令。
- 查詢功能:yum [list|info|search|provides|whatprovides|history] 參數
如果想要查詢利用 yum 來查詢原版 distribution 所提供的軟體,或已知某軟體的名稱,想知道該軟體的功能,直接使用 yum 搭配參數即可。 例如要找出原版的 raid 作為關鍵字的軟體名稱時:
[root@localhost ~]# yum search raid [root@station200 ~]# yum search raid CentOS-8 - AppStream 5.4 MB/s | 7.0 MB 00:01 <==進行清單下載動作 CentOS-8 - Base 2.3 MB/s | 2.2 MB 00:00 CentOS-8 - Extras 6.7 kB/s | 5.9 kB 00:00 ============================== Name & Summary 符合: raid ============================== libblockdev-mdraid.x86_64 : The MD RAID plugin for the libblockdev library libblockdev-mdraid.i686 : The MD RAID plugin for the libblockdev library libblockdev-mdraid.x86_64 : The MD RAID plugin for the libblockdev library libstoragemgmt-megaraid-plugin.noarch : Files for LSI MegaRAID support for : libstoragemgmt ================================= Summary 符合: raid ================================== iprutils.x86_64 : Utilities for the IBM Power Linux RAID adapters iprutils.x86_64 : Utilities for the IBM Power Linux RAID adapters mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays) mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays)
yum 進行軟體安裝與升級的動作相當簡單,透過下載伺服器的清單列表後,與本機的 rpm 資料庫比對,若發現伺服器存在但本機不存在者, 則可以進行安裝,若發現伺服器的軟體版本較新而本機軟體較舊,則可以進行升級。另外,yum 也會自動透過速度比對,找到最近的官網映射站來進行網路下載的任務。 如果想要了解上述 mdadm 這個軟體的說明,可以這樣處理:
[root@localhost ~]# yum info mdadm
Name : mdadm
Version : 4.1
發行版 : 9.el8
Architecture : x86_64
Size : 1.2 M
來源 : mdadm-4.1-9.el8.src.rpm
Repository : @System
來源軟體庫 : anaconda
Summary : The mdadm program controls Linux md devices (software RAID arrays)
URL : http://www.kernel.org/pub/linux/utils/raid/mdadm/
授權 : GPLv2+
Description : The mdadm program is used to create, manage, and monitor Linux MD
: (software RAID) devices. As such, it provides similar functionality to
: the raidtools package. However, mdadm is a single program, and it can
: perform almost all functions without a configuration file, though a
: configuration file can be used to help with some common tasks.
其實就是 rpm -qi mdadm 的內容展現!而如果想要知道伺服器上面的所有軟體列表清單,則可以使用『 yum list 』來查閱! 這與 rpm -qa 有點類似,只是 rpm -qa 僅列出本機上面的軟體,而 yum list 可以列出伺服器上面的所有軟體名稱!
至於,如果想要知道某個檔案是由那一個軟體所提供的?可以這樣追蹤:
[root@localhost ~]# yum provides "*/passwd" bash-completion-1:2.7-5.el8.noarch : Programmable completion for Bash 軟體庫 :@System 符合來源: 檔案名稱:/usr/share/bash-completion/completions/passwd ......
- 系統目前有沒有名為 virsh 的指令?
- 透過 yum 追查一下該指令來自於那一個軟體所提供?
- 找出 libvirtd 這個指令的完整檔名
- 用 yum 追查該檔案所屬的軟體名稱。
- 用 yum 查詢上述軟體的功能為何?
- type virsh # 若出現檔名,代表有,若沒有出現資訊,代表沒有
- yum whatprovides "檔名"
- type libvirtd
- yum whatprovides "檔名"
- yum info "軟體名"
- 安裝/升級功能:yum [install|update] 軟體
安裝與升級直接字面上的處理為 install/update 即可!
- 基本的安裝任務
- 安裝一下剛剛 virsh 這個指令所屬的軟體
- 查詢一下是否有 pam-devel 這個軟體?若有,請安裝這個軟體。
- 基本的升級任務
- 先使用 yum check-update 嘗試分析目前伺服器上有比本機 Linux 還要新的軟體群
- 隨意選擇一個軟體 (例如 sudo) 來進行單一軟體的升級
- 進行一次全系統升級
- 基本的移除任務
- 將剛剛安裝的 pam-devel 移除掉 (請自行 man yum 找出移除的選項)
- 基本的安裝任務
- yum install "軟體名稱"
- yum search pam-devel; yum install pam-devel
- 查詢一下是否有 pam-devel 這個軟體?若有,請安裝這個軟體。
- 基本的升級任務
- yum check-update
- yum update sudo
- yum update
- 基本的移除任務
- yum remove pam-devel
- 升級過後需要重新開機嘛?
所謂的『軟體升級』其實很簡單!官網會將有問題的程式碼修改成沒問題,之後重新編譯成為可執行檔,然後包裝成為安裝軟體包,讓使用者下載安裝。 然後,所謂的『安裝』其實只是將舊的檔案刪除,然後放上新的檔案,通常檔名是不變得。由於檔案不能在開啟的時候刪除或覆蓋, 因此通常安裝/升級過程中,軟體都會主動告知某個程式或檔案正在運作,你得先關閉後才能處理。
Linux 跟 Windows 比較不一樣,你可以直接升級軟體檔案,但是該檔案可能正在執行中~不過,現在的 linux 也變得聰明了!在你安裝完畢後, 這些軟體通常會自動的關閉後重新啟動。因此,軟體就會在最新的狀態,此時你是不需要重新開機的!
但是等等,核心可以關閉再開嘛?呵呵!當然不行!因為核心關閉代表關機了啊!所以,如果有升級過核心 (kernel) 就得要重新 reboot 才行。 另外,還記得四個同心圓嘛?如果許多的應用程式有呼叫到同一個函式庫,而函式庫有升級過,此時,你可以將呼叫這個函式庫的所有軟體通通 restart 即可! 不過,通常我們不會知道哪些軟體有呼叫呢!因此,最簡單的方式,也是 reboot 刷新一次。
- 通常哪些軟體更新後,最好重新開機讓系統刷新一次比較好?
- 如何查詢核心所在目錄?
- 如何知道目前的核心版本?
- 四個同心圓當中,當 (1)核心層級或 (2)系統呼叫層級的軟體升級後,最好重新開機較佳。
- ll /lib/modules
- uname -r
12.3: Linux 單機防火牆
先恢復一下印象,要注意網路是雙向的,雖然有防火牆,不過,通常『自己發出的連線,回覆的連線會主動的放行』,什麼意思? 我們連線到 google 去查資料,google 會將查詢的結果送回來!這條送回來的連線封包,就會讓防火牆自動的收下來 (因為 ACK 的關係), 所以,回覆的連線我們的防火牆根本不會擋!因此:『防火牆對於操作系統習慣不良者來說,一點屁用也沒有』, 不要幻想防火牆可以幫你擋住壞人了!
既然防火牆擋不住我們主動發出的連線,那麼人家主動攻擊我們的,我們就能隔絕吧?沒錯啊!理論上是的。不過,這種防火牆機制還是有點問題的! 針對伺服器的角度來說,基本上你會知道用戶端主動連線到伺服器時,封包是如何進入伺服器內取得資料的?
- 先要通過 TCP/IP 的相關規範才能夠連線到本機的網路門口
- 要先通過防火牆的規則管制,才可以進入到本機使用本機的服務
- 能否取得服務與這個服務是否啟用與相關設定有關 (發生問題可以查登錄檔)
- 能否實際存取資料,首先要看有沒有啟動 SELinux 這個細部權限設定項目?
- 全部都放行後,最後能不能存取資料,還是跟資料檔案的權限 (rwx) 有關!
看起來沒有問題啊!那防火牆真的有用嘛?其實是這樣的:
- 防火牆是沒屁用的,對正常提供的服務來說:
從前一個項目的圖示來看,如果你是 WWW 伺服器,那一定就是要放行 port 80,因此,若 port 80 出問題, 那你的防火牆當然一點用處也沒有。 - 防火牆是很有用的,對需要保護的服務來說:
如果你的服務中,例如 ssh 的服務,僅放行給部份的來源 IP 位址,則此時防火牆保護危險的服務,就很有用處了! - 軟體更新是一定要的,對連上 Internet 的伺服器來說:
一般來說,軟體如果沒有問題,或沒有加入新功能,是不會隨意升級的。因此,如果官網有公告最新的軟體升級資訊, 當然最好就是一定要升級到最新!至少能夠預防一大堆可能的系統漏洞 - 軟體更新是非必要的,對提供給內部特定用途的軟體來說:
崑山資傳系主要透過自建的 DRBL 搭配 Clonezilla 以及 partclone 再加上 PHP 的功能來進行電腦教室的佈建。 過去曾經因為 clonezilla 不同版本所支援的參數不同,導致 PHP 程式無法順利呼叫 clonezilla 的困擾。鳥哥自己的 cluster 跑模式用 Linux Server, 也因為內部的環境已經建置妥當,而且該系統基本上是不連網的,所以,此時你的系統應該『不要隨便升級』! 或者是說:『不要隨便升級特定的內部服務軟體』! - 權限設定的理解是基礎中的基礎:
如果你的網路服務僅提供讀取的功能,那麼即使你的檔案權限放行 777 可能都還不會出事。但是如果你的這個服務設定錯誤呢? 如果你的這個服務因為漏洞所以被攻破呢?那麼你的檔案如果是 777 ,很好!那就是完全的被拿走了...
若要作為伺服器,那麼 Linux 的防火牆管理就顯的重要了。CentOS 提供一個名為 firewalld 的防火牆服務, 這個防火牆主要透過 firewall-cmd 指令管理,而防火牆的執行分為兩種方式:
- 目前進行中 (acitve) 的環境
- 永久記錄 (permanent) 的設定資料
此外,為了方便管理,防火牆將許多不同的應用定義了多種的領域 (zone),不過,在這裡我們只需要知道公開的領域 (public) 即可。
[root@localhost ~]# firewall-cmd --get-default-zone public [root@localhost ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens3 sources: services: cockpit dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
上面表格顯示預設的防火牆使用 public 這個領域的規則設定,而 public 領域內的資料中,主要應用了:
- 『interfaces: ens3』:主要管理的界面為 ens3 這個介面卡
- 『services: cockpit dhcpv6-client ssh』可以通過防火牆進出系統的服務有 cockpit, dhcp 用戶端以及 ssh 這兩個服務
- 『masquerade: no』沒有啟動 IP 偽裝功能
未來如果讀者的伺服器要加上 httpd 這個 WWW 網頁伺服器服務的話,就以如下的方式來加入:
[root@localhost ~]# firewall-cmd --add-service=http success [root@localhost ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens3 sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
但是上述指令僅能在這次開機階段執行,重新開機後,或者是重新載入 firewalld 之後,這條規則就被註銷了。因此, 確認規則是正常的之後,應該使用如下的方式增加到設定檔當中才對:
[root@localhost ~]# firewall-cmd --add-service=http --permanent success [root@localhost ~]# firewall-cmd --list-all --permanent
請自行確認輸出的結果含有 http 才行。
- 我們的 Linux 預計要做成 http, https, ssh, ftp 這三個服務的伺服器 (service)
- 有非正規的埠口 TPC port 5511 需要放行,又該如何處理?
- 關於正常服務:
- firewall-cmd --permanent --list-services
- firewall-cmd --permanent --remove-service=?? (重複多次,將不要的服務移除)
- firewall-cmd --permanent --add-service=?? (重複多次,將需要的服務載入)
- systemctl restart firewalld
- firewall-cmd --list-all (要仔細觀察)
- 關於非正規埠口
- firewall-cmd --help | less (/port 查詢)
- firewall-cmd --permanent --add-port=???
- systemctl restart firewalld
- firewall-cmd --list-ports (要仔細觀察)
- 查詢自己管理的設備的 port
某些設備我們並沒有辦法登入 (沒有登入管理權限),但是我們又想要知道該設備到底有開啟哪些埠口在監聽? 這個時候可以使用 nmap 這個軟體提供的功能來掃描即可。另外, nmap 也能用來處理區域網路內,到底哪幾部電腦有開機喔! 相當好用。
# yum install nmap # 安裝軟體 # nmap localhost # 掃描某個系統的 tcp 埠口 # nmap -sTU localhost # 掃描某個系統的 tcp 與 udp 埠口 # nmap -sP 172.16.160.0/24 # 用類似 ping 的方法,掃描整個區域網路
這個軟體算是駭客軟體,你用『 nmap in the movie 』為關鍵字去 google 查詢圖片,就會有一堆電影的截圖秀給妳看。 所以,這個軟體算是比較不能亂用的軟體喔!你可以拿它來敲擊攻擊自己的系統,不能拿它來敲擊攻擊別人的系統! 否則容易吃上官司。
12.4: 基礎服務管理
我們之前使用 netstat -tulnp 時,還有一些 port 無法關閉,實在傷腦筋。該埠口其實是透過 libvirtd 所啟動的! 而會啟動的原因,主要是由於虛擬機器的執行所致。因此,要關閉這些埠口,就比較麻煩些。
- 關閉本機的虛擬機器服務與虛擬機器網路
虛擬機器的網路其實可以透過 virsh net-list 去觀察,查到之後再以 virsh net-destroy 及 virsh net-undefine 去取消定義, 這樣,這個網路就不會啟用,你的網路界面與監聽埠口,就可以正常了!
- 使用 virsh net-list 找出目前的虛擬網路連線名稱
- 使用 ip link show 顯示目前的網路卡名稱
- 使用 virsh net-destroy 刪除該連線名稱
- 使用 virsh net-undefine 取消該連線名稱的紀錄
- 重新查看本機啟動的埠口以及網路界面。
- virsh net-list
- ip link show
- virsh net-destroy "連線名稱
- virsh net-undefine "連線名稱
- netstat -tlunp ; ip link show (你會發現許多東西就不見了!)
由於該項目是由 libvirtd 所啟動的,所以,我們將他關閉吧!
- 先查詢 libvirtd 目前的狀態
- 立刻關閉 libvirtd
- 註銷 libvirtd 下次開機啟動的功能
- 查詢 libvirtd 目前的狀態
- systemctl status libvirtd
- systemctl stop libvirtd
- systemctl disable libvirtd
- systemctl status libvirtd
- 網路服務的建置
架設 Linux 很多人的目的都是需要使用到網路伺服器的!那如何處理呢?其實我們在第六章已經稍微提過,網站的建置就是:
- 安裝
- 啟動
- 開機啟動
- 防火牆
- 測試與上傳資料
這樣就搞定!唯一需要注意的就是安裝什麼軟體而已。我們先來了解一下很重要的 ssh 伺服器!
- ssh 連線伺服器
先來觀察一下 sshd 這個服務是否存在!
- 記得身份必須要是 root 才可以!
- 先以『 systemctl status sshd 』查看是否啟動了 sshd 這個服務!
- 使用『 netstat -tlunp 』查看一下 sshd 的埠口是幾號呢?
- 使用『 firewall-cmd --list-all 』看看這個服務有沒有放行。
- 使用『 ifconfig 』看看網路是否正確,以及取得自己的 IP 位址。
若你的 sshd 有啟動,然後防火牆也放行了 ssh 的連線,那麼現在我們可以請用戶端來嘗試使用這個服務了! 使用服務的手段為透過底下的語法來進行連線:
[student@localhost ~]$ ssh 對方用戶@對方IP位址 [student@localhost ~]$ ssh student@172.16.160.24
在出現的畫面中,如果是第一次登入對對方的主機,那就可以使用 yes 來回覆驗證指紋,然後輸入遠端主機帳號的密碼, 就可以登入人家的系統了!此時你按下 w ,就會看到對方與你的資訊,然後在你自己的系統上面使用底下的指令來查詢連線狀態:
[student@localhost ~]$ netstat -antp
如果你覺得對方登入你的系統很討厭時,透過 root 的權限,使用『 kill -9 PID 』就可以將對方踢掉了!
- 除了自己登入對方的系統之外,也請對方登入你的系統一下。
- 使用 netstat -antp 查詢一下自己與他人所使用的網路,並判斷對方的連線應該是哪一條?
- 找到對方的 PID 之後,輸入『 kill -9 PIDnumber 』,並查看對方是否被你踢出去了。
- https 網頁伺服器
現在網路世界大概都要求你要使用 https 來連線的,那麼你的 Linux 如何支援呢?很簡單,只要安裝 mod_ssl 即可! 之後重新啟動 httpd 就能夠支援 https 了!
- 先安裝好 httpd, mod_ssl 等軟體
- 重新啟動 httpd,同時確認有 enable 的狀態,下次開機才會自動啟動
- 確認埠口有啟動 port 80 及 port 443 (什麼指令呢?)
- 確認防火牆有啟動 http 及 https (什麼指令呢?)
- 使用瀏覽器,輸入 https://your.IP 來嘗試連線!
透過上述的連線功能,就能夠知道你的 Linux 能不能啟動 https 的伺服器支援了。接下來,如果要支援 PHP 的網頁程式語言呢?
- 支援 PHP 網頁程式語言
你得要安裝 php 這個軟體,由於 php 是 Apache 裡面的一個模組,因此,安裝完畢也是需要重新啟動 httpd 的!
- 安裝 php 軟體之後,重新啟動 httpd 服務
- 前往 /var/www/html 首頁目錄後,建立名為 phptest.php 的檔案,內容大致如下:
[root@localhost ~]# cd /var/www/html [root@localhost html]# vim phptest.php <?php phpinfo(); ?>
- 使用 http://your.ip/phptet.php 來呼叫這個檔案的執行,若成功看到許多資料,那就表示你的網頁伺服器成功支援 PHP 了!
下個學期我們會透過連線到 FTP 來使用系上提供的網頁伺服器,主要的特色也就是透過上述的功能來建置的!
12.5: 課後練習
作業上傳時的注意事項:
- 伺服器的詳細資料,以及相關傳輸軟體設定,請參考第一章的 1.5 節的內容。
- 可以使用 MS office 的 word 或者是 libreoffice 的 writer 等軟體來撰寫你的作業,作業檔名可以使用 .doc, .docx 或者是 .odt 或者是 pdf 等格式,均可接受。
- 若作業中有圖檔,請將圖檔降低水平解析度到 800 像素以下再貼到文章中,檔案容量以不超過 2Mbytes 為限。
- 檔名請設定為: os_4XXXCYYY_unit12.doc (4XXXCYYY 是你的學號,請填正確,有分大小寫,請確認)
- 請上傳到你家目錄底下的 os 目錄中 (若不存在,請自行建立該目錄)
開始本章節題目:
因為亂改系統會導致下次上課變得怪怪的!所以,請使用另一顆硬碟 (自我回家練習那一顆) 進行底下的作業實做,不要使用上課用的這顆硬碟喔!
- 簡答題:
- 寫下私有 IP 在 Class A, Class B, Class C 的區段各為何?
- 內部迴圈測試網路的 (1)網路界面名稱與 (2)IP/Netmask 各是什麼?
- 要離開區域網路前往網際網路,需要那一個伺服器的服務?
- 要由主機名稱轉譯成為 IP,需要那一個伺服器的服務?
- 為什麼你的主機放在 IP 分享器後面,會比直接使用 public IP 連網來的好?
- 為什麼你放在 IP 分享器後端的 windows 工作機,還是可能會被攻擊或者是植入木馬?
- 處理網路連線:
- 假設你的網路卡界面名稱為 ens3,所以會有一個相同的網路連線界面,請將這個連線名稱刪除後重建,避免使用到舊的設定。
- 依據底下的說明,建立你的網路參數:
- 網路位址: 172.16.33.XXX (XXX為你的學號尾數)
- 子網路遮罩: 255.255.0.0
- 通訊閘: 172.16.200.254
- DNS: 120.114.100.1, 8.8.8.8
- 你主機名稱: siteXXX.dic.ksu
- 建立底下的主機名稱與 IP 對應:
- 172.16.200.254 gwserver
- 172.16.33.1 site1.dic.ksu site1
- 172.16.33.2 site2.dic.ksu site2
- ....
- 172.16.33.100 site100.dic.ksu site100
- 處理完畢之後,請輸入底下的指令,拍照後回傳:『ip addr show ens3 | grep 'inet '; echo; route -n | grep '^0.0.0.0'; echo ; grep nameserver /etc/resolv.conf; echo; hostname;echo; tail -n 5 /etc/hosts 』
- 防火牆與軟體更新:
- 將你的沒有在使用中的網路服務關閉,預設未來只會有 port 111, 22, 80, 443 等埠口,其他埠口暫時都不會啟動 (80 與 443 要稍後才會啟動)。 完成處理後,請輸入『 netstat -tlunp 』拍照後回傳
- 請更新你的 Linux 系統,更新完畢務必重新開機。然後輸入『 uname -r; ll /lib/modules/ 』將結果拍照上傳。
- 將 http, https, ftp, ssh, port 5353 (tcp) 加入防火牆列表中,然後輸入『 systemctl restart firewalld ; firewall-cmd --list-all 』 並將結果拍照上傳
- 建立網路服務:
- 讓你的 Linux 成為 http 及 https 的伺服器 (httpd, mod_ssl 等),且開機後還是會持續提供 http, https 的服務。處理完畢後, 請輸入『 systemctl status httpd 』拍照後貼上;
- 設計好網址列的檔案:『 http://172.16.33.XXX/myphp.php 』,這個網址會提供 phpinfo() 的 PHP 函數輸出結果。 請使用 firefox 顯示該網址運作結果,截圖回傳。