跳到主要內容

Linux 操作不求人系列 - 參章之陸 - 系統管理(VI) - 網路管理與防火牆

     一般來說,對於現代人,上網的順暢度可能比上廁所的順暢度還重要,故除了要排除自身下載電腦病毒程式,而造成中毒致上網變慢的可能,事先預防被非法連線或是被大量封包攻擊 ( 如 DDoS,https://en.wikipedia.org/wiki/Denial-of-service_attack ),則就需靠所謂的防火牆軟體 (firewall daemon),才能來防範於未然,在 CentOS6_x64 下的防火牆軟體,則為利用 iptables 的規則,與簡單的 TCP Wrapper ( https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sect-Security_Guide-TCP_Wrappers_and_xinetd.html) 來過濾。 iptables 可以設定阻擋或允許利用 TCP (https://en.wikipedia.org/wiki/Transmission_Control_Protocol) 與 UDP (https://en.wikipedia.org/wiki/User_Datagram_Protocol) 的埠號連結事件,而 TCP Wrapper就只針對 TCP ,而網路的埠號為從 0 ~ 65535 ,1023以下的埠號,常保留給常見的連線服務使用,如常知道的網站使用的 http https 通常分別為走 80 443ftp 服務控制端通常走 21,連線資料傳輸端 (client )通常走 20等。至於 TCP 與 UDP 的分別,有興趣的讀者可參考 wikipedia:https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers。
      首先,我們先利用指令 ping 127.0.0.1 ping localhost ( 加上參數 -w 5 ,則會5秒後停止,亦可利用參數 -c 5,來計算5次回傳封包,否則會一直嘗試連線直到使用者輸入鍵盤 Ctrl+c 停止,  ),來看看機器的網卡是否安裝驅動有成功,若有成功,則會傳回封包與回應時間。接著再利用 ping 來對您的 DNS 機器做連線確認,是否可以使用網際網路,若無回應,則使用 ifup eth0 來啟動第一張網卡網路功能,並可以再 ping 一次,如圖3-74(在 MS Windows下的 ping 只會顯示 4 秒,若要一直連線直到使用者利用鍵盤 Ctrl+c 中斷,則須利用 -t 參數 ):



























(圖 3-74)

     圖3-74的第1個指令為利用 ping -w 5 127.0.0.1,來傳送 ICMP 封包 (https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol) 到自身網路裝置,限定 5 秒後離開。由結果可看到,在這五秒內,傳遞 5 次 64bytes 的 ICMP 封包 1 至 5,時間範圍從0.027 ms 至 0.031,時間愈短表示網路速度愈快。ttl 為通過網路裝置(node)的紀錄,預設值因同網域內為 64,不同網域則為 255,每通過一個網路裝置(如路由器),便會減少1個值,因此測試為自己發封包給自己故維持 64。結果最後統計值,告訴我們有5個封包送出,亦收到 5 個封包,無封包漏失,時間使用5000ms(=5s),如黃框內。而黃框內的最後一行顯示 rtt (https://en.wikipedia.org/wiki/Round-trip_delay_time),基本統計值,最小/平均/最大/標準差的時間值。
     第2個指令為使用 ping 去偵測 DNS IP,為了資訊安全,筆者已經將所使用的 DNS IP 屏蔽,請讀者自行問自身公司的 DNS IP 設定或 ISP 公司 ( 網際網路供應商 )的設定,再行將 ping -w 5 後面所接的 DNS IP 改正,以下範例皆同,皆須改正為讀者工作環境所規定的 IP數值,才有效果,在此再次提醒各位讀者。因本例網卡尚未啟用,故第2指令會傳回 Network is unreachable。此時我們再利用指令 ifup eth0 (第3個指令),將第一片網卡啟動使用。第4個指令為再一次 ping DNS IP,結果發現已經有封包的接收與回傳,此時就可以確認電腦是可以連上網際網路(中國稱為在互聯網衝浪)。
     因每台有上網的機器,幾乎皆有開啟 ICMP服務,若您想隱藏自己的機器,不被其他有心人士發現主機是否連線,可以利用檔案 /proc/sys/net/ipv4/icmp_echo_ignore_all 內的數值從 0 改成 1 即可開啟,如下:
$  echo '1'  >  /proc/sys/net/ipv4/icmp_echo_ignore_all  /* 若有您的環境有利用 ICMP 來監控機器網路狀態的機制,關閉前可能要三思再三思,或是利用vim編輯 /etc/sysctl.conf ,加入一參數 net.ipv4.icmp_echo_igonre_all=1,儲存離開後,再執行指令 sysctl -p,亦可以達到相同的效果  */

關閉後再 ping -c 5 127.0.0.1 看看,應該就會傳回 Request time out 的訊息,代表主機無回應了。
    接著,我們亦可以利用指令 traceroute 來查詢筆者操作的電腦主機,要連線至目標主機,所需的節點數量,如圖3-75:


























(圖3-75)

    圖3-75第一個指令為利用 ping 來查詢連接到主機名稱 www.google.com 的狀態,結果參數表示前段已說明,故不再贅述,可以看到 ttl=58。此時我們再利用第2個指令 traceroute -I www.google.com,來追蹤利用 ICMP 連到 www.google.com(163.28.18.45),總共需跳躍多少節點,並顯示每個節點IP與連線時間,因資訊安全,筆者已將IP位址覆蓋。第3個指令為利用參數 -n 較快速簡單顯示,-T 為利用 TCP做 trace,來看到用 TCP 傳遞的節點僅兩個。
     再接著,為了要了解現在電腦主機的所有連線,我們可以利用指令 netstat 來列出:

$ netstat -tlnp   /* 參數 -t (tcp)為僅列出 TCP,若要列出UDP,請使用參數 -u-l (listening) 為有開放服務的埠號,-n (numeric)為顯示IP的數字,-p 為顯示何種程式在使用此埠號  */

上述指令執行後,筆者的虛擬機器所得之結果如圖3-76所示,會因讀者個人電腦主機各種連線與服務而不同。























(圖3-76)

  若我們想了解電腦主機到底開了哪些服務在 Listening,我們可以利用 nmap(https://nmap.org)軟體,來對個別 IP 的服務埠號做掃描,在CentOS6_x64下,可利用 yum install nmap 來安裝套件。安裝完後,便可以下 nmap 指令來做掃描,如以下:
$ nmap  -sT  localhost  /* -sT參數,為針對 TCP 連結的埠號與服務做掃描,localhost可換成欲掃描的 IP 位址,若要掃描 UDP,可改為 -sU ,若要掃描列出更多資訊,可用參數 -A,結果為圖3-77。 */


















(圖3-77)

     由圖3-77可得知,由 localhost/127.0.0.1所開啟的服務與埠號,有 ssh (加密遠端連線)為  22/tcp,smtp(寄信服務軟體)為 25/tcp,rpcbind(遠端程序服務)為 111/tcp,IPP(網路列印服務)為 631/tcp。nmap是一個很強大的網路服務掃描軟體,在資安的學習上很有用處,有興趣的讀者,可利用man nmap,或是在 https://nmap.org 找到詳細的說明文件。
     接著,筆者要介紹在CentOS6_x64下,常用及預設的防火牆軟體 IPTABLES 的基本設定( CentOS7 預設已改為 FIREWALLD )。在開始設定防火牆規則之前,要請讀者先考慮規則內,想要阻擋或允許服務,以及服務所使用的協定,協定所使用的通訊埠,並要想清楚來源 IP 與 目的 IP,傳遞方向為上傳或下載,如圖3-78,黃框處為網卡 eth0 之 RX 為( 接收 或 下載 )流量,TX 為( 傳送 或 上傳)流量,單位是bytes,但網路傳輸的基本單位是 baud rate (https://en.wikipedia.org/wiki/Baud),一般情況,1baud rate 可視為等同 1 bit rate(1 byte = 8 bits )。






















(圖3-78)

    接著,我們利用指令 iptables -L (-L 代表 list )來列出現在已設定的防火牆規則,如圖3-79,可以看到防火牆的規則,分成三個部分,Chain INPUT ( policy ACCEPT )、Chain FORWARD (policy ACCEPT )、Chain OUTPU ( policy ACCEPT ),此三部分,除了有設定的規則外的其他條件,預設皆為接受。其中在Chain INPUT 設定的規則,可以看到使用 icmp (ping) 跟使用 tcp 的 ssh,是開放接受的,其來源(source)與目的(destination),亦為允許任何IP,亦可以使用指令 iptables -L -n  (-n 代表 numerical ) 看出。















(圖3-79)
  若讀者想要設定自身的規則,建議要使用指令 iptables -F (或使用 iptables -F; iptables -X; iptables -Z 來完整清除 ) 清除所有規則,再重新設定,若想直接在現在有規則上加上其他規則,則無需清除。若想要預設改為不接收所有傳送與接收封包,可以直接修改 Chain policy 如下:
$ iptables -P INPUT DROP           #  -P (policy) INPUT (Chain)
$ iptables -P OUTPUT DROP

如圖3-80,在還沒設定允許可從何種傳輸協定連線出去,連瀏覽器都是無法瀏覽的。接下來,我們便利用指令 iptables -A ,來增加可以使用瀏覽器來瀏覽網際網路的網頁的規則。
$ iptables -A INPUT -i lo -j ACCEPT        
/* -A 為向後增加新規則,若改成-I,則為插入成為第一條新規則,-i 為設定 interface,-j 為跳躍至何種決策(接受或丟棄)。此指令為設定從localhost interface 傳送的封包都接受  */
$ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/*  允許現有連線的所有封包,這樣才不會設定好要重啟服務時,突然被斷線 */
$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT #接受 ssh (通訊埠22,往後文章內記載方法為 ssh/22/tcp (service link name / port number / protocol ) )的協定遠端連入
$ iptables -P INPUT  DROP             #預設先擋掉連進來的封包
$ iptables -P FORWARD  DROP     #預設先擋掉Forward的封包(因機器非當路由器)
$ iptables -P OUTPUT  ACCEPT    #預設允許連出去的封包,讓主機可使用其他主機的服務

若我們要加上讓內部網路皆可連線進主機,可以設定以下:
$ iptables -A INPUT -s 192.168.100.0/24 -j ACCEPT

$ iptables -A INPUT -s 192.168.100.0/255.255.255.0 -j ACCEPT

若您需要使用除IP位址外,多增加網路卡的MAC位址(1張網卡僅1個實體位址)來設定信任規則,可使用如以下:
$ iptables -A INPUT -s 192.168.100.100 -m mac --mac-source 00:11:22:33:44:55:66 -j ACCEPT
/* -m  mac 為載入模組 mac檢查模組 --mac-source 為輸入您的網卡實體位址(MAC) */

     規則設定完成後,您可以使用指令 service iptables save 來儲存,並使用 iptables -L -v (-v 代表verbose )來顯示您所設定的規則(圖3-81),便可看到已經可以瀏覽網際網路的網站。若要刪除,可使用指令 iptables  -D ( -D 後面空一格再接上哪一種 Chain,再空一格再接這個 Chain 內哪一條規則 )。或是在 /etc/sysconfig/iptables 內(圖3-82),依照所規定之格式,去做增加或刪減規則。因現筆者僅將電腦主機當成工作站,除了ssh/22連線外,沒有其他伺服器軟體的服務,故僅開放ssh/22連線進入,若後面介紹架設伺服器軟體時,我們再慢慢將伺服器軟體會用到的服務通訊埠,在防火牆內開放。一般伺服器軟體預設的通訊埠,清單為放置在 /etc/services 內,讀者可以利用指令 more /etc/services ,或參考IANA(Internet Assigned Numbers Authority)所指定公認已知的、已註冊的、動態連接埠清單http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml,來了解每個預設通訊埠大致在提供哪些服務,一般來說,常見與常用的通訊埠常保留於1023以下( 如用於連線 BBS 的 telnet,通常使用23,收發信(smtp/pop3)的通訊埠常預設於25,465(smtp over ssl),110,995(pop3 over ssl),http網頁服務的 80 與 443(http over ssl) )。
     接著筆者再補充一些規則,若讀者往後想利用 CentOS6_x64 架設伺服器軟體,則可利用以下規則,來預先防範一些網路攻擊(如 DDoS,https://en.wikipedia.org/wiki/Denial-of-service_attack ),亦可以利用 man iptables 來看看各參數的詳細功能。
$ iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP      
$ iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
/*  以上兩規則皆為利用tcp-flag比對,來拒絕無意義的大量掃瞄與要求回應,以防止DDoS的攻擊 */

$ iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP # 防止類 syn-flood 攻擊

若不要讓其他電腦使用 ping 來查到您的電腦主機,可以用以下指令
$ iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
/*  -j DROP 與 -j REJECT,對於想 ping 您的機器,會回應不同的訊息,但一樣會 ping 不成功 */

以上規則設定完成後,一樣要利用 service iptables save 來儲存並重啟動來使用新規則。


























(圖3-80)


































(圖3-81)






















(圖3-82)

     其實在CentOS6 內,亦有一些快速的設定方式,讀者可以在 Terminal 下,利用指令 setup,來進入 text mode 的系統設定畫面,如圖3-83-1,利用鍵盤上下鍵,按鍵盤Enter鍵進入Firewall configuration,便可以進入防火牆設定畫面。除此之外,讀者亦可利用鍵盤鍵入 system- 後,按下鍵盤Tab鍵,便會搜尋出很多系統管理的GUI工具軟體,如圖3-83-2,可以看到 system-config-firewall 這個防火牆管理工具。故,有這麼多可以設定的工具,筆者還是建議設定一下防火牆,不要關閉 iptables 的服務(如指令 service iptables stop 來暫時停用與 chkconfig --level 235 iptables off 來使開機載入init 2、3、5 模式下不啟用),雖說關閉防火牆,就如同裸體在沙灘上享受陽光浴,沒什麼重大的危險性,但,卻會發生被性騷擾的高度的風險性,不是嗎?

































(圖3-83-1)















(圖3-83-2)

     除了 iptables 的防火牆設定之外,CentOS6_x64 內還有可以 TCP Wrapper 過濾服務,一般設定檔分別為 /etc/hosts.allow 與 /etc/hosts.deny,顧名思義,/etc/hosts.allow為允許的清單,/etc/hosts.deny 為拒絕的清單。例如,我們可以先設定 /etc/hosts.deny 為所有服務軟體的連線皆拒絕,而服務軟體的名稱清單,可用 ls /etc/rc.d/init.d 來得知,若全部服務,則使用關鍵字 ALL,如圖3-84下 /etc/hosts.deny 內容可知,如要了解更多關於 hosts.deny 與 hosts.allow 的詳細設定,可利用指令 man 5 hosts_optionsman 5 hosts_access



















(圖3-84)


     在 /etc/hosts.allow 的檔案內容,可以加上允許被連線的服務與主機位址,如圖3-85
。圖3-85第1條規則,為制定允許在內部網域的 IP 位址,皆可以連線至此主機所開放之伺服器軟體,IP位址範圍的形式,可以使用 192.168.100.0/255.255.255.0,等同 192.168.100.0/24 (subnet mask可參考 https://en.wikipedia.org/wiki/Subnetwork)。再空一格後,可以再加上下一個IP位址,或IP範圍。在此,筆者加入防火牆的IP,與接下來的localhost,localhost一般等同IP位址127.0.0.1(上述的真實 IP,筆者為了資訊安全,已經屏蔽 IP 位址的中間兩數字,在此先敘明)。第2條規則,為允許 sshd 的服務,可以讓兩種IP位址範圍(網域),來做連線。而第3個規則,除了 .edu.tw 這 domain 可以使用連線 vsftpd 服務外,拒絕 .edu.tw 之其他所有IP位址要連線至 vsftpd 的服務。從以上的規則設定方法,讀者可以整理出適合自己辦公室網路環境的〝組合技〞,以期達到防護被掃瞄 IP 與服務 port,並被利用暴力法來破解簡單密碼,而被盜用帳號產生的資安漏洞。有關於Firewall - TCP Wrappers - xinetd 的相互關係,可參考說明網頁https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sect-Security_Guide-TCP_Wrappers_and_xinetd.html
























(圖3-85)

     接下來的下一節,筆者要教讀者來看看系統管理人員必須熟悉的系統記錄檔 log,前幾段所設置的防火牆規則,皆會有通過與不通過規則的紀錄,放在系統 /var/log 資料夾下,一般管理人員,可能久久去閱讀一次;或是系統出了事,再去閱讀與找答案,甚或有些高手高手高高手,可以寫一個 shell scripts,利用 crond 服務, 把每天需要了解的系統資訊,整理出一個資訊檔案,寄出 email (要先啟動 postfix 服務 )通知管理人員,或遇到僅系統嚴重問題或資安事件才寄出通知。但這些應用,都需建立在先了解系統紀錄檔的檔名與內容排列的基礎上,故接著筆者要來簡單介紹有哪些系統紀錄檔,可以參考並應用。除此之外,下節亦會提到編譯自訂的Linux Kernel。因一般Kernel為因應各種伺服器與工作站硬體,都會先預安裝很多驅動與硬體設定,故會載入很多可能所使用的電腦主機,這輩子都用不到的設定與裝置驅動(但也為了方便與相容性,無須再費工夫另外抓取 ),或是其他根本不會用到的服務,故我們可透過重編譯 Kernel ,來去除一些模組並加快開機載入 Kernel 的速度,筆者認真真心不騙。



If you have any feedback or question, please go to my forum to discuss.

這個網誌中的熱門文章

Linux 操作不求人系列 - 貳章之貳 - Shell Script 程式設計(II) - BASH 與 TCSH / CSH

     在上章,我們介紹很多bash shell指令的應用方式,並讓它們變成 script,在這章此節,我們要承襲上節,繼續討論 bash shell script 的其它程式設計概念,與讓程式可重複使用的方法,就是利用函式(function)。      首先,我們來創作一個判斷是否為閏年的函數,script的名稱就取為 check_year.sh ,請自行將其設為可執行。程式碼如圖2-6,為了解說方便,筆者利用指令 nl check_year.sh 將程式碼包含行數印出(圖2-7),其他除顏色外,都與圖2-6同。以下 export 宣告環境變數,自訂變數無需加宣告保留字。(2021.10.07更正export說明,以下自訂變數宣告請直接去除export開頭) (圖2-6) (圖2-7)        圖2-7第2-6行,與之前的範例相似,皆有防堵參數個數輸入錯誤的判斷。第7-11行為接著判斷輸入的年分,是否為真的正整數,也就是大於零的數字。其中第7行可解釋為,利用正規表示式搜尋 $2 字串值得頭至尾部的字元,皆由 0-9 組成,若有,則為真(True)會進入 if 內的陳述執行, 但我們想要的,應該是僅要字串其中一字元為非正整數,便進入if 內的警告並跳出 。故,筆者在判斷式前多加一個 ! ,代表著當字元完全是正整數時,就不要執行  if  內陳述,而直接往第12行執行,但若其中有一個字元為非正整數,則會進入 if 內印出錯誤訊息並跳出 Script 。在此例使用者輸入非正整數等字串(如:12ab、cde、1a1b),便會出現錯誤訊息"Error Value",並跳出 Script 。而第8行的判斷式,效果跟第7行相同,但只能在BASH 3.0才能支援,故筆者故意保留,讓讀者可以學到另一種表示方式。         第12-28行,為宣告一個函式 leapyr () ,在 BASH Script內若要使用含式,必須在使用之前先建立函式的功能,如函式建立在第12-28行,則若要呼叫使用(Call)函式,則必須在第29行之後才能呼叫,並且可重複呼叫。第13行為定義函式呼叫時,一定會有一個外部參數, 此外部參數非該 Script 的外部參數 ,而是由程式撰寫者給入,故在此無設定防呆判斷。第14-

Linux操作不求人- 肆章之壹 - 伺服器架設(I) - SSH(SFTP、SCP)、FTP伺服器與遠端連線

@ ssh, sftp      通常安裝好 CentOS6_x64 作業系統後,sshd, ssh daemon 的服務功能是預設開啟的,如筆者的前面篇章所述,預設的 iptables 防火牆設定,亦是開啟讓 ssh 的連線是可通過的,不僅可以連出,也可以被連入。若要確認是否有安裝 sshd 套件以及在啟動時的 runlevel 2 3 5 是否有被載入,可以使用以下指令搜尋: $   rpm  -qa  |   grep  openssh     #  ssh 與 sshd 連線服務皆由 openssh 應用軟體提供。 或使用以下 $   rpm  -qa  |   grep  ssh         #  比用關鍵字 openssh 搜尋更模糊,故符合的條件更多。      如圖4-1可以查詢到有關於 openssh-client 與 openssh-server 的套件, openssh-server 便是提供連入服務的軟體,openssh-client 為提供可以連出的工具。若無以上套件,則使用 yum install openssh ,則可下載安裝。 (圖4-1) 再接著輸入以下指令查詢到 sshd 這個服務,是否有再開機程序內載入,如圖4-2 $ chkconfig | grep ssh   # 查詢 sshd 是否有於 開機 runlevel 啟動 再利用以下指令,來查詢是否防火牆有允許連線 $ iptables  -L  |  grep ssh   # 出現如圖4-2 允許通過之條件 (圖4-2)      接下來,我們要先來調整 sshd 的設定檔,利用 vim  /etc/sshd/sshd_conf ,如圖4-3-1與4-3-2。因為設定檔參數很多,筆者為方便說明,將 /etc/sshd/sshd_conf 檔案內容分成兩張圖。 (圖4-3-1)

Linux操作不求人 - 伍章之陸 - Intel PXE 與利用 tftp + anaconda kickstart來自動部署系統

     現代的個人電腦與筆電爲了節能省碳,往往皆省略了光碟機的設置。雖然說 USB隨身碟亦可應用於安裝作業系統,但若遇到機房的大量機器需安裝之問題,亦不適合此種用光碟片或隨身碟逐臺安裝的方式,或是需準備多片光碟或隨身碟。故爲了大量安裝與部屬 Linux作業系統的機器,我們便可透過具有PXE功能之網路卡(https://en.wikipedia.org/wiki/Preboot_Execution_Environment),其所具備的網路開機的能力,來作透過網路方式來安裝與大量部署 CentOS Linux作業系統。其原理 wikipedia  的PXE說明,都解釋得很清楚,筆者不需要再 " 掉書包 ",在開發者大神面前班門弄斧,我們就直接來做做看。      首先,我們一樣透過 yum來安裝所需的 tftp伺服器軟體(http://www.jounin.net/tftpd32.html),利用PXE支援 tftp 透過 udp 埠號 69連線,來提供檔案的能力,給利用 PXE開機後安裝作業系統的機器,圖5-60   (圖5-60) 接著修改 tftp 設定檔 /etc/xinetd.d/tftp,如圖5-61,請記得 disable  要改為 no (圖5-61)      若要修改 server_args 參數為自訂的 tftp root 路徑,記得要變更 SELinux 的權限設定,如要改為/tftpboot,則使用指令 chcon  來調整,如以下: $ mkdir /tftpboot $ chcon  --reference /var/lib/tftpboot  /tftpboot 接著將 xinetd 與 tftp 加入開機啟動,並重啟動 xinetd,如下: $ chkconfig  --level  235  xinetd on $ chkconfig  --level  235  tftp  on $ service xinetd restart 開放防火牆通行 $ iptables -A INPUT -p udp --dport 69 -j ACCEPT $ service iptables re