raspberrypi 官網 raspberrypi 官網

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

互動 IoT 系統應用 > 課程內容 > 第 03 章 - 樹莓派的網路與防火牆系統

第 03 章 - 樹莓派的網路與防火牆系統

上次更新日期 2022/10/13

要處理樹莓派的網路參數設定了,網路參數一直是有點傷腦筋的地方,雖然樹莓派提供了圖形界面讓大家操作, 不過,理解一下網路參數,應該是比較好的啦!而,如果你有開放某些服務 (例如前一章放行的 ssh 服務), 這時,加上防火牆系統,應該是比較妥當的行為!那麼,就讓大家一起來玩一玩啦!

學習目標:

  1. 了解網路參數的意義
  2. 啟用 dhcpcd 或 NetworkManager 網路管理模式
  3. 使用 nmcli 管理 wifi
  4. 簡單使用 firewall-cmd 管理防火牆
  5. 使用預設 ufw 管理防火牆

3.1: 網路 IP 位址簡介

大家都知道要連上網際網路互聯網,你的裝置就需要有 IP 位址才行。那麼什麼是 IP 位址?如果我們需要規劃區域網路, 該如何設計 IP 位址的網段?什麼是埠口 (port)?防火牆主要在管理什麼?這都需要稍微了解一下。

  • IP 位址的種類

基本上,IP 位址分兩種,分別是:

  • 可以直接上網的公共 IP 位址 (public IP)
  • 需要透過分享器的私有 IP 位址 (private IP)

一般來說,你申請光纖到府服務的網路,大多就是公共 IP 位址,那種網路是可以架站的!而如果你想要讓家裡的好多電腦、手機可以透過 wifi 上網, 那可能就得要加裝 IP 分享器。IP 分享器會使用兩個界面,一個是從電信公司取得的公共 IP 位址,另外一個界面, 就可以提供私有 IP 位址給你的所有裝置!那你的裝置就可以透過 IP 分享器連線到網際網路上了。

  • 私有 IP 位址範圍

在一般教室,或者是企業內部,為了讓員工彼此之間可以透過網路連線到公司內的伺服器,又不用讓每個員工都使用公共 IP 位址, 這時候,通常就會使用 IP 分享器,提供每個員工可以連網的私有 IP 位址了!那麼私有 IP 位址是在哪個區段間? 大致上有這幾個區段:

  • 10.xx.yy.zz
  • 172.16.yy.zz, 172.17.yy.zz, ..., 172.31.yy.zz
  • 192.168.yy.zz

你只要看到 IP 位址開頭的第 1, 2 組數字如上顯示,那就是私有 IP 位址了!

例題 3.1.1:使用底下的資料查詢一下你目前樹莓派上面的 IP 位址為何?同時,該 IP 位址是 public IP 還是 private IP?
$ ifconfig
$ ip addr show
  • 區域網路 LAN

那麼,什麼是區域網路呢?其實很簡單喔,就是 IP 位址前面幾組數字相同,然後實體連線在一起,那就是區域網路。 問題是,幾組數字相同才是區域網路呢?那就得要靠子網路遮罩 (netmask) 來解釋了。一般來說,子網路遮罩是與 IP 位址寫在一起的, 舉例來說,如下所示:

  • IP 位址 / 子網路遮罩
  • 10.0.0.0/255.0.0.0
  • 172.16.0.0/255.255.0.0
  • 192.168.1.0/255.255.255.0

當子網路遮罩只有 1 個 255 (255.0.0.0) 時,則第 1 組 IP 位址數字相同,即是同一個區網。例如 10.100.23.1/255.0.0.0 跟 10.200.12.5/255.0.0.0 是同一個區域網路~因為第 1 組都是 10,然後子網路遮罩都只有 1 個 255。

當子網路遮罩有 2 個 255 (255.255.0.0) 時,則前 2 組數字相同,就會是同一個區網,例如 172.20.100.3/255.255.0.0 與 172.20.200.54/255.255.0.0 是同一個區域網路

當子網路遮罩有 3 個 255 (255.255.255.0) 時,則前 3 組數字要相同,才是同一個區域網路,例如 192.168.1.3/255.255.255.0 跟 192.168.1.100/255.255.255.0 是同一組區網,但是 192.168.3.100/255.255.255.0 就不是在上述區域網路內的 IP 位址了。

  • 使用『 IP 位址 / 子網遮罩的位元數 』作為 IP 位址設定

如果你知道 2 進位,那麼你就會知道,其實 10 進位的 255 相當於 2 進位的 11111111,共有 8 個 1 喔! 所以,IP 位址的寫法,通常就會寫成 192.168.1.100/255.255.255.0 --> 192.168.1.100/24,那個 24 其實就是 255.255.255.0 ,因為一個 255 會佔用 8 個 2 進位的位元數,因此 3 個 255,當然就是 24 啦!

除了 IP 位址之外,其實,整串區域網路也能用這個方式來表示。以 192.168.1.100/24 這個 IP 位址所在的範圍來看, 因為子網路遮罩有 3 個 255,因此 IP 位址前 3 個數字要相同,最後一個數字不同的情況下,才會是區域網路。 而每個區間的數字,範圍只能是 0~255 之間,所以,這組區域網路的區段就會在 192.168.1.0 ~ 192.168.1.255 之間。 那我們拿第 1 個 IP 位址 (192.168.1.0) 來當作區域網路的展示,因此,這一段區域網路就會是 192.168.1.0/24 了!

  • 網關、通訊閘 (gateway, router)

區域網路內的所有 IP 位址,都可以透過廣播直接收發網路封包。那不在區域網路內的 IP 位址怎麼連線? 例如,你想要連到 IG 或 YT 時,這些 IP 位址並不在你的區網內。此時,你的網路封包,就會送到通訊閘 (gateway) 去。 通訊閘有點像是人類的郵局,區域網路有點像是郵局附近的住家。這些住家可以透過廣播互相傳遞資料, 但是要傳比較遠時,就將包裹丟給郵局,請郵局送出去就好!這就是通訊閘的功能!

一般來說,IP 分享器或者是無線基地台 (AP),包括你的手機使用基地台分享功能時,這些設備都會是通訊閘喔! 要連上網路,一定要有通訊閘才行!否則,你的封包會無法離開區域網路!

  • 領域名稱 DNS 系統

我想,你應該不會記得 YT 的 IP 位址~你也不可能記得 google 的位址~但是連上網際網路確實是使用 IP 位址才行! 問題是,我們在網址列,確實只有輸入英文網址,並不是 IP 位址啊~這就是 DNS 的功能!DNS 會將你輸入的主機名稱, 轉譯成為 IP 位址,讓你可以透過主機名稱上網。

  • 連上網際網路需要的參數

那麼連上 internet 需要什麼參數呢?就需要底下的資料才行!

  • IP 位址 / 子網路遮罩
  • 通訊閘 IP 位址
  • DNS 伺服器 IP 位址 (最好有 2 個)
例題 3.1.2:使用底下的方式查詢出你目前的網路參數:
  • 使用 ip addr show 找出『 IP 位址/子網路遮罩』
  • 使用 route -n 找出通訊閘 (Gateway)
  • 使用 cat /etc/resolv.conf 找到 nameserver 關鍵字後的 DNS IP 位址
  • 網路參數的取得方法 dhcp(auto) 或手動 (manual)

電腦教室內的 PC 這麼多,如果需要一台一台設定 IP 位址,那管理員就崩潰了!因此,一般來說, 電腦教室內都會放一台 IP 分享器來主動提供給 PC 群取得 IP 位址使用。其實,電腦開機時, 如果指定『自動取得 IP 位址』的設定值,而區域網路內又剛好有一個提供 dhcp (dynamic host configuratoin protocol, 動態主機設定協定) 服務的伺服器 (其實,就是我們講的 IP 分享器功能),那麼 dhcp 伺服器,就會提供 PC 區域網路連網所需要的網路參數了。 如此一來,你就不用一台一台設定 IP 位址啦!

總的來說,自動取得 IP 位址的學名,就是 dhcp 這個關鍵字,而一般我們就俗稱 IP 分享器功能就是了。 事實上,IP 分享器還提供了一個名為 NAT 的服務!現在稍微知道一下即可!

3.2: 使用 NetworkManager 管理網路

網路設定一直是很重要的!樹莓派也是一樣!只是,樹莓派的設定方式比較多,你可以隨意選擇某一種設定方式。 我們這裡預設將使用 NetworkManager 機制,當然,你也可以持續使用原本的預設 dhcpcd 機制。

  • 樹莓派提供的網路管理機制

樹莓派至少提供兩種基本的網路參數管理機制,分別是:

  • dhcpcd :透過編輯 /etc/dhcpcd.conf 來修改網路參數
  • NetworkManager :透過 nmcli 指令來管理網路參數

我們得要知道目前管理的機制是那一種,這樣才能夠順利往下處理。查看的方式除了使用 raspi-config 之外, 可以簡單的使用指令來查看:

$ systemctl status dhcpcd
● dhcpcd.service - DHCP Client Daemon
     Loaded: loaded (/lib/systemd/system/dhcpcd.service; disabled; vendor preset: ..
     Active: inactive (dead)
       Docs: man:dhcpcd(8)

$ systemctl status NetworkManager
● NetworkManager.service - Network Manager
     Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; vendor ..
    Drop-In: /usr/lib/systemd/system/NetworkManager.service.d
             └─10-dhcpcd.conf
     Active: active (running) since Fri 2022-09-23 14:31:17 CST; 10min ago
       Docs: man:NetworkManager(8)
   Main PID: 410 (NetworkManager)
      Tasks: 3 (limit: 779)
        CPU: 1.687s
     CGroup: /system.slice/NetworkManager.service
             └─410 /usr/sbin/NetworkManager --no-daemon

 9月 23 14:31:26 raspberrypi NetworkManager[410]:   [1663914686.9963] device (eth0)..
....

上面一看就知道,目前管理的方式就是在第一章的時候,更改成為 NetworkManager 的情境!你也可以透過底下的方式, 強迫使用 NetworkManager 喔!

$ sudo systemctl stop    dhcpcd
$ sudo systemctl disable dhcpcd
$ sudo systemctl start  NetworkManager
$ sudo systemctl enable NetworkManager
  • 網路參數的取得方式: 自動(auto) 或手動 (manual)

如同前一小節提到的,網路參數的取得有 dhcp(auto) 或手動 (manual) 兩種,如果是手動設定的話, 那就得要提供 (1) IP 位址/子網路遮罩 (2)通訊閘 (3)DNS 伺服器 IP 位址等參數,如果是自動的話, 那就什麼都不要提供!讓系統去跟 IP 分享器要這些必要的參數即可。那如何觀察目前的網路設定?很簡單,使用如下的指令即可:

$ nmcli connection show
NAME   UUID                                  TYPE      DEVICE
eth0   64288022-3227-3dd8-8c24-c4594cc862ab  ethernet  eth0
  • NAME:連線名稱,通常會跟裝置名稱一樣
  • UUID:裝置識別碼,預防 NAME 相同時的錯誤
  • TYPE:網路類型,常見乙太網路還有 wifi 無線網路等類型
  • DEVICE:使用的網路卡。
例題 3.2.1:修改連線名稱的方式:
$ nmcli connection show
NAME        UUID                                  TYPE      DEVICE
有線連線 1  64288022-3227-3dd8-8c24-c4594cc862ab  ethernet  eth0

$ sudo nmcli connection modify 有線連線\ 1 con-name eth0
$ nmcli connection show
NAME  UUID                                  TYPE      DEVICE
eth0  64288022-3227-3dd8-8c24-c4594cc862ab  ethernet  eth0

我們會想要知道 eth0 這個連線名稱的內容,就可以使用如下的方式來觀察:

$ nmcli connection show eth0
connection.id:            eth0
....
ipv4.method:              auto
ipv4.dns:                 --
ipv4.dns-search:          --
ipv4.dns-options:         --
ipv4.dns-priority:        0
ipv4.addresses:           --
ipv4.gateway:             --
ipv4.routes:              --
....
IP4.ADDRESS[1]:           192.168.201.18/24
IP4.GATEWAY:              192.168.201.254
IP4.ROUTE[1]:             dst = 0.0.0.0/0, nh = 192.168.201.254, mt = 100
IP4.ROUTE[2]:             dst = 192.168.201.0/24, nh = 0.0.0.0, mt = 100
IP4.DNS[1]:               168.95.1.1
IP4.DNS[2]:               120.114.100.1
....
DHCP4.OPTION[1]:          dhcp_lease_time = 259200
DHCP4.OPTION[2]:          dhcp_server_identifier = 192.168.201.254
....

在 ipv4.* 顯示的資訊中,比較重要的就是上面的特殊字體部份:

  • ipv4.method: 就是 auto 與 manual 的設定
  • ipv4.dns: 就是 DNS IP 位址的設定
  • ipv4.addresses: 就是 IP 位址/子網路遮罩位元 的設定
  • ipv4.gateway: 就通訊閘的設定

大寫部份 IP4 就是目前運作當中的實際 IP 位址資訊囉!現在,讓我們來修改一下,讓上述的資料變成手動設定值!

$ sudo nmcli connection modify eth0 \
  ipv4.method manual \
  ipv4.addresses 192.168.201.18/24 \
  ipv4.gateway 192.168.201.254 \
  ipv4.dns 168.95.1.1,120.114.100.1 

$ sudo nmcli connection up eth0

更動到設定後,都要使用 nmcli 去 up 連線名稱才行!設定才會生效!若要改回來自動取得 IP 的情況, 就得要將位址、網關、DNS 全部留白,方式會變這樣:

$ sudo nmcli connection modify eth0 \
  ipv4.method auto \
  ipv4.addresses '' \
  ipv4.gateway '' \
  ipv4.dns '' 

$ sudo nmcli connection up eth0
  • nmcli 無線網路使用 (wifi)

無論怎麼說,樹莓派總是比較經常使用無線網路的~那就得要使用 WIFI 啦!使用 wifi 的方式也不是太困難, 但是,你必須要先知道兩個參數,就是無線 AP 的 SSID 與密碼。然後,先透過你的網路卡來進行掃描~ 那怎麼知道我們的無線網卡名稱為?可以這樣找看看:

# 先找出無線網卡的名稱:
$ nmcli device status
DEVICE         TYPE      STATE     CONNECTION
eth0           ethernet  已連線    eth0
wlan0          wifi      離線      --
p2p-dev-wlan0  wifi-p2p  離線      --
lo             loopback  不受管理  --

DEVICE 的部份就是目前可以找到的網卡~一看之下,就知道 eth0 是實體網卡 (ethernet),而 wlan0 就是無線網卡 (wifi) 囉。那麼,我們就可以使用 wlan0 來找一下目前這個環境下的無線 AP 名稱有哪些?

# 找出目前環境下的無線 AP SSID 名稱:
$ sudo nmcli device wifi rescan
$ sudo nmcli device wifi list
IN-USE BSSID             SSID         MODE  CHAN RATE       SIGNAL BARS  SECURITY
       9C:9D:7E:43:E8:8E i2512        Infra 11   130 Mbit/s 30     ▂___  WPA1 WPA2
       E4:C3:2A:4D:88:32 TP-Link_8832 Infra 6    270 Mbit/s 29     ▂___  WPA2
       10:7B:44:3D:81:B0 VBird_wifi   Infra 11   130 Mbit/s 27     ▂___  WPA2
....

這樣就找到環境下可用的無線 AP 名稱了!例如上面就有名為 i2512 的 SSID 無線 AP 名稱等等。 假設我知道 i2512 的名稱之後,也知道這個 AP 的密碼,那就可以開始設定好這個 SSID 的連線了!

# 連線到無線 AP 去:
$ sudo nmcli device wifi \
  connect i2512 \
  ifname wlan0 \
  password 'myi2512pw'

$ nmcli connection show
NAME   UUID                                  TYPE      DEVICE
eth0   64288022-3227-3dd8-8c24-c4594cc862ab  ethernet  eth0
i2512  aaa509db-e326-4bfa-83a2-d16904f63da4  wifi      wlan0

$ sudo nmcli connection up i2512

最後查看 wifi 的 IP 位址,可以這樣做:

$ ip addr show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group...
    link/ether b8:27:eb:d8:ae:89 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.181/24 brd 192.168.0.255 scope global dynamic noprefixroute wlan0
       valid_lft 604754sec preferred_lft 604754sec
    inet6 fe80::e14d:1370:b14a:e38/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
例題 3.2.2: 讓樹莓派使用你的手機 AP 功能:
  1. 拿出你的手機,啟用 AP 基地台功能,並且設定好你的 SSID 與 password
  2. 連上樹莓派之後,新增該連線,最終在 nmcli connection show 的時候, 會出現你手機的 SSID
  3. 使用『 nmcli connection up SSID名稱』的功能,然後查看一下 wlan0 的 IP 位址是否有改變
  4. 改回使用教室內的無線 AP 功能 (否則教室系統無法連線進來樹莓派)

3.3: 服務管理與埠口關閉

要啟動某些網路功能,或者是某些系統任務,就得要管理樹莓派上面的任務。舉例來說, 要讓我們的樹莓派變成 ssh 伺服器,就是使用底下的方式來處理即可:

$ sudo systemctl start ssh
$ sudo systemctl enable ssh
$ sudo systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2022-09-23 14:31:18 CST; 2 days ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 585 (sshd)
      Tasks: 1 (limit: 779)
        CPU: 1.617s
     CGroup: /system.slice/ssh.service
             └─585 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups

 9月 23 14:31:17 raspberrypi systemd[1]: Starting OpenBSD Secure Shell server...

同理,要關掉服務,當然就是反過來,使用 systemctl stop 與 systemctl disable 即可。那如何知道目前有多少埠口在啟用? 可以使用如下的指令來查看:

$ 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  8960/cupsd
tcp        0      0 0.0.0.0:22       0.0.0.0:*         LISTEN  585/sshd: /usr/sbin
tcp6       0      0 ::1:631          :::*              LISTEN  8960/cupsd
tcp6       0      0 :::22            :::*              LISTEN  585/sshd: /usr/sbin
udp        0      0 0.0.0.0:5353     0.0.0.0:*                 367/avahi-daemon: r
udp        0      0 0.0.0.0:35330    0.0.0.0:*                 367/avahi-daemon: r
udp        0      0 0.0.0.0:631      0.0.0.0:*                 8962/cups-browsed
udp6       0      0 :::5353          :::*                      367/avahi-daemon: r
udp6       0      0 :::43063         :::*                      367/avahi-daemon: r

上面的 :631 與 :5353 等,都是非必要的服務!事實上,我們也可以關閉它!讓該服務不會自動啟動! 使用的方法很簡單:

$ sudo systemctl stop cups
$ sudo systemctl disable cups
$ sudo netstat -tlunp

上述指令最後一個,就可以發現到 :631 的埠口通通消失了!現在,讓我們繼續將 :5353 關閉吧!

$ sudo systemctl stop avahi-daemon.socket
$ sudo systemctl disable avahi-daemon.socket
$ sudo netstat -tlunp

目前你的網路提供的埠口,就會剩下 :22 了!

  • 網路服務的設定口訣

要讓你的樹莓派變成一台簡易的伺服器,非常簡單!記得口訣:

  • 安裝:
  • 啟動:
  • 開機啟動
  • 防火牆
  • 測試

讓我們來讓樹莓派變成一台 FTP 伺服器看看:

  • 使用 sudo apt-cache search vsftpd 先查詢一下有沒有軟體
  • 使用 sudo apt-get install vsftpd 進行安裝
  • 使用 sudo systemctl start vsftpd 啟動
  • 使用 sudo systemctl enable vsftpd 開機啟動
  • 使用 curl -u username ftp://localhost 測試!

3.4: 使用 firewalld 防火牆機制

樹莓派通常作為資料收集的邊緣伺服器,基本上,不會啟用什麼特別的網路服務,一般來說,也不會提供網際網路的監聽連線。 不過,像我們目前的設定,感覺上還是有提供部份的連線,那就得要注意啦!為了避免不小心提供的網路服務被惡搞, 加裝防火牆是必備的。樹莓派的防火牆機制很多,我們使用比較單純的 firewalld 來處理好了!

例題 3.4.1:啟用 firewalld 防火牆:
  • 安裝 firewalld 防火牆軟體
  • 啟用該軟體
  • 下次開機也會啟動該軟體
  • 使用 sudo firewall-cmd --list-all 觀察防火牆機制

先來觀察一下目前防火牆的設定內容:

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 wlan0
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

重點是 services 與 ports 的項目,那個是要不要針對該服務或埠口對全世界放行的意思。 舉例來說,我們上一小節有提供 FTP 的服務了,那麼將 FTP 加入放行的行列,應該是合理的! 所以可以這樣做:

$ sudo firewall-cmd --permanent --add-service=ftp
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 wlan0
  sources:
  services: dhcpv6-client ftp ssh
....

另外,要放行整段區域網路也可以這樣做:

$ sudo firewall-cmd --permanent \
  --add-rich-rule='rule family="ipv4" source address="192.168.0.0/16" accept'
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 wlan0
  sources:
  services: dhcpv6-client ftp ssh
....
  rich rules:
        rule family="ipv4" source address="192.168.0.0/16" accept

3.5: 使用 ufw 防火牆機制

事實上,雖然資傳系比較熟悉 firewalld,但是 raspberry pi 使用的是來自於 Debian 衍生的 ubuntu 系統再製版, 而 ubuntu 預設使用 ufw 這個更加簡易方便的防火牆管理機制!不過你要注意的是,系統上面不可以同時啟用兩種防火牆機制, 不然, Linux 核心可能會搞混,到底是要怎麼進行封包過濾!因此,我們在安裝好了 ufw 之後,得要先關閉 firewalld 才行。

例題 3.5.1:關閉 firewalld 並且啟動 ufw 防火牆機制:
  • 請關閉 firewalld,並且重新開機也不會使用 firewalld 了!
  • 確認一下 firewalld 的狀態,是否如上所述。要確定已經完整關閉了喔!
  • 安裝 ufw 這個軟體
  • 啟動 ufw 防火牆,並且每次開機都會自動啟動 ufw 防火牆。
  • 簡單觀察一下 ufw 服務的運作情況 (systemctl status)

雖然經過上述的指令,我們的樹莓派已經有 ufw 防火牆機制,但是...其實還沒有啟用喔!要確認有沒有順利運作 ufw 防火牆, 應該這樣看。同時,進行啟動 (enable) 與關閉 (disable) 的方式如下:

$ sudo ufw status
Status: inactive     # 這個 inactive 說明的就是沒有啟動的意思

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

$ sudo ufw status
Status: active

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

我們需要使用 ufw enable 這個指令,整個防火牆才會啟動!另外要注意,如上所示,如果你是從外部連線到樹莓派來操作防火牆系統, 這個系統可能會先警告你,你的連線 (ssh) 可能會被抵擋!因此,請確定有人在樹莓派前!否則,如果被自己的防火牆擋住,會很慘! 最終使用『sudo ufw status verbose』,樹莓派就會告知,目前預設的政策是輸入拒絕 (deny, incoming),輸出放行 (allow, outgoing), 不准讓樹莓派變成路由器 (routed, disabled)。目前則是沒有其他規則存在就是了。

  • 進行服務、埠口的放行

要進行服務、埠口的放行,使用 allow 或者是拒絕的 deny 即可。舉例來說,你要讓你的樹莓派變成是可以提供 www 服務的伺服器, 而你知道 www 的服務協定名稱為 http ,那就可以這樣寫:

$ sudo ufw allow http
Rule added
Rule added (v6)

$ 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
80/tcp (v6)                ALLOW IN    Anywhere (v6)

你會發現, ufw 其實知道 http 是在 80/tcp 這個埠口上面的服務!相當有趣!如果你單純想要放行 123/udp 的埠口, 那也可以這樣處理:

$ sudo ufw allow 123/udp
Rule added
Rule added (v6)

$ 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
123/udp                    ALLOW IN    Anywhere
80/tcp (v6)                ALLOW IN    Anywhere (v6)
123/udp (v6)               ALLOW IN    Anywhere (v6)

如果要放行整段區域網路,那也很簡單,直接寫從哪裡來即可!例如放行我們剛剛提到的 192.168.0.0/16 這個網域:

$ sudo ufw allow from 192.168.0.0/16
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
123/udp                    ALLOW IN    Anywhere
Anywhere                   ALLOW IN    192.168.0.0/16
80/tcp (v6)                ALLOW IN    Anywhere (v6)
123/udp (v6)               ALLOW IN    Anywhere (v6)

最後,如果要混合一些規則,例如,針對 ssh 埠口,只放行 172.31.0.0/16 這一段來源使用的話,那就得要這樣做:

$ sudo ufw allow from 172.31.0.0/16 to any port ssh
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
123/udp                    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)
123/udp (v6)               ALLOW IN    Anywhere (v6)
  • 刪除錯誤的規則

有時候,我們可能會執行到錯誤的指令啦!這時候,可以透過 delete 來刪除掉錯誤的規則!例如,我們要刪除上面 123/udp 這個埠口的規則, 那簡單可以這樣做:

$ sudo ufw delete allow 123/udp
Rule deleted
Rule deleted (v6)

$ 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)

大概這樣就搞定了!

3.6: 當週實做

  1. 讓 ssh 這個服務是開啟、且開機會自動啟用
  2. 使用 ufw 防火牆機制,讓私有 IP 位址範圍,全部都可以使用 ssh 服務
  3. 使用 ufw 防火牆機制,拒絕 ssh 給全世界連線的功能

...