# **SSH伺服器** #### **介紹** 1. 有加密 2. 預設戶號 22 ### **安裝方式** apt install openssh-server (預設已安裝) ### **查詢伺服器狀態** 1. systemctl status sshd :查詢狀態 2. systemctl start sshd :啟動伺服器 3. systemctl stop sshd :停止伺服器 4. systemctl enable sshd :開啟開機自啟動 5. systemctl disable sshd :關閉開機自啟動 6. systemctl restart sshd :重新啟動(會中斷) 7. systemctl reload sshd :重新加載(不會中斷) ## 使用 ubuntu1~$ ssh user@ubuntu2位置 :::danger 預設不讓使用root登入 需要修改SSH伺服器配置檔(/etc/ssh/sshd_config) 1. ubuntu2~#vim sshd_config (要使用root權限) ![image](https://hackmd.io/_uploads/Bk5pnMv71l.png) 2. 修改要重啟伺服器 ![image](https://hackmd.io/_uploads/rk2hRGv7kg.png) ::: ### 無密碼登入(Root登入步驟一樣) 1. ubuntu1~$ ssh-keygen (產生公鑰私鑰) :::success 放置在/home/user/.ssh ![image](https://hackmd.io/_uploads/S1ZwqGDQJl.png) ::: 2. ubuntu1~$ ssh-copy-id user@ubuntu2IP位置 :::success 將公鑰複製到ubuntu2 ![image](https://hackmd.io/_uploads/BJWh9MwQ1e.png) ::: 3. ubuntu1~$ ssh user@ubuntu2位置 :::success 登入ubuntu2 ![image](https://hackmd.io/_uploads/rkf7jzPXJg.png) ::: ### 到ubuntu2執行指令 將指令串接在後面 :::success ubuntu1~$ ssh user@ubuntu2 "pwd" ![image](https://hackmd.io/_uploads/r1bujGvXJl.png) ubuntu1~$ ssh user@ubuntu2 "cd /tmp && pwd" ![image](https://hackmd.io/_uploads/Skf9sMPQJx.png) ::: ## 複製 (sftp) ### 複製檔案 1. ubuntu1:~$ scp file user@ubuntu2:/tmp :::success 將file檔案傳送到ubuntu2的tmp資料夾下 ![image](https://hackmd.io/_uploads/SJ7EE7vQJl.png) 查看ubuntu2 ![image](https://hackmd.io/_uploads/H1YwEQwQJl.png) ::: 2. ubuntu1:~$ scp user@ubuntu2:/tmp/file . :::success 將ubuntu2下的tmp資料夾裡的file傳送到本地端 ![image](https://hackmd.io/_uploads/S1qvrXPXye.png) ::: ### 複製資料夾 1. ubuntu1:~$ scp -r test user@ubuntu2:/tmp :::success 將test資料夾傳送到ubuntu2的tmp資料夾下 ![image](https://hackmd.io/_uploads/SkJGtQD71l.png) 查看ubuntu2 ![image](https://hackmd.io/_uploads/SkL7tmwXkx.png) :::danger 參數 -r:遞迴複製 ::: 2. ubuntu1:~$ scp -r user@ubuntu2:/tmp/test . :::success 將ubuntu2下的tmp資料夾裡的test資料夾傳送到本地端 ![image](https://hackmd.io/_uploads/B1FtqQvQkl.png) ![image](https://hackmd.io/_uploads/Skj59mPQyg.png) :::danger 參數 -r:遞迴複製 ::: # NFS Server 使得 Linux 之間可以共享資料夾 ## 伺服端 1. ubuntu1:~$ sudo apt install -y nfs-kernel-server :::success 安裝伺服端 ::: 2. 建立資料夾並產生四個檔案 ![image](https://hackmd.io/_uploads/BJ2I_4v7ke.png) 3. 更改資料夾擁有者 ![image](https://hackmd.io/_uploads/ryXn_NDQJx.png) 4. 修改配置檔 `/etc/exports`,加入下列程式碼 ```vim= /nfs-server *(rw,sync,no_subtree_check,all_squash) ``` ![image](https://hackmd.io/_uploads/HkV89Nvmyx.png) 5. 重新啟動 ```vim= ubuntu1:~# systemctl restart nfs-kernel-server ``` ![image](https://hackmd.io/_uploads/SktjqVvX1l.png) ## 客戶端 1. ubuntu2:~$sudo apt install nfs-common -y :::success 安裝客戶端 ::: 2. ubuntu2:~#mkdir /nfs-client :::success 建立資料夾 ::: 3. 將遠端的資料夾掛載到本地端的資料夾 :::success mount -t nfs -o rw,resvport ubuntu1:/nfs-server /nfs-client ::: 4. 查看客戶端資料夾是否有四個檔案 ![image](https://hackmd.io/_uploads/SkZnTVvXJl.png) :::info 取消連結 ubuntu2:~#umount /nfs-client (要離開nfs-client資料夾) ![image](https://hackmd.io/_uploads/Bk43AEPXke.png) ::: # 使用USB 插入USB後查看掛載點 ![image](https://hackmd.io/_uploads/B1gSXBDm1g.png) ## 修改USB掛載點 1. ubuntu1:~#mkdir /myusb :::success 建立新的資料夾當USB的掛載點 ::: 2. 將USB掛載到myusb資料夾上 ![image](https://hackmd.io/_uploads/HkbKSHDQyx.png) # 新增硬碟 1. 先檢查新加入的硬碟 ![image](https://hackmd.io/_uploads/HJ1g5BPQJe.png) 2. 磁碟切割 1. ubuntu1:~# fdisk /dev/sdb ![image](https://hackmd.io/_uploads/SJZHqHDQJe.png) 2. 輸入n (新增分區) ![image](https://hackmd.io/_uploads/ryUJsrP71e.png) 3. 輸入p (選擇主要分割區,皆使用預設) ![image](https://hackmd.io/_uploads/BJbLsBwmke.png) 4. 輸入w (寫入設定) ![image](https://hackmd.io/_uploads/BktaiSv7yg.png) 3. 格式化硬碟 ![image](https://hackmd.io/_uploads/HJFShSDX1l.png) 4. 建立要掛載的資料夾 :::success ubuntu1:~# mkdir /mydisk ::: 5. 將sdb1掛載到mydisk資料夾上,就可以使用 :::success ubuntu1:~#mount /dev/sdb1 /mydisk ::: 6. 檢查掛載是否成功 ![image](https://hackmd.io/_uploads/SywBaHvQJg.png) 7. 查詢新增硬碟的UUID ![image](https://hackmd.io/_uploads/H1yRTrDXJl.png) 8. 編輯/etc/fstab ![image](https://hackmd.io/_uploads/Sy_00HD7ye.png) 9. 重開機 10. 檢查是否有自動掛載到mydisk資料夾上 ![image](https://hackmd.io/_uploads/SJvIkID7Jx.png) # 存儲空間 ### 1. lsblk #### 列出系統的塊設備(block devices),主要用於查看磁碟、分區和掛載信息 ![image](https://hackmd.io/_uploads/B1aPWdwmyl.png) ### 2. df #### 顯示文件系統的的可用空間、已用空間及總大小,還提供已掛載設備的信息 常用參數: -h:以常見格式顯示大小(如 GB、MB) -T:顯示文件系統類型 -i:顯示 inode 使用情況 ![image](https://hackmd.io/_uploads/rJH9GOPQJl.png) >[!Note] >僅顯示出某個欄位 (腳本程式常用) >![image](https://hackmd.io/_uploads/BkHWhd_Q1g.png) >將指令存儲成變數 (腳本程式常用) >![image](https://hackmd.io/_uploads/HkJY3_d71l.png) >![image](https://hackmd.io/_uploads/BkJQaduXJe.png) >[!Important] >正則表達式: >1. $ 匹配字符串的結尾 >![image](https://hackmd.io/_uploads/SkZFRddXkg.png) >2. ^ 匹配字符串的開頭 >![image](https://hackmd.io/_uploads/r1F-JK_7Je.png) ### 3. du #### 顯示目錄或文件的大小 常用參數: -h:以常見格式顯示大小(如 GB、MB) -s:僅顯示總大小 ![image](https://hackmd.io/_uploads/BJ_eVdv7yx.png) ### 4. dstat #### 監控磁碟讀寫狀況 (預設沒有安裝) 常用參數: -c:顯示 CPU 使用率 -n:顯示網絡流量 -d:顯示磁碟的讀寫數據 ![image](https://hackmd.io/_uploads/rJSOWt_Qkx.png) ### 5. iotop #### 監控磁碟I/O活動(預設沒有安裝) 數據解析: Total DISK READ/WRITE:顯示整體系統的磁碟讀寫速度 USER:運行進程的用戶 DISK READ/WRITE:該進程的磁碟讀取/寫入速率。 IO%:進程的 I/O 使用率 ![image](https://hackmd.io/_uploads/HJftQK_7yg.png) # MariaDB ## 安裝流程 ### 伺服端 #### 1. 安裝金鑰 1. 安裝apt-transport-https和curl :::success ubuntu1:~$ sudo apt install apt-transport-https curl ::: 2. 建立資料夾 :::success ubuntu1:~$ sudo mkdir -p /etc/apt/keyrings ::: 3. 下載金鑰 :::success sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp' ::: #### 2. 加入儲存庫 `ubuntu1:~# vim /etc/apt/sources.list.d/mariadb.sources`,加入下列程式碼 ```vim= # MariaDB 11.1 repository list - created 2023-11-08 06:16 UTC # https://mariadb.org/download/ X-Repolib-Name: MariaDB Types: deb # deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details. # URIs: https://deb.mariadb.org/11.1/ubuntu URIs: https://ftp.ubuntu-tw.org/mirror/mariadb/repo/11.7.1/ubuntu Suites: jammy Components: main main/debug Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp ``` ![image](https://hackmd.io/_uploads/Sy5yFdvmkl.png) #### 3. 安裝 MariaDB Server 1. 安裝MariaDB :::success ubuntu1:~$ sudo apt install mariadb-server ::: 2. 檢查伺服器狀態 :::success ubuntu1:~$ systemctl status mariadb ::: 3. 初始化MariaDB 1. ubuntu1:~# mysql_secure_installation ![image](https://hackmd.io/_uploads/H1OXh_PmJx.png) 2. 預設MariaDB沒有密碼,直接按enter就好了 ![image](https://hackmd.io/_uploads/HJ8ga_v7Jl.png) 3. 沒有強制使用,輸入 n。 ![image](https://hackmd.io/_uploads/S1h7puvXyg.png) 4. 修改資料庫root帳號密碼,輸入y ![image](https://hackmd.io/_uploads/ryuIpODX1x.png) 5. 輸入root密碼 ![image](https://hackmd.io/_uploads/r1ac6Ovm1l.png) 6. 移除匿名帳號,輸入y ![image](https://hackmd.io/_uploads/H1yT6dwX1e.png) 7. 不允許遠端使用root帳號登入,輸入n ![image](https://hackmd.io/_uploads/rJ5b0_vQ1x.png) 8. 移除測試資料庫與帳號,輸入y ![image](https://hackmd.io/_uploads/SksVROP7Jg.png) 9. 重新載入權限設定,輸入y ![image](https://hackmd.io/_uploads/BkjD0OwmJg.png) 4. 登入MariaDB ![image](https://hackmd.io/_uploads/BkpbktwXyl.png) 5. 編輯/etc/mysql/mariadb.conf.d/50-server.cnf,將bind-address=127.0.0.1改成bind-address=0.0.0.0,使得所有人都可以連線 ![image](https://hackmd.io/_uploads/S12lsSd7kx.png) 6. 重啟MariaDB伺服器 :::success ubuntu1:~$ systemctl restart mariadb ::: 7. 新增資料庫權限 ```vim= GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'user' WITH GRANT OPTION; ``` ![image](https://hackmd.io/_uploads/BJtl0r_XJg.png) 8. 更新系統權限表 ```vim= FLUSH PRIVILEGES; ``` ![image](https://hackmd.io/_uploads/Sy1b6B_myx.png) 9. 關閉防火牆,並且設為開機不自啟動 ![image](https://hackmd.io/_uploads/S1OuTH_Qke.png) ### 客戶端 #### 1. 安裝MariaDB Client ubuntu2:~$ sudo apt install mysql-client #### 2. 登入MariaDB ![image](https://hackmd.io/_uploads/SJV9AS_mkx.png) ## 使用 1. 顯示目前有的資料庫 ![image](https://hackmd.io/_uploads/B1BdzOdmyx.png) 2. 創建新的資料庫 :::success create database 資料庫名稱; ![image](https://hackmd.io/_uploads/r1rJmOu7Jg.png) ::: 3. 使用資料庫 :::success use 資料庫名稱; ![image](https://hackmd.io/_uploads/rJM8QuO71g.png) ::: 4. 顯示目前有的資料表 ![image](https://hackmd.io/_uploads/SkDbBu_X1x.png) 5. 創建資料表 :::success create table 資料表名稱(資料表欄位1,資料表欄位2,...); ![image](https://hackmd.io/_uploads/Skp24OuQ1g.png) ::: 6. 加入資料到資料表中 :::success insert into 資料表名稱(資料表欄位1,資料表欄位2) values (欄位1值,欄位2值); ![image](https://hackmd.io/_uploads/HJF1LOdmyg.png) ::: 7. 顯示資料表中的資料 :::success select 欄位1,欄位2 from 資料表名稱; ![image](https://hackmd.io/_uploads/BkysUdu7yl.png) select 欄位1,欄位2 from 資料表名稱 where 欄位="搜尋目標"; ![image](https://hackmd.io/_uploads/ByB4wu_7kx.png) ::: 8. 更新資料表中的資料 :::success update 資料表名稱 set 欄位="更改的值" where 欄位="更改的目標"; ![image](https://hackmd.io/_uploads/B1i9Fuum1g.png) ::: # 連結 (捷徑) ## 硬連結 硬連結是一個直接指向文件數據塊的條目 #### 特性 1. 硬連結不是指向文件路徑,而是直接指向文件的數據塊 2. 即使目標文件被刪除,硬連結仍然有效,因為數據仍保存在磁碟中(除非所有指向該數據的硬連結都被刪除) 3. 只能在同一個文件系統中創建,不能跨分區 4. 不能指向目錄 #### ubuntu1:~$ ln 檔名 硬連結檔名 ![image](https://hackmd.io/_uploads/r1KZTc_mJl.png) ## 符號連結 符號連結是一個類似於快捷方式的文件。它指向另一個文件或目錄的路徑,而不是數據本身 #### 特性 1. 符號連結是一個獨立的文件,存儲的是目標文件的路徑。 2. 如果目標文件被刪除或移動,符號連結會失效(變成“斷開的連結”)。 3. 可以跨文件系統創建(目標和連結可以位於不同的磁碟分區)。 4. 可以指向文件或目錄。 #### ubuntu1:~$ ln -s 檔名 符號連結檔名 ![image](https://hackmd.io/_uploads/ByR1T5O7ye.png) ## 兩者比較 | 特性 | 符號連結 (Symbolic Link) | 硬連結 (Hard Link) | | ------------- | ----------------------- | ---------------------- | | 概念 | 指向文件的路徑 | 指向文件的數據 | | 是否可以指向目錄 | 可以 | 不可以 | | 跨磁碟分割區 | 支持 | 不支持 | | 目標文件刪除影響 | 連結失效(斷開連結) | 不受影響(數據仍存在) | | 文件系統inode | 使用新的 inode | 與原始文件共享同一個 inode | >[!Important] inode >用於描述每個文件和目錄的元數據(metadata),每個文件或目錄都對應著一個唯一的 inode,即使檔案內容相同inode仍不一樣,包含以下內容: >1. 文件屬性: >* 文件大小 >* 文件類型(普通文件、目錄、符號連結等) >* 文件的許可權(如 rwx 權限) >* 所有者(用戶 ID 和組 ID) >2. 數據位置: >* 指向存儲數據塊的指針(即文件的實際數據位置) # Curl ### 安裝 ubuntu1:~$ sudo apt install curl #### 介紹 :::success 1. 是一種文字版的瀏覽器,可將網頁抓回來(以html格式回傳) 2. 可用於測試網頁 >1. 回傳值為0,網頁正常 >![image](https://hackmd.io/_uploads/rkvX2dKXyg.png) >2. 回傳值為非0,網頁不正常(-connect-timeout 秒數:指定執行秒數結束) >![image](https://hackmd.io/_uploads/SJ2umKYQyg.png) ::: # Apache 伺服器 ## 安裝伺服器與網頁管理工具 ubuntu1:~$sudo apt -y install apache2 apache2-utils ### 確認伺服器狀態 :::success ubuntu1:~$ systemctl status apache2 ![image](https://hackmd.io/_uploads/S1iK_dKQJg.png) 使用ubuntu1的IP嘗試連接 ![image](https://hackmd.io/_uploads/S1tLKOKXkg.png) ::: ## 加密網頁 1. 安裝apache2-utils ``` ubuntu1:~$ sudo apt-get install apache2-utils ``` 2. 產生htpasswd (第一次安裝需要加 -c 產生密碼檔) ``` ubuntu1:~$ sudo htpasswd -c /etc/apache2/.htpasswd 使用者名稱 ``` 3. 設定使用者密碼 ![image](https://hackmd.io/_uploads/rJ4oMVomkg.png) 4. 設置第二位使用者 (不需要加 -c 產生密碼檔) ``` ubuntu1:~$ sudo htpasswd /etc/apache2/.htpasswd 使用者名稱 ``` ![image](https://hackmd.io/_uploads/r1xSmEs7Je.png) 5. 到 /var/www/html/sec 產生要加密的網頁 ``` ubuntu1:/var/www/html/sec# echo "This is a private webpage" > index.html ``` 6. 修改Apache virtual host設定檔 (預設在 /etc/apache2/sites-enabled/000-default.conf ) ``` <Directory "/var/www/html/sec"> AuthType Basic AuthName "You need to login" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Directory> ``` ![image](https://hackmd.io/_uploads/Hymj8Njm1e.png) 7. 重新啟動 Apache2 伺服器 ``` ubuntu1:~# systemctl restart apache2 ``` 8. 確認網頁是否需要密碼驗證 ![image](https://hackmd.io/_uploads/HyDDv4jQJx.png) >[!Caution] >查看/etc/apache2/.htpasswd 可以知道加入了幾個使用者 >**密碼有加密** >![image](https://hackmd.io/_uploads/r17eE4om1x.png) ## 啟用UserDir 1. 啟用userdir功能 ```ubuntu1:~$ sudo a2enmod userdir``` 2. 編輯 /etc/apache2/mods-enabled/userdir.conf ,將內容修改成下列程式碼 ``` <IfModule mod_userdir.c> UserDir public_html UserDir disabled root <Directory /home/*/public_html> AllowOverride All Options MultiViews Indexes SymLinksIfOwnerMatch <Limit GET POST OPTIONS> Require all granted </Limit> <LimitExcept GET POST OPTIONS> Require all denied </LimitExcept> </Directory> </IfModule> ``` 3. 重新啟動 Apache 伺服器 ```ubuntu1:~$ systemctl restart apache2``` 4. 建立 **public_html** 目錄,在 **index.html** 裡加入內容 ![image](https://hackmd.io/_uploads/B1V70I37Je.png) 5. 因為 **public_html** 放置在各個使用者的家目錄裡,所以需要將使用者的目錄權限修改,讓所有人都可以進行訪問 ![image](https://hackmd.io/_uploads/rJuFyvnQJg.png) 6. 確認網頁 ![image](https://hackmd.io/_uploads/BkkclwnmJg.png) ![image](https://hackmd.io/_uploads/rJG4bvh71l.png) ## 設置虛擬主機(Virtual Hosts) 1. 在 **/var/www**中建立兩個不同網站的家目錄 `www-a-com` 和 `www-b-com` 2. 確認 **/var/www** 是否為所有人都可以進行訪問 ![image](https://hackmd.io/_uploads/rJPMBP3mJl.png) 3. 在各自網站的家目錄中建立 **index.html** ![image](https://hackmd.io/_uploads/SkMtrwnXJx.png) 4. 在 **/etc/apache2/sites-available** 中建立新的虛擬主機文件 1. www-a-com: ```ubuntu1:~# vim /etc/apache2/sites-available/www-a-com.conf``` 加入下列程式碼 ``` <VirtualHost *:80> ServerAdmin admin@www.a.com ServerName a.com ServerAlias www.a.com DocumentRoot /var/www/www-a-com ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> ``` 2. www-b-com: ```ubuntu1:~# vim /etc/apache2/sites-available/www-b-com.conf``` 加入下列程式碼 ``` <VirtualHost *:80> ServerAdmin admin@www.b.com ServerName b.com ServerAlias www.b.com DocumentRoot /var/www/www-b-com ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> ``` 5. 將下列加入 Windows 電腦中的 **C:\Windows\System32\drivers\etc\hosts** ``` 192.168.44.140 www.a.com 192.168.44.140 www.b.com ``` 6. 啟動新增的虛擬主機文件 ```ubuntu1:~# a2ensite www-a-com.conf``` ```ubuntu1:~# a2ensite www-b-com.conf``` 7. 重新載入伺服器 `ubuntu1:~# systemctl reload apache2` 8. 確認網頁 ![image](https://hackmd.io/_uploads/rkDMhv3mJe.png) ![image](https://hackmd.io/_uploads/SyuX2w3Xyg.png) ## 查看伺服器連線紀錄 連線紀錄放置在`/var/log/apache2/access.log` ![image](https://hackmd.io/_uploads/Hy-XmxAX1e.png) #### 管理範例 使用: grep:篩選符合條件的行 awk:對文本進行更靈活的處理和過濾 sort:排序文件 uniq:處理重複數據的工具 查看使用 Firefox 瀏覽器進行訪問的IP和作業系統 ![image](https://hackmd.io/_uploads/ByA8_xR7kg.png) # PHP 伺服器 (動態網頁) ## 安裝 1. 增加 PHP 套件庫來源 :::success ubuntu1:~$ sudo apt install software-properties-common ::: 2. 新增 PHP 8 的 PPA 來源 :::success ubuntu1:~$ sudo add-apt-repository ppa:ondrej/php ::: 3. 更新 apt 來源 :::success ubuntu1:~$ sudo apt update ::: 4. 安裝 PHP 相關套件 :::success 1. ubuntu1:~$ sudo apt install php8.1 libapache2-mod-php8.1 php8.1-gd php8.1-mysql php8.1-curl php8.1-mbstring php8.1-intl -y 2. ubuntu1:~$ sudo apt install php8.1-gmp php8.1-bcmath php8.1-imagick php8.1-xml php8.1-zip -y ::: 5. 啟用 Apache 的 PHP 模組 :::success ubuntu1:~$ sudo a2enmod php8.1 ::: 6. 重新啟動 Apache 伺服器 :::success ubuntu1:~$ sudo systemctl restart apache2 ::: 7. 確認 Apache 伺服器狀態 ![image](https://hackmd.io/_uploads/ByRa_tK7Jg.png) 8. 測試 PHP 版本資訊 :::success 1. 編輯 /var/www/html/info.php >ubuntu1:~$ sudo vim /var/www/html/info.php >![image](https://hackmd.io/_uploads/Skxui9Y7kx.png) 2. 確認網頁 >![image](https://hackmd.io/_uploads/rJ9N3ct71x.png) ::: 9. 編輯連結資料庫測試網頁 1. 將下列程式碼加入/var/www/html/test.php ``` <?php $servername="192.168.44.140"; $username="root"; $password="user"; $dbname="testdb"; $conn = new mysqli($servername, $username, $password, $dbname); if($conn->connect_error){ die("connection failed: " . $conn->connect_error); } else{ echo "connect OK!" . "<br>"; } $sql="select name,phone from addrbook"; $result=$conn->query($sql); if($result->num_rows>0){ while($row=$result->fetch_assoc()){ echo "name: " . $row["name"] . "\tphone: " . $row["phone"] . "<br>"; } } else { echo "0 record"; } ?> ``` 2. 確認測試網頁是否連接到資料庫 ![image](https://hackmd.io/_uploads/SJpKyitmkx.png) >[!Note] Python flask >1. ubuntu1:~$ sudo apt install python3 python3-pip >2. ubuntu1:~$ sudo pip3 install flask >3. ubuntu1:~$ vim test.py >加入下列程式碼 >``` >from flask import Flask >app = Flask(__name__) > >@app.route('/') >def hello_world(): > return '<h2>Hello, World!</h2>' > >if __name__ == '__main__': > app.run(host='0.0.0.0', port=3000, debug=True) >``` >4. ubuntu1:~$ python3 test.py >![image](https://hackmd.io/_uploads/rk9a4st71g.png) >5. 確認測試網頁 >![image](https://hackmd.io/_uploads/BkIxSstXkl.png) >[!Note] Tree >**介紹:** 以樹狀結構顯示目錄和文件的工具 >**安裝:** ubuntu1:~$ sudo apt install tree >**使用:** >![image](https://hackmd.io/_uploads/B1YRFoY7kg.png) # Ngrok #### 用於將本地伺服器公開到互聯網上 ## 安裝 1. 通過以下命令使用 Apt 安裝 ngrok: ``` ubuntu1:~# curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \ | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \ && echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \ | sudo tee /etc/apt/sources.list.d/ngrok.list \ && sudo apt update \ && sudo apt install ngrok ``` 2. 將authtoken添加到預設的 ngrok.yml 配置文件中 ``` ubuntu1:~# ngrok config add-authtoken 2nmQc5kaIFBLMwY4dcEtVYZqCMN_dDfDuHSFhnxRJiNvDZxC ``` ## 使用 ngrok http http://localhost:80 (使用 Apache2 的端口,也可使用別的) ![image](https://hackmd.io/_uploads/SkprGx57ke.png) ![image](https://hackmd.io/_uploads/B1mvzxcXke.png) ## 網頁加密 (密碼長度要大於8個字元) ```vim= ubuntu1:~# ngrok http 80 --basic-auth "使用者名稱1:密碼1" --basic-auth "使用者名稱2:密碼2" ``` ![image](https://hackmd.io/_uploads/HJ3p4myNye.png) # 帳號管理 ## Root #### 家目錄: ![image](https://hackmd.io/_uploads/S1j5YViXJx.png) ## 一般使用者 #### 家目錄 /home/使用者名稱 : ![image](https://hackmd.io/_uploads/B1kJcVj7Jx.png) #### 切換使用者 1. ```ubuntu1:~# su 使用者名稱``` >不會切換到使用者家目錄 2. ```ubuntu1:~# su - 使用者名稱``` >會切換到使用者家目錄 ## 新增一般使用者 #### 1.```ubuntu1:~# useradd -m 使用者名稱 -s 使用的shell``` (腳本程式常用) 常見參數: 1. -m: 自動創建使用者的家目錄 2. -s: 指定使用者所使用的shell 3. -g: 指定使用者的主要群組 (預設為創建與使用者名稱相同的群組) 4. -G: 指定使用者的附加群組 5. -u: 指定使用者的UID (預設為現有 UID +1) 6. -d: 指定使用者家目錄 #### 2.```ubuntu1:~# adduser 使用者名稱``` 以問答的方式新增 >![image](https://hackmd.io/_uploads/rkORnHsQke.png) ## 新增群組 ```ubuntu1:~# groupadd 群組名稱``` ## 刪除一般使用者 `ubuntu1:~# userdel 使用者名稱` ## 刪除群組 `ubuntu1:~# groupdel 群組名稱` ## 兩者比較 | | root | 一般使用者 | | -------- | -------- | -------- | | 帳號名稱 | root | 建立時自訂 | | 家目錄位置 | /root | /home/使用者名稱 | | 對檔案的權限 | 可讀取、修改系統中所有檔案及目錄的內容及權限| 僅能讀取、修改具有權限的檔案及目錄 | | 執行指令的權限 | 可執行系統中所有指令 | 僅能執行具有權限的指令| | UID | UID = 0 | 從1000開始 (預設 user UID = 1000) | | GID | GID = 0 | 從1000開始 (預設 user GID = 1000) | >[!Note] 查看一般使用者可執行的管理員指令 >```ubuntu1:~$sudo -l``` >![image](https://hackmd.io/_uploads/Sk6qaVoQkx.png) >[!Note] 存儲帳號訊息的位置 >存放在``/etc/passwd`` >**所有人都可以讀取** >![image](https://hackmd.io/_uploads/rkKNJHim1e.png) >>使用者名稱:密碼(不存放在這):UID:GID:comment:家目錄:使用的shell >[!Note] 存儲群組訊息的位置 >存放在``/etc/group`` >**所有人都可以讀取** >![image](https://hackmd.io/_uploads/r1b24Io71g.png) >[!Note] 暫時停止使用者登入 >修改```/etc/passwd```中的使用者所使用的shell,修改為```/usr/sbin/nologin``` >![image](https://hackmd.io/_uploads/ryK9NSs7kl.png) >即可停止帳號登入 >![image](https://hackmd.io/_uploads/rJA2VBjmJg.png) >[!Note] 查詢使用者UID、GID、GROUPS >```ubuntu1:~$ id 使用者名稱``` >![image](https://hackmd.io/_uploads/SJaR6BiX1g.png) >[!Important] 希望新的使用者也可以使用管理者權限 >將新的使用者的附屬群組加入 **sudo** >[!Caution] 存儲密碼訊息的位置 >**僅管理員可以讀取** >存放在``/etc/shadow`` (**有加密**) # SAMBA 伺服器 Linux 與 Windows 之間共享資料夾 ## 安裝 Samba 及其相關組件 `ubuntu1:~$sudo apt install samba samba-common -y` ## 設定 ``` 目標: 資料夾1 => 主要測試所有人都可以直接進入不需要打帳號密碼即可存取 資料夾2 => 主要測試需要輸入ubuntu 主機設定的sambs 帳號密碼才可以進入存取 ``` 1. 到根目錄下建立要進行分享的資料夾 ``` ubuntu1:/# mkdir 資料夾名稱1 ubuntu1:/# mkdir 資料夾名稱2 ``` 2. 確認分享的資料夾權限為777 ``` ubuntu1:/# ls -ld 資料夾名稱 ``` ![image](https://hackmd.io/_uploads/rygcXbCQkg.png) 3. 建立本機測試帳號 ``` ubuntu1:/# useradd 使用者名稱1 ubuntu1:/# useradd 使用者名稱2 ``` 4. 建立samba密碼 ``` ubuntu1:/# smbpasswd –a 使用者名稱1 ubuntu1:/# smbpasswd –a 使用者名稱2 ``` ![image](https://hackmd.io/_uploads/BJZI1W0X1x.png) 5. 編輯伺服器配置檔,配置檔位於 `/etc/samba/smb.conf`,加入下列程式碼 ``` [sharea] path = 資料夾1位置 comment = guest access folder writable = yes browseable = yes guest ok = yes [shareb] path = 資料夾2位置 comment = have auth can access writable = yes browseable = yes valid users=使用者名稱1,使用者名稱2 write list=使用者名稱1,使用者名稱2 ``` 6. 檢查 Samba 配置文件是否正確性 ``` ubuntu1~# testparm -s ``` ![image](https://hackmd.io/_uploads/ByvYfWC7yl.png) 7. 重啟 Samba 伺服器 `ubuntu1:~# systemctl restart smbd` 8. 在 **Windows** 檔案總管搜尋 `\\UbuntuIP` 即可看到設定分享的資料夾 ![image](https://hackmd.io/_uploads/rkopVZAm1x.png) 9. 測試在`sharea`中建立檔案 ![image](https://hackmd.io/_uploads/HkUlBZRQyl.png) `在 Ubuntu 中也可以看到該檔案` ![image](https://hackmd.io/_uploads/SywVHWCX1l.png) 10. 測試在`shareb`中建立檔案 `進入 shareb 需要進行身分驗證` ![image](https://hackmd.io/_uploads/B1XtBW0mkg.png) :::danger 刪除連線 cmd: net use * /delete ::: ## Linux 與 Linux 之間共享資料夾 ### 客戶端安裝 1. 安裝 **SambaCliebt** `ubuntu2:~# apt install smbclient -y` 2. 查看 Samba 伺服器共享的資料夾 `ubuntu2:~# smbclient --list=Samba Server IP --user=使用者名稱` ![image](https://hackmd.io/_uploads/S1Fj9C071g.png) 3. 連接共享資料夾 `ubuntu2:~$ smbclient --user=使用者名稱 //Samba Server IP/要連接的資料夾` ![image](https://hackmd.io/_uploads/r1ZM2CRmkx.png) >[!Note] 上傳檔案 >`smb: \> put 檔案` >![image](https://hackmd.io/_uploads/rks320CX1e.png) >[!Note] 下載檔案 >`smb: \> get 檔案` >![image](https://hackmd.io/_uploads/rkUGpCRQyg.png) # 架設 PPTP Server ## 安裝 `ubuntu1:~#apt install pptpd` ## 設定**PPTPD Server** 1. Ubunut: 1. 允許內網中的客戶端通過 **ens33** 網卡訪問外網 `ubuntu1:~# iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE` 2. 編輯 `/etc/ppp/chap-secrets`,加入以下內容 ```vim= "帳號" * "密碼" * ``` 3. 編輯 /etc/pptpd.conf ,設定要分配的 IP ```vim= localip 192.168.34.1 remoteip 192.168.34.2-200 ``` 2. Windows: 1. 在「網路和共用中心」,按下「設定新的連線或網路」 ![image](https://hackmd.io/_uploads/r1apwPr4kx.png) 2. 選擇連線到工作地點 ![image](https://hackmd.io/_uploads/H1xrdPH4kg.png) 3. 選擇使用我的網際網路連線 ![image](https://hackmd.io/_uploads/SynduvSNke.png) 4. 接著要填入要連線的 VPN Server IP `192.168.44.132` ![image](https://hackmd.io/_uploads/S1p9_vB4Jl.png) 5. 選擇剛建立的項目,按下連線 ![image](https://hackmd.io/_uploads/Skg-YDSNyg.png) 6. 輸入帳號密碼 ![image](https://hackmd.io/_uploads/SkzuFPHEyg.png) # 檢視系統資訊 ## 查看線上的使用者 1. w ``` pts: 使用ssh連線登入的 tty: 本地登錄伺服器 ``` ![image](https://hackmd.io/_uploads/S1Y2111Ekl.png) ``` 第一行: 當前時間:16:08:59 系統運行時間:up 1:14 登入用戶數:4 users 系統負載: 1. 1分鐘CPU平均負載:0.00 2. 5分鐘CPU平均負載:0.06 3. 15分鐘CPU平均負載:0.14 表格部分: USER:登入用戶名 TTY:終端名稱(如 pts/0 表示虛擬終端) FROM:用戶的來源 IP 或主機名 LOGIN@:用戶登入時間 IDLE:用戶閒置時間 JCPU:該終端執行的所有進程耗費的 CPU 時間 PCPU:當前進程耗費的 CPU 時間 WHAT:用戶正在執行的命令 ``` >[!Note] 增加負載查看`w`輸出變化 >`ubuntu1:~$ dd if=/dev/zero of=/dev/null` >![image](https://hackmd.io/_uploads/rJwY9kyNJe.png) 2. who `簡單地檢查用戶登入狀態` ![image](https://hackmd.io/_uploads/r1XQsJkEJl.png) 3. last `查看曾登入此系統之使用者` ![image](https://hackmd.io/_uploads/SygK4a1yNke.png) ## 顯示記憶體使用狀態 ### free #### 常用參數: -h :以易讀格式顯示內存(例如 KB, MB, GB,自動選擇合適單位) -t :顯示記憶體的總量(包括內存和交換區) -s :每隔指定秒數持續顯示內存狀態 -c :限制 -s 的輸出次數 ![image](https://hackmd.io/_uploads/H1sdhJyEJg.png) ## 查看系統資源的使用狀況 1. top `能顯示系統當前運行的process、CPU 和記憶體使用情況` ![image](https://hackmd.io/_uploads/S19H1xyN1g.png) ``` 常用快捷鍵: u: 僅顯示指定使用者的process k: 終止指定進程(需要輸入 PID)。 ``` # 網路實驗 ## 1. 由一台 Ubuntu 當路由器,連接另外兩客戶端 (客戶端需手動設置**IP**) 使得 H1 和 H2 雖然在不同的區域網,卻可以互相傳送封包 ### **架構圖** ![Router1](https://hackmd.io/_uploads/B1ea_7kVkx.png) ### **設定** 1. Router 1. 新增兩張網路卡,並設定不同的區域網 ![image](https://hackmd.io/_uploads/HyCX9Xk41l.png) ![image](https://hackmd.io/_uploads/HJSPjXkEJe.png) 2. 確認兩張網路卡名稱 ```vim= ens33: NAT ens37: LAN10 ens38 :LAN20 ``` ![image](https://hackmd.io/_uploads/Sk2AX4yEyl.png) 3. 設置 **ens37 IP** 為192.168.10.254 ```vim= R1:~# ip addr add 192.168.10.254/24 dev ens37 ``` >[!Tip] 也可使用圖形化介面進行設置 >![image](https://hackmd.io/_uploads/HkkUAEJVyl.png) 4. 設置 **ens38 IP** 為192.168.20.254 ```vim= R1:~# ip addr add 192.168.20.254/24 dev ens38 ``` >[!Tip] 也可使用圖形化介面進行設置 >![image](https://hackmd.io/_uploads/SyJnCVkN1g.png) 5. 確認 **IP** 設置 ![image](https://hackmd.io/_uploads/H11MBEkNyl.png) 6. 開啟路由器 ```vim= R1:~# echo 1 > /proc/sys/net/ipv4/ip_forward ``` >[!Tip] 修改配置檔固定網路卡IP >在`/etc/netplan/01-network-manager-all.yaml`加入下列程式碼 >```vim= ># Let NetworkManager manage all devices on this system >network: > version: 2 > renderer: NetworkManager > ethernets: > ens33: > dhcp4: true > ens37: > addresses: > - 192.168.10.254/24 > ens38: > addresses: > - 192.168.20.254/24 >``` >使用`R1:~# netplan try` 檢查配置檔是否有錯誤 >![image](https://hackmd.io/_uploads/r1k9BBJEJx.png) >使用`R1:~# netplan apply` 應用修改過後的配置 >![image](https://hackmd.io/_uploads/SJubLrJ4Jl.png) >[!Tip] 修改配置檔固定路由功能預設開啟 >在`/etc/sysctl.conf` 中,找到`net.ipv4.ip_forward=1`,將開頭的`#`刪除 >![image](https://hackmd.io/_uploads/rkKOUrJVyx.png) >使用`R1:~# sysctl -p /etc/sysctl.conf` 應用修改過後的配置 2. H1 1. 將網路卡設置為區域網:LAN10 ![image](https://hackmd.io/_uploads/SyZOTXkV1l.png) 2. 確認網路卡名稱 ```vim= H1:~# ifconfig ``` ![image](https://hackmd.io/_uploads/By9OyE1E1e.png) 3. 手動設置 **IP** 為192.168.10.1 ```vim= H1:~# ip addr add 192.168.10.1/24 dev ens33 ``` 4. 手動設置預設路由為192.168.10.254 ```vim= H1:~# ip route add default via 192.168.10.254 ``` 5. 確認 **IP** 和預設 **Router** 設置正確 ```vim= H1:~# ip route show ``` ![image](https://hackmd.io/_uploads/Hyy7m4JVJl.png) >[!Tip] 也可使用圖形化介面進行設置 >![image](https://hackmd.io/_uploads/SJpaaVyNye.png) >[!Tip] 修改配置檔固定網路卡IP >在`/etc/netplan/01-network-manager-all.yaml`加入下列程式碼 >```vim= ># Let NetworkManager manage all devices on this system >network: > version: 2 > renderer: NetworkManager > ethernets: > ens33: > addresses: > - 192.168.10.1/24 > routes: > - to: default > via: 192.168.10.254 >``` >使用`H1:~# netplan try` 檢查配置檔是否有錯誤 >![image](https://hackmd.io/_uploads/r1k9BBJEJx.png) >使用`H1:~# netplan apply` 應用修改過後的配置 >![image](https://hackmd.io/_uploads/HyWtuS1Nkx.png) 3. H2 1. 將網路卡設置為區域網:LAN20 ![image](https://hackmd.io/_uploads/rJ5KfNy4Je.png) 2. 確認網路卡名稱 ```vim= H2:~# ifconfig ``` ![image](https://hackmd.io/_uploads/rJ_izVJNkx.png) 3. 手動設置 **IP** 為192.168.20.1 ```vim= H2:~# ip addr add 192.168.20.1/24 dev ens33 ``` 4. 手動設置預設路由為192.168.20.254 ```vim= H2:~# ip route add default via 192.168.20.254 ``` 5. 確認 **IP** 和預設 **Router** 設置正確 ```vim= H2:~# ip route show ``` ![image](https://hackmd.io/_uploads/HJ4EzEJVye.png) >[!Tip] 也可使用圖形化介面進行設置 >![image](https://hackmd.io/_uploads/ryE-CNy4kl.png) >[!Tip] 也可使用圖形化介面進行設置 >![image](https://hackmd.io/_uploads/SJpaaVyNye.png) >[!Tip] 修改配置檔固定網路卡IP >在`/etc/netplan/01-network-manager-all.yaml`加入下列程式碼 >```vim= ># Let NetworkManager manage all devices on this system >network: > version: 2 > renderer: NetworkManager > ethernets: > ens33: > addresses: > - 192.168.20.1/24 > routes: > - to: default > via: 192.168.20.254 >``` >使用`H2:~# netplan try` 檢查配置檔是否有錯誤 >![image](https://hackmd.io/_uploads/r1k9BBJEJx.png) >使用`H2:~# netplan apply` 應用修改過後的配置 >![image](https://hackmd.io/_uploads/BkFRdBy4kl.png) ### 確認封包可以傳達 ![image](https://hackmd.io/_uploads/rkyLnEJVkg.png) ![image](https://hackmd.io/_uploads/HyFxnEkE1x.png) >[!Note] 網路卡設置 >1. 清除網路卡ip , network mask等設定 >`ifconfig 網路卡名稱 0` >2. 關閉網路卡 >`ifconfig 網路卡名稱 down` >3. 啟動網路卡 >`ifconfig 網路卡名稱 up` <a id="section-2"></a> ## 2. 由一台 Ubuntu 當路由器,連接另外兩台客戶端,加入**DHCP Server** ,使客戶端不需手動設置**IP** 使得 H1 和 H2 雖然在不同的區域網,卻可以互相傳送封包 ### **架構圖** ![Router1](https://hackmd.io/_uploads/B1ea_7kVkx.png) ### **設定** 1. Router 1. 新增兩張網路卡,並設定不同的區域網 ![image](https://hackmd.io/_uploads/HyCX9Xk41l.png) ![image](https://hackmd.io/_uploads/HJSPjXkEJe.png) 2. 確認兩張網路卡名稱 ```vim= ens33: NAT ens37: LAN10 ens38 :LAN20 ``` ![image](https://hackmd.io/_uploads/Sk2AX4yEyl.png) 3. 設置 **ens37 IP** 為192.168.10.254 ```vim= R1:~# ip addr add 192.168.10.254/24 dev ens37 ``` >[!Tip] 也可使用圖形化介面進行設置 >![image](https://hackmd.io/_uploads/HkkUAEJVyl.png) 4. 設置 **ens38 IP** 為192.168.20.254 ```vim= R1:~# ip addr add 192.168.20.254/24 dev ens38 ``` >[!Tip] 也可使用圖形化介面進行設置 >![image](https://hackmd.io/_uploads/SyJnCVkN1g.png) 5. 確認 **IP** 設置 ![image](https://hackmd.io/_uploads/H11MBEkNyl.png) 6. 開啟路由器 ```vim= R1:~# echo 1 > /proc/sys/net/ipv4/ip_forward ``` >[!Tip] 修改配置檔固定路由功能預設開啟 >在`/etc/sysctl.conf` 中,找到`net.ipv4.ip_forward=1`,將開頭的`#`刪除 >![image](https://hackmd.io/_uploads/rkKOUrJVyx.png) >使用`R1:~# sysctl -p /etc/sysctl.conf` 應用修改過後的配置 7. 安裝 DHCP Server ```vim= R1:~# apt install isc-dhcp-server -y ``` 8. 進行原始的**DHCP Server**配置檔備份,檔案在`/etc/dhcp/dhcpd.conf` ```vim= R1:~# cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.backup 9. 修改**DHCP Server**配置檔 ```vim= R1:~# vim /etc/dhcp/dhcpd.conf ``` 加入下列程式碼: ```vim= subnet 192.168.10.0 netmask 255.255.255.0 { range 192.168.10.1 192.168.10.100; option subnet-mask 255.255.255.0; option routers 192.168.10.254; option broadcast-address 192.168.10.255; default-lease-time 600; max-lease-time 7200; } subnet 192.168.20.0 netmask 255.255.255.0 { range 192.168.20.1 192.168.20.100; option subnet-mask 255.255.255.0; option routers 192.168.20.254; option broadcast-address 192.168.20.255; default-lease-time 600; max-lease-time 7200; } ``` 10. 重啟**DHCP Server** ```vim= R1:~# systemctl restart isc-dhcp-server 2. H1 `未開啟網路卡連接時:` ![image](https://hackmd.io/_uploads/B1p8tGgVyx.png) `開啟網路卡連接時:` (自動分配**IP**) ![image](https://hackmd.io/_uploads/HyZ9tfxV1g.png) 3. H2 `未開啟網路卡連接時:` ![image](https://hackmd.io/_uploads/BJU0YGgEJg.png) `開啟網路卡連接時:` (自動分配**IP**) ![image](https://hackmd.io/_uploads/ByRycfgN1g.png) ### 確認封包可以傳達 ![image](https://hackmd.io/_uploads/rJcV9feEkg.png) ![image](https://hackmd.io/_uploads/S1wLqzxNJg.png) ## 3. 由一台 Ubuntu 當路由器,連接另外兩台客戶端,一台在`private network`,另一台在`public network`,加入**DHCP Server** ,使客戶端不需手動設置**IP** [設置參考第二部分](#section-2),僅**Router**需多加設定 ### **架構圖** ![未命名](https://hackmd.io/_uploads/S1AZlVe4yl.png) ### Router 1. 允許內網(192.168.10.0/24)中的客戶端通過 **ens38** 網卡訪問外網 ```vim= R1:~# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens38 -j MASQUERADE ``` ### 查看封包 1. 安裝 **wireshark** ```vim= R1:~# apt install wireshark-* ``` 2. 執行 **wireshark** ```vim= R1:~# wireshark ``` ![image](https://hackmd.io/_uploads/SyaqFXeVkx.png) 3. 檢查封包 1. 抓取通過**ens38**網卡的封包 `H1傳送封包給H2` ![image](https://hackmd.io/_uploads/B1m95XeVyl.png) `可以發現 Source 的 IP 被更改,保護(192.168.10.0/24)中的客戶端` ![image](https://hackmd.io/_uploads/SyDucmgVkg.png) 2. 抓取通過**ens37**網卡的封包 `可以發現 Source 的 IP 沒有被更改` ![image](https://hackmd.io/_uploads/SJrZhmlNkg.png) ## 4. 靜態路由拓樸 ### **架構圖** ![1](https://hackmd.io/_uploads/SJqBtKlVJx.png) ### **設定** [設置參考第二部分](#section-2),使用**DHCP Server** 為`H1`和`H2`自動分配**IP** 1. Router1: 1. 設定`ens37` 和`ens38` 兩張網路卡IP ![image](https://hackmd.io/_uploads/r1hqiKlVJl.png) 2. 確認路由功能開啟 (1為開啟狀態) `R1:~# cat /proc/sys/net/ipv4/ip_forward` ![image](https://hackmd.io/_uploads/Skmfk9gEke.png) 3. 查看路由表 `R1:~# route -n` ![image](https://hackmd.io/_uploads/BJ-kZqxVyg.png) 4. 檢測`R1`和`H1`之間的網路連通性 `H1:~# ping 192.168.10.254` ![image](https://hackmd.io/_uploads/r119b5eNkg.png) `H1:~# ping 12.1.1.1` ![image](https://hackmd.io/_uploads/B1b2Z5gVkl.png) 5. 檢測`H2`和`R1`之間的網路連通性,因為`H2`和`R1`不在同個區域往內,所以需要經由`R2`將封包轉發到`R1` `H2:~# ping 12.1.1.1` ![image](https://hackmd.io/_uploads/B1GdV9eVke.png) >[!Important] H2 和 R1 之間的網路不連通 >因為此時`R1`的路由表中並沒有可以到達`192.168.20.0/24`的紀錄,所以`R1`沒辦法回應`H2`,所以需要在`R1`的路由表中加入`192.168.20.0/24` 並將封包轉發給`R2` >`R1:~# ip route add 192.168.20.0/24 via 12.1.1.2` >**再次查看路由表** >![image](https://hackmd.io/_uploads/HyHVw9lNJg.png) 6. 再次檢測`H2`和`R1`之間的網路連通性 `H2:~# ping 12.1.1.1` ![image](https://hackmd.io/_uploads/BkjDPcxVke.png) 2. Router2: 1. 設定`ens37` 和`ens38` 兩張網路卡IP ![image](https://hackmd.io/_uploads/SyP72YgNkg.png) 2. 確認路由功能開啟 (1為開啟狀態) `R2:~# cat /proc/sys/net/ipv4/ip_forward` ![image](https://hackmd.io/_uploads/SybH1ql4Je.png) 3. 查看路由表 `R2:~# route -n` ![image](https://hackmd.io/_uploads/HJAeb5g4kg.png) 4. 檢測`R2`和`H2`之間的網路連通性 `H2:~# ping 192.168.20.254` ![image](https://hackmd.io/_uploads/ByyeucgEyx.png) `H2:~# ping 12.1.1.` ![image](https://hackmd.io/_uploads/HJlVWu5gN1l.png) 5. 檢測`H1`和`R2`之間的網路連通性,因為`H1`和`R2`不在同個區域往內,所以需要經由`R1`將封包轉發到`R2` `H1:~# ping 12.1.1.2` ![image](https://hackmd.io/_uploads/S1q4OcxV1l.png) >[!Important] H1 和 R2 之間的網路不連通 >因為此時`R2`的路由表中並沒有可以到達`192.168.10.0/24`的紀錄,所以`R2`沒辦法回應`H1`,所以需要在`R2`的路由表中加入`192.168.10.0/24` 並將封包轉發給`R1` >`R2:~# ip route add 192.168.10.0/24 via 12.1.1.1` >**再次查看路由表** >![image](https://hackmd.io/_uploads/ryeq_cgVke.png) 6. 再次檢測`H1`和`R2`之間的網路連通性 `H1:~# ping 12.1.1.2` ![image](https://hackmd.io/_uploads/SJ02dclV1e.png) ### 確認封包可以傳達 1. H1 `H1:~#ping 192.168.10.254` ![image](https://hackmd.io/_uploads/H1v89clV1l.png) `H1:~#ping 12.1.1.1` ![image](https://hackmd.io/_uploads/ByQ_9qxNJg.png) `H1:~#ping 12.1.1.2` ![image](https://hackmd.io/_uploads/H1PFc9e4kx.png) `H1:~#ping 192.168.20.254` ![image](https://hackmd.io/_uploads/rk_cccx4Jx.png) `H1:~#ping 192.168.20.1` ![image](https://hackmd.io/_uploads/SJss9cxNkx.png) 2. H2 `H2:~#ping 192.168.20.254` ![image](https://hackmd.io/_uploads/H1TJjceE1l.png) `H2:~#ping 12.1.1.2` ![image](https://hackmd.io/_uploads/ryMWo9g4ye.png) `H2:~#ping 12.1.1.1` ![image](https://hackmd.io/_uploads/H1Wmj5l4kg.png) `H2:~#ping 192.168.10.254` ![image](https://hackmd.io/_uploads/B1GNsclNkx.png) `H2:~#ping 192.168.10.1` ![image](https://hackmd.io/_uploads/HJeBo9lV1e.png) ## 5. 靜態路由拓樸,一台在`private network`,另一台在`public network`,並使用`DNAT`,將外部請求引導到內部伺服器時使用 ### **架構圖** ![未命名](https://hackmd.io/_uploads/H1vKMoWN1l.png) ### **設定** [設置參考第二部分](#section-2),使用**DHCP Server** 為`H1`和`H2`自動分配**IP** 1. Router1: 1. 設定`ens37` 和`ens38` 兩張網路卡IP ![image](https://hackmd.io/_uploads/r1hqiKlVJl.png) 2. 確認路由功能開啟 (1為開啟狀態) `R1:~# cat /proc/sys/net/ipv4/ip_forward` ![image](https://hackmd.io/_uploads/Skmfk9gEke.png) 3. 查看路由表 `R1:~# route -n` ![image](https://hackmd.io/_uploads/BJ-kZqxVyg.png) 4. 檢測`R1`和`H1`之間的網路連通性 `H1:~# ping 192.168.10.254` ![image](https://hackmd.io/_uploads/r119b5eNkg.png) `H1:~# ping 12.1.1.1` ![image](https://hackmd.io/_uploads/B1b2Z5gVkl.png) 5. 檢測`H2`和`R1`之間的網路連通性,因為`H2`和`R1`不在同個區域往內,所以需要經由`R2`將封包轉發到`R1` `H2:~# ping 12.1.1.1` ![image](https://hackmd.io/_uploads/B1GdV9eVke.png) >[!Important] H2 和 R1 之間的網路不連通 >因為此時`R1`的路由表中並沒有可以到達`192.168.20.0/24`的紀錄,所以`R1`沒辦法回應`H2`,所以需要在`R1`的路由表中加入`192.168.20.0/24` 並將封包轉發給`R2` >`R1:~# ip route add 192.168.20.0/24 via 12.1.1.2` >**再次查看路由表** >![image](https://hackmd.io/_uploads/HyHVw9lNJg.png) 6. 再次檢測`H2`和`R1`之間的網路連通性 `H2:~# ping 12.1.1.1` ![image](https://hackmd.io/_uploads/BkjDPcxVke.png) 7. 將通過 `ens38`的封包源地址轉換為 `R1` 的 `ens38` 地址,去讓在私有網路裡的`H1`,也可以訪問公開網路 `R1:~# iptables -t nat -A POSTROUTING -o ens38 -j MASQUERADE` ![image](https://hackmd.io/_uploads/SkTDPsW41e.png) 8. 將發往 12.1.1.1:80 的流量轉發到內部伺服器 192.168.10.1:80 `R1:~# iptables -t nat -A PREROUTING -p tcp -d 12.1.1.1 --dport 80 -j DNAT --to-destination 192.168.10.1:80` ![image](https://hackmd.io/_uploads/HJqaVhW4kx.png) 2. Router2: 1. 設定`ens33` 和`ens37` 兩張網路卡IP ![image](https://hackmd.io/_uploads/BJzJds-Ekl.png) 2. 確認路由功能開啟 (1為開啟狀態) `R2:~# cat /proc/sys/net/ipv4/ip_forward` ![image](https://hackmd.io/_uploads/SybH1ql4Je.png) 3. 查看路由表 `R2:~# route -n` ![image](https://hackmd.io/_uploads/rkEmui-Ekl.png) 4. 因為`H1`和`R2`不在同個區域往內,所以無法連接 ![image](https://hackmd.io/_uploads/S1ocOoWVyx.png) # Shell Script 程式設計 ## 基礎指令與功能 1. echo 1. 表達特殊字元,如跳行、tab等 * 無法表達特殊字元 ```vim= ubuntu1:~$ echo "hi\n123" ``` ![image](https://hackmd.io/_uploads/BJN2XVgEJg.png) * 表達特殊字元需加參數:`-e` ```vim= ubuntu1:~$ echo -e "hi\n123" ``` ![image](https://hackmd.io/_uploads/ByteVVx4Jg.png) 2. 查看上一個指令是否執行成功 `指令執行後,必定會回傳一個「結束狀態碼」` 1. 結束狀態碼為0: 指令正常結束 ![image](https://hackmd.io/_uploads/S1P5nDgEJl.png) 2. 結束狀態碼為非0: 指令錯誤或不正常結束 ![image](https://hackmd.io/_uploads/rk9u3veEkl.png) 2. 環境變數 `ubuntu1:~$ echo $變數` 印出變數 1. HOME: 目前使用者的家目錄 ![image](https://hackmd.io/_uploads/rkLa8VxVke.png) 2. IFS: 用來分隔欄位的字元清單 (預設為空白鍵) ![image](https://hackmd.io/_uploads/rkWyDNgEyl.png) 3. PATH: 用分號分隔的一連串目錄,代表執行指令時的搜尋路徑清單 ![image](https://hackmd.io/_uploads/BkteDIe4yx.png) >[!Note] 範例: 在`PATH`中加入新的路徑 (當前視窗有效) >```vim= >ubuntu1:~$ export PATH=$PATH:/home/user/shelltest >ubuntu1:~/shelltest$ hello.sh >``` >![image](https://hackmd.io/_uploads/B1VoO8eEkl.png) >[!Note] 範例: 在`PATH`中加入新的路徑 (永久) >修改配置檔`/home/user/.bashrc`,加入下列程式碼 >```vim= >export PATH=$PATH:/home/user/shelltest >``` >重新加載 >```vim= >ubuntu1:~$ source .bashrc >or >ubuntu1:~$ . .bashrc >``` >![image](https://hackmd.io/_uploads/Hk3poIe4Jl.png) 4. USER: 目前使用者帳號名稱 5. UID: 目前使用者的uid 6. HISTFILE: 儲存下過的指令清單的檔案位置 >[!Note] history >顯示曾經用過的指令 >![image](https://hackmd.io/_uploads/H1oOALeVJx.png) >**使用:** >`ubuntu1:~$ !11` >![image](https://hackmd.io/_uploads/HyiRALlEyx.png) 7. RANDOM: 每次取得變數資料,都會給一個0到32767的亂數 `ubuntu1:~$ echo $RANDOM` ![image](https://hackmd.io/_uploads/ryOJVwgNkg.png) :::success 常用搭配: 1. md5sum: `計算 MD5 哈希值` `ubuntu1:~$ echo 'hello world' | md5sum` ![image](https://hackmd.io/_uploads/B1avmDgVkg.png) 2. cut `提取部分內容` `ubuntu1:~$ echo 'hello world' | cut -c 1-5` ![image](https://hackmd.io/_uploads/r15zmweNJl.png) 3. 合併使用: `產生固定長度的亂碼` `ubuntu1:~$ echo $RANDOM | md5sum | cut -c 1-5` ![image](https://hackmd.io/_uploads/rJ-K4we41e.png) ::: >[!Note] env 或 set >`env`顯示當前 shell 的所有環境變數及其值 >![image](https://hackmd.io/_uploads/B1mDTLlEJg.png) >`set`顯示當前 shell 的所有環境變數及其值,比`env`更詳細 >![image](https://hackmd.io/_uploads/Byf0TUlVJl.png) 3. 取得使用者輸入變數值 `read` **範例:** ```vim= #!/usr/bin/bash read -p "Enter your name: " name echo "Welcome, $name!" ``` ![image](https://hackmd.io/_uploads/HyhRBwxVJg.png) 4. 單引號與雙引號 * 單引號: 當文字內容不需特別解譯或是單純的一段文字時 * 雙引號: 文字內容中若需要解譯變數(如$USER)以顯示變數的內容 ![image](https://hackmd.io/_uploads/r1jq8DeV1x.png) 5. 條件判斷: `test` 1. 檔案相關測試 ```vim= -d 檔案: 測試檔案是否為目錄? -e 檔案: 測試檔案是否存在 -r 檔案: 測試檔案是否可讀? -w 檔案: 測試檔案是否可寫入? -x 檔案: 測試檔案是否可執行? -L 檔案: 測試檔案是否為連結(link) ? ``` 2. 字串測試 ```vim= -z 字串: 測試字串長度是否為0(空字串)? 字串 = 字串: 測試等號左右邊字串是否相等? 字串 != 字串: 測試等號左右邊字串是否不相等? ``` ![image](https://hackmd.io/_uploads/H1WMfdeE1e.png) 3. 數值比較測試 ```vim= n1 -eq n2 : 測試n1等於n2 n1 -ne n2 : 測試n1不等於n2 n1 -ge n2 : 測試n1大於等於n2 n1 -gt n2 : 測試n1大於n2 n1 -le n2 : 測試n1小於等於n2 n1 -lt n2 : 測試n1小於n2 ``` ![image](https://hackmd.io/_uploads/S1pd7_lVke.png) 6. 接受命令列的參數 `利用$1 $2 $3等取得第一個、第二個、等三個等參數值 ` ```vim= n1=$1 n2=$2 echo $n1 echo $n2 test $n1 -gt $n2 echo $? ``` ![image](https://hackmd.io/_uploads/HyX38dxEyl.png) >[!Tip] `bash -x` 用於執行腳本時顯示命令的執行過程 >![image](https://hackmd.io/_uploads/rJp7DueE1e.png) 7. 判斷式 ```vim= if test 條件 then 結果為真執行的命令 else 結果為假執行的命令 fi ``` ![image](https://hackmd.io/_uploads/Hk4N9Ox4yl.png) 8. for迴圈 ```vim= for 變數 in 資料集合 do 要重複的指令 done ``` 1. 印出1~10 ![image](https://hackmd.io/_uploads/ByuxoueV1l.png) 2. 印出指定目錄下的所有檔案 ![image](https://hackmd.io/_uploads/Bk3rK2WEyl.png) 3. 印出指定目錄下的子目錄 ![image](https://hackmd.io/_uploads/S1qwq3ZNke.png) ## 範例 1. 使用腳本安裝 ```vim= #!/usr/bin/bash if test $UID -ne 0 then echo "change to root first" exit 0 fi ans=`dpkg -l | grep $1 | wc -l` if test $ans -ne 0 then echo "$1 has already been installed" exit 0 fi apt install apache2 -y 2>&1 > /dev/null result=`echo $?` if test $result -eq 0 then echo "$1 has been installed successfully" fi ``` ![image](https://hackmd.io/_uploads/ByGUAnZ4Je.png) # 排程 ## 格式 | * | * | * | * | * | 指令 | | - | - | - | - | - | - | | 分 | 時 | 日 | 月 | 星期 | | | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 (0 = 星期日) | | ### 範例 1. `1 * * * * 指令` 每小時的第一分鐘執行一次 2. `* * * * * 指令` 每時每分都執行一次 3. `*/n * * * * 指令` 每小時的第n分鐘執行一次 4. `1 1 * * * 指令` 每天的1點1分執行一次 5. `* 1 * * * 指令` 每天1點的每分鐘執行一次 6. `20 2 1,15 * * 指令` 每月的1號和15號的2點20分執行一次 7. `0 7,21 * * * 指令` 每天的7點和21點 執行一次 8. `0 1-4 * * * 指令` 每天的1點到4點執行一次 ### 編輯使用者的排程表 1. `ubuntu1:~# crontab -e` 2. 選擇`2`使用 `vim` ![image](https://hackmd.io/_uploads/rJmuIPgrkg.png) 3. 加入範例程式`*/1 * * * * date >> /tmp/mytime` `每1分鐘將最新的時間加入 /tmp/mytime` 4. 讀取 `/tmp/mytime`,使用 `ubuntu1:~# tail -f /tmp/mytime` ,即時的讀取新加入`/tmp/mytime` 的時間 ![image](https://hackmd.io/_uploads/BkFQkdlS1g.png) ### 檢視目前排程的工作 `ubuntu1:~# crontab -l` ![image](https://hackmd.io/_uploads/rycZGuxBkx.png) ### 刪除排程的工作 `ubuntu1:~# crontab -r` ![image](https://hackmd.io/_uploads/rkprMOlSJg.png) ### 指定某個使用者 `ubuntu1:~# crontab -u 使用者名稱` ## 用於執行一次性任務 `at` 1. 設定執行時間 `at 時間` 2. 進入交互模式,輸入指令,輸入`EOT`或是`ctrl + D`後結束 ![image](https://hackmd.io/_uploads/rJ1ELOeByx.png) ### 查看排程 `ubuntu1:~# atq` ![image](https://hackmd.io/_uploads/HyFlwOlHkg.png) ### 刪除排程 `ubuntu1:~$ atrm 工作編號` ![image](https://hackmd.io/_uploads/S1kHDuxHJx.png) # 打包檔案 ## tar 指令的參數 1. `-c:建立一個新的 tar 檔` 2. `-v:顯示運作過程的資訊` 3. `-f:指定檔案名稱` 4. `-z:呼叫 gzip 壓縮指令執行壓縮、解壓縮` 5. `-j:呼叫 bzip2 壓縮指令執行壓縮、解壓縮` 6. `-t:檢視壓縮檔案內容` 7. `-x:解開 tar 檔` ### 範例 1. 壓縮: `ubuntu1:~# tar -cvzf 打包後檔名 要打包的檔案` ![image](https://hackmd.io/_uploads/Hyhx6_lryx.png) ![image](https://hackmd.io/_uploads/HJlo2_xBke.png) 2. 解壓縮: `ubuntu1:~# tar -xvzf 要解壓縮的檔名` ![image](https://hackmd.io/_uploads/Bk5K6OxBye.png) ![image](https://hackmd.io/_uploads/Hkw56ugr1g.png) # **補充** :::spoiler dpkg -l 軟體套件管理程式 參數:-l 以清單方式呈現 ::: :::spoiler netstat -tunlp 查詢網路狀態 參數: 1. t:tcp 2. u:udp 3. n:not resolve 4. l:listen 5. p:process ::: :::spoiler 0.0.0.0 意義: 1. 伺服器端:任意介面 2. 客戶端:任一個節點 3. 一般PC:尚未取得IP ::: :::spoiler touch file 產生一個名為file的空白檔案 ![image](https://hackmd.io/_uploads/Sys-4QD7kl.png) ::: :::spoiler touch a{00..99}.txt 產生大量的空白檔 ![image](https://hackmd.io/_uploads/ry4CPmDm1x.png) ::: :::spoiler ubuntu2去代替IP位置 將ubuntu2IP加進配置檔裡 ubuntu1:~#vim /etc/hosts ![image](https://hackmd.io/_uploads/SkGTUQDmJg.png) ::: :::spoiler Hydra 1. 安裝Hydra ubuntu1:~$ sudo apt install hydra 2. 建立一個常見帳號的文字檔或上網抓 3. 建立一個常見密碼的文字檔或上網抓 ![image](https://hackmd.io/_uploads/SkfX6XDm1l.png) 4. 進行攻擊 ubuntu1:~$ hydra -L user.txt -P passwd.txt ssh://ubuntu2 ![image](https://hackmd.io/_uploads/Bk0Q0XD71g.png) :::danger 參數: 1. -L:使用者帳號檔案來源 2. -P:使用者密碼檔案來源 ::: :::spoiler 當編輯檔案權限不夠 **暫時提升權限** ubuntu1:~$ sudo bash -c 'echo hi > hi.htm' ![image](https://hackmd.io/_uploads/rkqXM2Fm1x.png) ::: :::spoiler 在vim編輯器中顯示行數 **在命令模式下輸入**: set number ![image](https://hackmd.io/_uploads/SkTDQ3tX1l.png) ::: :::spoiler John the Ripper 進行密碼破解 1. 先更新 apt ```ubuntu1:~$ sudo apt update``` 2. 安裝**snapd** ```ubuntu1:~$ sudo apt install snapd``` 3. 安裝**John the Ripper** ```ubuntu1:~$ sudo snap install john-the-ripper``` 4. 安裝**john** ```ubuntu1:~$ sudo apt install john``` 5. 準備一個密碼檔去破解 6. 把 **/etc/passwd** 和 **/etc/shadow** 合併到**mypasswd.txt** ```ubuntu1:~# unshadow /etc/passwd /etc/shadow > mypasswd.txt``` 7. 進行破解 ```ubuntu1:~# john --wordlist=準備的密碼檔 --format="crypt" mypasswd.txt``` ![image](https://hackmd.io/_uploads/S1dQoBsmkg.png) ::: :::spoiler 使用腳本程式新增大量使用者範例 1. 編輯 useradd.sh 加入下列程式碼 ``` #!/usr/bin/bash groupadd student for user in user1 user2 user3 do useradd -g student -d /home/${user} ${user} echo "${user}:${user}" | chpasswd echo "${user} is added" done ``` 2. 將 useradd.sh 新增可執行權限 ```ubuntu1:~$ chmod +x useradd.sh``` 3. 執行 useradd.sh ```ubuntu1:~# ./useradd.sh``` ![image](https://hackmd.io/_uploads/Hk-A8UjX1e.png) ::: :::spoiler 查看目錄的權限 ```ubntu1:~$ ls -ld 目錄名稱``` 查看目錄的權限 ```ubntu1:~$ ls -l 目錄名稱``` 查看目錄內檔案的權限 ::: :::spoiler 單人模式-忘記root密碼可以進入此模式修改 1. 修改 **/etc/default/grub** ,去延長開機選單的時間 將 **GRUB_TIMEOUT_STYLE** 和 **GRUB_TIMEOUT** 修改為 `GRUB_TIMEOUT_STYLE=menu` `GRUB_TIMEOUT=5` 2. 更新選單檔案 `ubuntu:~$ sudo update-grub` 3. 重開機後按下 **e** 進入選單 ![image](https://hackmd.io/_uploads/ryFZSY3Q1e.png) 4. 加上`rw init=/bin/bash` ![image](https://hackmd.io/_uploads/r1PtSFhXke.png) 5. 按`Ctrl + x` 或按`F10` 啟動系統,即可進入單人模式 ![image](https://hackmd.io/_uploads/HyJD8F3Xke.png) 6. 更改密碼 `passwd root` ::: :::spoiler 查看某用戶的進程(process) `ubuntu1:~# ps -u 使用者名稱` ![image](https://hackmd.io/_uploads/Sk7iwtn7kx.png) `ps 常用參數:aux 顯示所有進程,並附加 CPU 和內存使用率信息` ::: :::spoiler 結束進程(process) `ubuntu1:~# kill PID` >[!Caution] 強制結束進程(process) >`ubuntu1:~# kill -9 PID` >範例: 強制結束一個包含for迴圈的進程 >1. 執行腳本 >`ubuntu1:~$ ./for.sh` >![image](https://hackmd.io/_uploads/H1pJQl1Vyl.png) >2. 查詢該進程的PID (PID = 3533 : 這個是腳本本身) >![image](https://hackmd.io/_uploads/HkIXmlyEJe.png) >3. 結束`for.sh` >![image](https://hackmd.io/_uploads/SJSYme1Vyg.png) ::: :::spoiler 移除使用者帳號與檔案 1. 找出使用者所有的進程(process) `ubuntu1:~# ps -u 使用者名稱` 2. 強制結束所有進程(process) `ubuntu1:~# kill -9 PID` 3. 找到使用者所有檔案並刪除 `ubuntu1:~# find / -u 使用者名稱 -print -exec rm -rf {} \;` 4. 刪除帳號 `ubuntu1:~# userdel 使用者名稱` ::: :::spoiler grep排除不符合的 加上`-v` ![image](https://hackmd.io/_uploads/S1N1rgJEyl.png) ::: :::spoiler pkill `根據進程名稱或其他條件終止進程的命令` ![image](https://hackmd.io/_uploads/BJitDl141e.png) ::: :::spoiler DNS 配置問題 `apt` 安裝或更新軟體包時無法解析某些網址 **更新 DNS 配置** 編輯 `/etc/resolv.conf`,加入下列程式碼 ```vim= nameserver 8.8.8.8 ``` ::: :::spoiler 重新選擇 `crontab` 編輯器 ```vim= ubuntu1:~# select-editor ``` ::: :::spoiler 將輸入的文字附加到檔案中,直到輸入結束文字才停止(結束文字不會附加到檔案中) `cat > 檔案 <<結束文字` ![image](https://hackmd.io/_uploads/HkhrNuxS1x.png) :::