# 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

:::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

:::
:::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 中可以寫入檔案
:::