---
# System prepended metadata

title: 1141 LSA-I 期中檢討 - 上機題

---

# 1141 LSA-I 期中檢討 - 上機題（78 分）

這三台機器分別是：
- Firewall 同時身兼 Gateway、Router
    - 對外網路（能夠一路通到 internet）
    - DMZ 網路（對外提供服務的伺服器會放在這裡）
        - 這個網段裡包含了 192.168.29.135/28 這個 IP
        - Firewall 的網卡用的是這個網段的「最後一個可用 IP」
    - LAN 公司內網（員工的電腦 PC 在這裡）
        - 包含 PC 用的 172.21.21.121
- Server 網段裡包含了 192.168.29.135/28 這個 IP
    - Server 的網卡用的是這個網段的「第一個可用 IP」
- PC 的 IP 172.21.21.121

![LSA 1141 - midterm - infra.drawio](https://hackmd.io/_uploads/SkT6aG3gZg.png)


:::warning
Firewall 上：對 DMZ 和 LAN 的網卡預設設定是錯的
:::

## 一、基礎建設與網路連通 (Infrastructure & Network)（9 分）

1. 請將 Firewall
的網卡設定好，讓 Firewall 主機能 ping 到外網、server、pc
### 對外的網卡
DHCP 分配，不用額外寫
### 對 DMZ 的網卡：
因為網段裡包含了 192.168.29.135/28
可以得知此段的網路位址為 192.168.29.128
- 第一個可用為 192.168.29.129
- 最後一個可用為 192.168.29.142
:::success
算法：\
`192.168.29.135`\
換成二禁制\
`11000000 10101000 00011101 10000111`\
跟遮罩 (/28) 做 AND\
`11111111 11111111 11111111 11110000`\
得到網路位址\
`11000000 10101000 00011101 10000000`\
換成十進位為\
`192.168.29.128`
:::

所以題目說 FW 裡對 server 1 (DMZ) 的那張網卡的描述是，該網段最後一個可用的 ip，因此要再設定檔裡設定 192.168.29.142/28

同時題目也有說 server 1 (DMZ) 的 ip 為此網段第一個可用 ip，在網卡設定完後要連 ssh 的話要連 192.168.29.129 這個 ip


### 對 LAN 的網卡
題目已經給了 pc 1 說明該往段內包含了 500 多個 ip 可以先用直覺想 /24 有 254 個可用 ip，所以遮罩退一位，可用 ip 數量就會加倍 (500多個)，因此可以得知遮罩是 /23
:::success
算法：\
`172.21.21.121`\
轉成二進制\
`10101100 00010101 00010101 01111001`\
跟遮罩 (/28) 做 AND\
`11111111 11111111 11111110 00000000`\
得到網路位址\
`10101100 00010101 00010100 00000000`\
換成十進位為\
`172.21.20.0`
:::
可以得知此段的網路位址為 172.21.20.0
- 第一個可用為 172.21.20.1
- 最後一個可用為 172.21.21.255

所以題目說 FW 裡對 PC 1 的那張網卡的描述是，該網段的第一個可用 ip，因此要再設定檔裡設定 172.21.20.1/23

設定完再用 ssh 連題目給的 172.21.21.121

---


```
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: true
    enp0s8:
      addresses:
        - 192.168.29.142/28
    enp0s9:
      addresses:
        - 172.21.20.1/23
```

2. 請將三台主機的名稱設定完成（3 分）
:::success
- `sudo hostnamectl set-hostname {new-server-name}`
- `hostname` 會印出當前的 hostname
- 到 /etc/hosts 裡，把 127.0.1.1 把後面改成新的 hostname
:::
3. 能夠成功從 Firewall ssh 連上 server、pc（2 分）
:::warning
![](https://hackmd.io/_uploads/B1EerP0ba.png)
:::

:::success
`ssh-keygen -f "/home/{username}/.ssh/known_hosts" -R "192.168.29.129"`
:::


## 二、SSH（10 分）
1. 每次 ssh 時都要輸入密碼太麻煩了。請設定成 Firewall ssh 到 server 時不需要輸入密碼登入（讓 ssh 能用其他方式自動驗證）（2 分）
:::success
設定金鑰登入
:::
2. 每次 ssh 時都要打帳號、ip 等等太麻煩了。請設定預設使用者家目錄中的某個設定檔，讓預設使用者從 Firewall ssh 到 server 時只要輸入 `ssh srv` 就能自動帶入使用者名稱、位置等，正確成功連線到 server 裡（包含自動登入）。（2 分）
:::success
編輯 `~/.ssh/config`
```conf=
# ~/.ssh/config
Host srv
    User {username}
    HostName 192.168.29.129
    Port 22
```
:::
3. 修改 server 的 ssh service 設定，不允許使用者用密碼登入。（2 分）
:::success
- `/etc/ssh/sshd_config`
- `PasswordAuthentication no`
:::
4. server 無法連到 pc，但是 server 能 ssh 連到 firewall 、 firewall 可以連到 pc，而且你有 Firewall 的帳密。請試著建立神秘的通道在 server 的 port 22222，讓連到 server port 22222 時會通到 pc 的 port 22。（4 分）
:::success
- 在 server 上執行 `ssh -L 22222:172.21.21.121:22 {username}@192.168.29.142`
- 開另一個 terminal `ssh -p 22222 {username}@localhost`
:::

## 三、帳號設定與檔案操作（10 分）

1. 在 pc 上新增使用者 lsa 與 fasshy（1 分）
    - lsa 並且加入具有 sudo 權限的群組，讓 lsa 這個使用者也有 sudo 權限。
:::success
- `sudo useradd lsa`
- `sudo usermod -aG sudo lsa`
- `groups lsa`
:::
2. 在 pc 上建立一個目錄 /opt/project/
    1. 這個目錄的權限（依照最小權限原則）（3 分）
        - 只有預設使用者以及 root 權限的人可以讀、寫、執行
        - 預設使用者、lsa、fasshy 三人都在的群組成員可以讀、執行
    :::success
    - 建立群組，加三個人進去
    - `chown $USER:projectgrp /opt/project`
    - `sudo chmod 750 /opt/project`
    :::
    2. 這個目錄下有個檔案 data.txt（3 分）
        - 第一行內容是：系統紀錄檔 syslog 檔案的第一行
        - 第二部份內容是：根目錄底下所有（且只有） s 開頭的資料夾名稱
        - 須完全使用指令操作產生，而不是用編輯器編輯內容
    :::success
    - `sudo head -n 1 /var/log/syslog > data.txt`
    - `ls -d /s* >> data.txt`
    :::
    3. 在這個目錄裡建立一個 hard link `data_hard` 到 data.txt，以及一個 soft link (symbolic link, symlink) `data_soft` 到 data.txt（1 分）
    :::success
    - `sudo ln /opt/project/data.txt /opt/project/data_hard`
    - `sudo ln -s /opt/project/data.txt /opt/project/data_soft`
    :::
3. 將 data.txt 用 sftp 傳到 Firewall 上預設使用者家目錄中的 ~/project/ 裡（1 分）
:::success
- `sftp {username}@192.168.29.142`
- `cd project`
- `put /opt/project/data.txt`
:::
4. 在 Firewall 上用 scp 將這個 data.txt 傳到 server 的 /var/www/html 裡（1 分）
:::success
`scp ~/project/data.txt serveruser@192.168.29.129:/var/www/html/`
:::
## 四、DMZ Security Architecture（10 分）

請在「最小存取權限」原則下作答。

提示：（隱形通道）當說「不能連線」時，意思是「不能主動連線」，但允許 ESTABLISHED 與 RELATED 等封包回傳（Stateful inspection）。

1. Firewall 可以連到 DMZ 與 LAN 的任何地方
:::success
先到 firewall (NAT 主機) 裡面，開啟 Linux 轉發封包的功能
```
sudo vim /etc/sysctl.conf
#net.ipv4.ip_forward=1    <--解開這行
載入設定
sudo sysctl -p
```
在 nat POSTROUTING chain 上面加
```
sudo iptables -t nat -I POSTROUTING -o enp0s3 -j MASQUERADE
```
:::
2. 外網
    - 如果連到 Firewall 的 port 80 ，會自動被轉送到 server 的 port 80
    - 不能直接連線 LAN
:::success
允許外網經由 DNAT 進來，轉到 DMZ 的 server:80\
`iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 80 -j DNAT --to-destination 192.168.29.129:80`
:::
3. DMZ
    - 可以 ping (icmp) 到外網任何地方
    - 可以連到外網的 8.8.8.8 dns、163.22.17.70 (ftp.ubuntu-tw.org) http
        - 不能連外網其他地方
    - 不能直接連線 LAN
:::success
DMZ 可以 ping 外網\
`iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -p icmp --icmp-type echo-request -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT`


DMZ → 8.8.8.8 DNS (UDP/TCP 53)\
`iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 8.8.8.8 -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT`\
`iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 8.8.8.8 -p tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT`

DMZ → 163.22.17.70 HTTP (80)\
`iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 163.22.17.70 -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT`

DMZ → LAN：完全禁止\
`iptables -A FORWARD -i enp0s8 -o enp0s9 -s 192.168.29.129 -d 172.21.21.121 -j DROP`

:::
4. LAN
    - 可以直接連線外網
    - 可以直接連線 DMZ 的 ssh、收送 email、http、https
:::success
LAN → 外網：全部放行\
`iptables -A FORWARD -i enp0s9 -o enp0s8 -s 172.21.21.121 -m conntrack --ctstate NEW -j ACCEPT`
`iptables -A FORWARD -i enp0s9 -o enp0s3 -s 172.21.21.121 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT`
LAN → DMZ：只允許 SSH、HTTP、HTTPS、各種 mail 相關 port\
`iptables -A FORWARD -i enp0s9 -o enp0s8 -s 172.21.21.121 -d 192.168.29.129 -p tcp -m multiport --dports 22,80,443,25,465,587,110,995,143,993 -m conntrack --ctstate NEW -j ACCEPT`

:::

## 五、系統設定與除錯（8 分）
1. server 上執行 apt update 無法運作，因為連不上 tw.archive.ubuntu.com，該怎麼改軟體套件來源？（2 分）
    - 須改成 ftp.ubuntu-tw.org
    - 建議：請確保你使用防火牆允許的來源進行軟體列表更新。
:::success
- 修改 `/etc/apt/sources.list`
- 把 `tw.archive.ubuntu.com` 換成 `ftp.ubuntu-tw.org/ubuntu/`

iptables（允許 DMZ → ftp.ubuntu-tw.org http）\
`iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 163.22.17.70 -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT`
  
iptables（允許 DMZ → DNS 8.8.8.8）\
`iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 8.8.8.8 -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT`
`iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 8.8.8.8 -p tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT`
:::

2. server `ping google.com` 失敗，請找到原因並修正。（3 分）
:::success
/etc/hosts 被加了錯誤的 google.com 、 /etc/resolv.conf 的 server 被註解掉、/etc/nsswitch 被註解掉，修正就好了
:::
3. 通常 ping 一個不存在的主機時，會失敗。請設定成在 firewall 上 `ping moli` 時，系統會因為找不到 `moli` 這台主機的 IP，所以自動在後面加上 `.lsa.tw` 變成 `moli.lsa.tw` ，然後順利 ping 到。（2 分）
    - 提示：請透過「系統的正式設定方式 netplan」設定搜尋 domain，而不是手動覆寫 /etc/resolv.conf
:::success
編輯 Firewall 的 netplan 設定
```
#/etc/netplan/*.yaml
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: true
      nameservers:
        addresses: [8.8.8.8]
        search: [lsa.tw]
```
`sudo netplan try`
:::
4. 新增紀錄在 firewall 的某個設定檔，讓 firewall 要連線 server 時， `curl server.lsa.tw` 和 `ping lb.lsa.tw` 都能連到 server。（1 分）
:::success
編輯 `/etc/hosts`
```
192.168.29.129 server.lsa.tw lb.lsa.tw
```
:::

## 六、服務架設
### A: mail server（6 分）
- 在 server 上裝 postfix 提供 @s學號.lsa.tw 網域的電子郵件服務（3 分）
    - `sudo apt install postfix`
        - Postfix configuration type：選 Internet Site
        - System mail name：輸入 s學號.lsa.tw
    - `telnet localhost 25`
        - 如果看到 220 mail.s學號.lsa.tw ESMTP Postfix 就 ok
- 請設定 server 上的 alias 讓寄給 root 的信都會自動轉寄到預設使用者的信箱（1 分）
    - `sudo nano /etc/aliases`
        - `root: {username}`
    - sudo newaliases
    - sudo systemctl reload postfix
- 請在 firewall 上使用 `telnet` 連到 server 的郵件服務，寄信給 server 上的 root（2 分）
    - `telnet 192.168.29.129 25`
    - `HELO firewall.s學號.lsa.tw`

### B: Docker（6 分）
使用 docker + docker-compose.yaml 建立多個服務

- 在 server 上的預設使用者家目錄中建立 docker/ 資料夾（3 分）
    - 裡面建立 docker-compose.yaml
    - 裡面建立兩個目錄 `nginx1` `nginx2`，分別各建立一個 index.html 且內容不同。
- 在 server 上使用 docker compose 同時啟動這兩個 nginx（1 分）
- 這兩個 nginx 分別於對應到 server 的 port 8080 、8081（2 分）
    - port 8080 的提供 nginx1 裡的內容，port 8081 的提供nginx2 裡的內容
            - 提示：掛載本機目錄進去容器中

### C: nginx（4 分）
- 在 server 上裝 nginx
    - 在不修改原始預設檔案內容的狀況下，新增一個 name-based virtual host `server.lsa.tw`，這個 virtual host 提供的內容都位在 /var/www/vhost/server.lsa.tw/。（2 分）
        - 設定檔須放置在該放的地方、用適當的方式啟用
        - /var/www/vhost/server.lsa.tw/ 目錄裡有一個 index.html ，內容須包含你的學號，其他自由發揮
    - 驗證：如果用其他名稱連上這個服務，維持顯示 nginx 預設畫面
    - 在 server 上的 nginx 再多建立一個 name-based virtual host `lb.lsa.tw`
        - nginx 會 load balance 到兩個 docker nginx（2 分）
    - 驗證：在 firewall 可以連 server.lsa.tw 和 lb.lsa.tw 並有相對應的結果


:::spoiler
在 server 
- curl -H "Host: server.lsa.tw" http://localhost:{port}
- curl -H "Host: asdf" http://localhost:{port}
---
- 在 firewall 可以 curl lb.lsa.tw 並有相對應的結果
:::

## 七、最終驗證與安全要求（10 分，必做！）

1. 從 Firewall 外部網路（你的筆電或直接用 curl localhost）連 http://fw-s[學號]:80 必須看到 server 上 nginx 的預設或 virtual host 頁面  （3 分）
   （提示：需要 iptables -t nat -A PREROUTING ... + FORWARD 規則 + MASQUERADE）
2. server 與 pc 必須能上網（server 要能 apt update）（2 分）
3. 從 pc 不能直接 ssh server（會 timeout 或 reject）（2 分）
4. lb.lsa.tw 必須能 load balance 到兩個 docker nginx（從 firewall curl 驗證）（3 分）

## 加分題

### Samba（5 分）
1. 在 server 架設 samba 把 /opt/project 分享出去，匿名使用者可讀，預設使用者可寫（2 分）

:::spoiler
學生 Windows 可看不可寫
在 server 中可以寫入檔案
:::

2. 利用 iptables 技巧，讓你的筆電輸入掛載 firewall ip 時，會掛載到 server 上的 samba（3 分）
:::spoiler
學生 Windows 可看不可寫
在 server 中可以寫入檔案
:::