raspberrypi 官網 raspberrypi 官網

互動 IoT 系統應用 - 上課教材

互動 IoT 系統應用 > 課程內容 > 第 04 章 - 建立網路服務 (http, https, SMB)

第 04 章 - 建立網路服務 (http, https, SMB)

上次更新日期 2022/10/13

樹莓派就是個 Linux 系統,你也可以讓它變成一部相當輕量級的伺服器!我們這裡會用 Apache 軟體做介紹來讓大家了解! 這個 apache 越來越胖~所以,如果非必要,不要啟用它!我們這裡只是做個測試而已!大家就來玩一玩~

學習目標:

  1. 了解伺服器建立的過程口訣
  2. 建立 WWW 伺服器,並建立首頁資料
  3. 了解網路磁碟機 (SMB) 以及使用 Samba 服務

4.1: 使用 Apache 軟體建立 Web server

要讓你的 Linux 系統建立網際網路服務,其實有個簡易的口訣要注意!在不改變任何設定值的情況下,你可以這樣建立網路服務;

  1. 安裝:
  2. 啟動:
  3. 開機啟動:
  4. 防火牆:
  5. 測試:

上面 5 個步驟背下來~下次要建立網路服務,你就不會忘記某些流程了!唯一要知道的是,你的網路服務軟體是那一隻而已。 假設你知道 Web server 的達成軟體是 apache2,那麼如何完成上面說的 5 個步驟來讓你的樹莓派變成 Web server 呢? 就讓我們看下去:

# 1. 找到這個軟體後,安裝起來:
$ sudo apt-cache search --names-only apache
.....
libapache2-mod-upload-progress - upload progress support for the Apache web server
apache2 - Apache HTTP Server
apache2-bin - Apache HTTP Server (modules and other binary files)
.....
$ sudo apt-get install apache2

# 2, 3. 啟動與開機啟動這個服務
$ sudo systemctl restart apache2
$ sudo systemctl enable apache2
$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-10-13 12:04:21 CST; 15s ago
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 17365 (apache2)
      Tasks: 55 (limit: 779)
        CPU: 135ms
     CGroup: /system.slice/apache2.service
             ├─17365 /usr/sbin/apache2 -k start
             ├─17366 /usr/sbin/apache2 -k start
             └─17367 /usr/sbin/apache2 -k start

# 4. 防火牆,記得要放行 80 埠口!我們前一章放行過!這裡觀察就好:
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
80/tcp                     ALLOW IN    Anywhere
Anywhere                   ALLOW IN    192.168.0.0/16
22/tcp                     ALLOW IN    172.31.0.0/16
80/tcp (v6)                ALLOW IN    Anywhere (v6)

# 如果沒有看到上面那一行,就得要再次進行:
$ sudo ufw allow http

# 5. 開始測試:
$ curl http://localhost/

如果只是想要建好服務,那麼,這時候的服務已經建立妥當了!如果還想要測試首頁到底能不能生效, 就這樣處理看看!將首頁檔案變更一下囉!

$ sudo vim /var/www/html/index.html
Your Name: XXX OOO
Your ID: 4090CXXX

$ curl http://localhost
Your Name: XXX OOO
Your ID: 4090CXXX

這樣,你就知道首頁放置在哪裡了!

  • 增加 SSL 模組

現在,大家都希望資料在網路上面跑是安全的,所以,可能會需要使用到 https 瀏覽網頁。 我們的樹莓派其實很多模組已經加入系統了,只是,在 Apache 裡面,我們需要將該模組加入才行! 這裡不談怎麼建立自己的憑證,只用系統預設的憑證來啟動,就得要這樣:

# 1. 先看看 apache 的設定檔裡面,有沒有包含 ssl 相關的設定?
$ ll /etc/apache2/sites-available/
-rw-r--r-- 1 root root 1332  6月  9 12:22 000-default.conf
-rw-r--r-- 1 root root 6338  6月  9 12:26 default-ssl.conf   <==這就是我們要的!

# 2. 檢查看看上面的檔案是否已經加入 apache 了?
$ a2query -s default-ssl
No site matches default-ssl (disabled by site administrator)

# 3. 看看 ssl 模組有沒有加入系統中?
$ a2query -m ssl
No module matches ssl (disabled by site administrator)

# 4. 加入上面兩個資料
$ sudo a2ensite default-ssl.conf
Enabling site default-ssl.
To activate the new configuration, you need to run:
  systemctl reload apache2

$ sudo a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Module socache_shmcb already enabled
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  systemctl restart apache2

# 5. 最終重新啟動 apache2 
$ sudo systemctl restart apache2
$ sudo netstat -tlunp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address   Foreign Address  State   PID/Program name
tcp        0      0 127.0.0.1:631   0.0.0.0:*        LISTEN  13516/cupsd
tcp        0      0 0.0.0.0:22      0.0.0.0:*        LISTEN  584/sshd: /usr/sbin
tcp6       0      0 :::443          :::*             LISTEN  18343/apache2
tcp6       0      0 :::80           :::*             LISTEN  18343/apache2
tcp6       0      0 ::1:631         :::*             LISTEN  13516/cupsd
tcp6       0      0 :::22           :::*             LISTEN  584/sshd: /usr/sbin
tcp6       0      0 :::21           :::*             LISTEN  572/vsftpd
udp        0      0 0.0.0.0:5353    0.0.0.0:*                311/avahi-daemon: r
udp        0      0 0.0.0.0:39916   0.0.0.0:*                311/avahi-daemon: r
udp        0      0 0.0.0.0:631     0.0.0.0:*                13518/cups-browsed
udp6       0      0 :::5353         :::*                     311/avahi-daemon: r
udp6       0      0 :::48573        :::*                     311/avahi-daemon: r

最終使用你的瀏覽器來瀏覽你的網站,就能看到確實使用 https 進行連線的功能了!

4.2: 使用網路磁碟機

http 是讓用戶來瀏覽,那麼如果要進行檔案傳輸呢?最好使用 sftp 亦即是 ssh 相關服務來處理較佳, 不要使用 ftp 或 ftps 了。那麼如果是需要類似 windows 的網路磁碟機呢?那就需要 Samba 服務了。

  • CIFS 與 SMB 及 Samba

windows 系統的網路磁碟機,使用的是一種名為 Common Internet Filesystem (CIFS) 的協定, 而 Linux 加入 CIFS 的協定,就是使用 SMB (server message block) 的服務!而要達成這個 SMB 的協定, 就需要使用 Samba 的軟體支援才行!為了方便 Server/client 的分別設計,所以我們得要安裝的軟體有這些:

$ sudo apt-get install samba samba-common samba-client

樹莓派很好玩,安裝完畢之後,SMB 服務就自動啟動了!不過,Samba 除了提供 smbd 之外,同時提供了 nmbd 服務! 實際用在檔案分享的,是 smbd,而 nmbd 只是用在提供網路搜尋的回應而已,事實上不太需要啟動!因此, 我們可以在安裝完畢後,先將 nmbd 關閉即可!

$ sudo systemctl stop nmbd
$ sudo systemctl disable nmbd
  • 建立可以使用 SMB 的用戶

要實際使用 Samba 的話,得要有帳號才行!而這個帳號必須要是 Linux 的實體帳號才行!假設我要讓 rasppi 這個用戶可以使用 Samba, 那就得要提供密碼~實際操作這樣處理看看:

# 1. 先看看有沒有任何用戶在 Linux 以及 Samba 系統上
$ id rasppi
使用者id=1000(rasppi) id群組=1000(rasppi) 組=1000(rasppi),4(adm),...

$ sudo pdbedit -L

# 2. 開始建立可操作 Samba 的用戶:
$ sudo pdbedit -a -u rasppi
new password:          <==建立使用 samba 的密碼,可與 Linux 密碼不同
retype new password:   <==再次輸入
Unix username:        rasppi
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-2020641071-3948558050-1374403643-1000
Primary Group SID:    S-1-5-21-2020641071-3948558050-1374403643-513
Full Name:
Home Directory:       \\RASPBERRYPI\rasppi
HomeDir Drive:
Logon Script:
Profile Path:         \\RASPBERRYPI\rasppi\profile
Domain:               RASPBERRYPI
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          三, 06  2月 2036 23:06:39 CST
Kickoff time:         三, 06  2月 2036 23:06:39 CST
Password last set:    四, 13 10月 2022 15:20:35 CST
Password can change:  四, 13 10月 2022 15:20:35 CST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

$ sudo pdbedit -L
rasppi:1000:

最終你會發現有個 rasppi 的帳號輸出了!那就是代表建立成功!

  • 在 windows 端登入網路磁碟機

在 windows 系統上面連線到樹莓派網路磁碟機的方法也很簡單,先打開檔案總管,然後在網址列輸入如下的方式即可:

  • \\樹莓派IP\你的帳號

在跳出的視窗中,輸入正確的帳號與密碼,那就可以登入到你樹莓派的用戶家目錄了! 未來,你就可以透過網路磁碟機,直接跟你的樹莓派互動!如果你有興趣,還能放行大量的磁碟空間, 你的樹莓派,就變成一個家用很便宜的 NAS 了!

  • 防火牆議題

基本上,網路磁碟機不要對 Internet 放行,只對內部網路放行,而我們已經使用 ufw 對整個區域網路做放行, 因此,無須處理防火牆。不過,如果你要針對某個特定的來源做放行,假設 10.0.0.0/8 可以使用我們的網路磁碟機好了, 那麼你的防火牆還是得要額外處置:

$ sudo ufw allow from 10.0.0.0/8 to any app samba
Rule added

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
80/tcp                     ALLOW IN    Anywhere
Anywhere                   ALLOW IN    192.168.0.0/16
22/tcp                     ALLOW IN    172.31.0.0/16
137,138/udp (Samba)        ALLOW IN    10.0.0.0/8
139,445/tcp (Samba)        ALLOW IN    10.0.0.0/8
80/tcp (v6)                ALLOW IN    Anywhere (v6)

4.3: 當週實做

  1. 有個名為 vsftpd 的軟體,這個軟體可以啟動 FTP 協定,讓你的樹莓派可以提供 FTP 的服務。 請依據上面介紹的五大處理流程步驟,讓你的樹莓派可以成為 FTP 伺服器最終使用 curl ftp://localhost 時, 可以順利的提供檔案資料下載。
    1. 需要編輯 /etc/vsftpd.conf 檔案內容,檔案內需要將底下的設定變更成為 YES 才行:
      anonymous_enable=YES
      
    2. 需要加入 ftp 服務的埠口在防火牆放行的行列中
    3. 將 /etc/hosts 複製到 /srv/ftp 目錄下
    4. 使用 curl ftp://localhost 時,會出現 hosts 檔名,而 curl ftp://localhost/hosts 時,會列出該內容

...