# 將 Ubuntu 桌機設置為 Router
由於公司的網路有限制哪些 MAC Address 才可連到外網,如果我的開發板直接接公司的 Switch,開發板就沒辦法連到外網,導致我的開發板如果需要安裝/更新軟體就會有點麻煩 >_<(不能直接 `sudo apt install`)
之後才知道可以將 Ubuntu 桌機設成 Router,桌機接一個 USB 網卡,讓桌機多一個 Network Interface,然後 USB 網卡再接網路線到開發板的 `wan` 接口,讓開發板在 LAN 內,然後透過桌機連到外網,所以就自己研究了一下怎麼設定~
## Network Diagram
接下來要做的設定如下圖:
![Picture1](https://hackmd.io/_uploads/rkfJE4R_C.png)
- 首先,我的桌機是接到辦公室的 switch,而這個 switch 管理著 `10.194.10.0/24` 這個 LAN,然後 switch 再透過 router 連到外網。
- 接下來,想讓開發板跟桌機之間建出一個 LAN,讓開發板跟桌機之間可以傳輸 packet,這個 LAN 把他設定成 `192.168.2.0/24`。
- 將 USB 網卡和桌機接在一起,這樣桌機就可以多出一個 network interface,這個 network interface 之後顯示出來的名稱就是圖中的 `enx00e04c78256e`,並將此 interface 的 IP address 設定為 `192.168.2.1`,此 interface 也就會是 `192.168.2.0/24` 這個 LAN 的 gateway。
- 將開發板(Marvell ESPRESSObin v7)的 `wan` 接口用網路線和前述的 USB 網卡接在一起,這樣就可以在同一個 LAN 裡面,並將開發板的 `wan` interface 的 IP address 設定為 `192.168.2.20`。
- 之後,開啟桌機 IP forward 的功能,這樣就可以將開發板傳來的 packet 轉發到另一個 network interface(也就是 `enp1s0`),並傳出去;也可以將從外網傳來欲傳給開發板的 packet,轉發到 `enx00e04c78256e` 這個 interface 讓開發板收到 packet。
<!-- ![Picture1](https://hackmd.io/_uploads/Bkurl40dC.png) -->
<!-- ![Picture1](https://hackmd.io/_uploads/HJVKJ4AdC.png) -->
## Ubuntu 桌機 Network Interface 設置
1. 將 USB 網卡接在電腦,並用網路線和開發板的 `wan` 接口連接。點 Ubuntu 右上角的 `設定`,在 `Wired` 的選項點選 `Wired Settings`。
![01](https://hackmd.io/_uploads/rkpLccMYA.png)
2. 點選 `USB Ethernet` 的 `設定`(齒輪的那個圖案)。
![02](https://hackmd.io/_uploads/rJPOc9fFA.png)
3. 手動設置 IP address 和 Netmask:
![03](https://hackmd.io/_uploads/BJOK95MYR.png)
- `IPv4 Method` 設定成 `Manual`,讓我們可以手動設置 IP address,而不是透過 DHCP server 分配 IP address。
- `Address` 設定一個 private address,也就是前面提到的 `192.168.2.1`
- 由於這個 LAN 是 `192.168.2.0/24`,前 24 個 bit 都是網路名稱,所以 `Netmask` 是 `255.255.255.0`。
:::warning
**Private IPv4 Addresses**
來複習一下有哪些 private address 可以使用,也就是被保留下來給想建置自己網路的人使用的~
PS. Private address 不可直接連到外網,若要連到外網,必須透過 NAT 才可以。
| | IP Address Range |
| -------- | -------- |
| Class A | `10.0.0.0` - `10.255.255.255` |
| Class B | `172.16.0.0` - `172.31.255.255` |
| Class C | `192.168.0.0` - `192.168.255.255` |
:::
<!--
:::info
請問在使用 private address space 時我們是不是可以將其任意 submask?像是若使用 192.168.0.0 - 192.168.255.255 的 private address space,雖然他是 Class C,netmask 是 255.255.0.0 (?),但假如我要將 192.168.2.0 當作 network number,我就可以將其 submask,這樣的話 netmask 就會是 255.255.255.0
您的理解基本正確,但有一些需要澄清的細節。首先,192.168.0.0/16 的地址範圍確實屬於私有地址空間,它經常被用於家庭和企業內部網絡。這個範圍通常被認為是 Class C 地址,但在無類別域間路由(CIDR)引入之後,網絡划分不再受限於傳統的 Class A、B、C 類別。
### CIDR 和子網划分
在 CIDR 中,您可以根據需要將任何 IP 地址範圍進行子網划分,不必遵循傳統的 Class A、B、C 網絡劃分規則。這意味著對於 192.168.0.0/16 這個範圍,您完全可以按需劃分子網。例如:
- 如果您選擇 `192.168.2.0` 作為網絡號,並希望這個子網有 256 個可能的主機地址,則子網遮罩可以設置為 `255.255.255.0`(即 `/24`),這樣就創建了一個子網,範圍是 `192.168.2.0` 到 `192.168.2.255`,其中 `192.168.2.0` 是網絡地址,`192.168.2.255` 是廣播地址。
### 實際應用
在實際應用中,您可以根據網絡規模和需求自由選擇子網遮罩。例如:
- 小型家庭網絡可能只需要幾個 IP 地址,所以可以選擇更小的子網,如 `/29` 或 `/30`。
- 大型企業可能需要更大的網段,可以選擇 `/23`、`/22` 甚至更大的子網遮罩來包含更多的 IP 地址。
### 注意事項
選擇子網遮罩時,需要確保子網劃分滿足網絡的需求,並考慮未來擴展的可能性。不合理的子網劃分可能導致 IP 地址浪費或未來擴展困難。
總之,您可以自由地對私有 IP 地址範圍進行任意細致的子網划分,這給網絡管理帶來了很大的靈活性。
:::
-->
## Ubuntu 桌機開啟 Router 功能
1. 啟用 IP Forwarding 功能:
- 編輯 `/etc/sysctl.conf` 檔案,找到以下這段,將其取消註釋(若找不到則添加以下內容):
```conf
net.ipv4.ip_forward=1
```
- 執行以下指令使其生效:
```shell
$ sudo sysctl -p
net.ipv4.ip_forward = 1
```
2. 查看 Network interface:
```ip
$ ip route
default via 10.194.10.1 dev enp1s0 proto dhcp src 10.194.10.72 metric 100
10.194.10.0/24 dev enp1s0 proto kernel scope link src 10.194.10.72 metric 100
10.218.136.0/24 dev lxdbr0 proto kernel scope link src 10.218.136.1
192.168.2.0/24 dev enx00e04c78256e proto kernel scope link src 192.168.2.1 metric 101
$ ip route show default
default via 10.194.10.1 dev enp1s0 proto dhcp src 10.194.10.72 metric 100
```
- 從 `ip route` 可以看到 default routing 的 gateway IP address 是 `10.194.10.1`。這樣的話,當這台電腦要發送沒有在本地電腦 routing table 中指定的目的地的 packet 時,就會送到 default routing,也就是會經由 `enp1s0` 這個 interface 送出,而此 interface 的 IP 是 `10.194.10.72`。這樣即能確保未指定特定 routing 的 packet 會被送到 `10.194.10.1`。
- 第二條 routing rule 代表著:假如本機需要發送一個 packet 到 `10.194.10.0/24` 這個 network,那本機就會透過 `enp1s0` 這個 network interface 將 packet 送出。而從這個 network interface 發送的 packet 會被設定成以 `10.194.10.72` 為 source IP。
- 第三第四條 routing rule 則依此類推。
```ip
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 38:d5:47:0f:b2:54 brd ff:ff:ff:ff:ff:ff
inet 10.194.10.72/24 brd 10.194.10.255 scope global dynamic noprefixroute enp1s0
valid_lft 2569071sec preferred_lft 2569071sec
inet6 fe80::3ad5:47ff:fe0f:b254/64 scope link
valid_lft forever preferred_lft forever
3: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:16:3e:cb:62:a3 brd ff:ff:ff:ff:ff:ff
inet 10.218.136.1/24 scope global lxdbr0
valid_lft forever preferred_lft forever
inet6 fd42:73ee:86e:2c5d::1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fecb:62a3/64 scope link
valid_lft forever preferred_lft forever
5: veth9233397e@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000
link/ether 0e:4c:51:eb:bb:82 brd ff:ff:ff:ff:ff:ff link-netnsid 0
7: veth089791db@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000
link/ether d2:f9:42:22:6d:55 brd ff:ff:ff:ff:ff:ff link-netnsid 1
12: enx00e04c78256e: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0e:c6:f0:22:9a brd ff:ff:ff:ff:ff:ff
inet 192.168.2.1/24 brd 192.168.2.255 scope global noprefixroute enx00e04c78256e
valid_lft forever preferred_lft forever
inet6 fe80::4a67:4a0f:6cc5:c43f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
```
- 由於前面有手動設定 `USB Ethernet` 的 IP address 是 `192.168.2.1`,且 netmask 為 `255.255.255.0`,那從 `ip a` 這個指令就可看到,這個設定被 apply 到 `enx00e04c78256e` 這個 network interface。
- 從 `ip route` 知道,default routing 是經由 `enp1s0` 這個 network interface 送出。所以 packet 若需要送到外網,就必須透過 `enp1s0` 這個 interface 發送。
從 `ip a` 知道,`enx00e04c78256e` 這個 interface 會是開發板所在的 LAN 的 gateway 的 interface。所以若是要轉發給開發板的 packet,都要透過 `enx00e04c78256e` 這個 interface 發送。
3. 設定 NAT(Network Address Translation):
使用以下指令設置一個 NAT 規則,讓內網的裝置的 packet 可以經由 `enp1s0` 這個 interface 送到外網:
```shell
$ sudo iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE
```
- `iptables`:
- 使用 `iptables` 這個工具,這個工具在 Linux 主要負責防火牆和 IP Address 轉換等許多功能。
- `-t nat`:
- `iptables` 內有一些 tables,table 是規則的集合的分類,每個 table 含有特定類型的規則。
- 這裡指定要設定 `nat` 這個 table,`nat` 就是負責 Network Address Translation。
- `-A POSTROUTING`:
- `POSTROUTING` 是 `iptables` 的 chain,chain 是一系列的規則的集合,這些規則決定怎麼處理通過 network interface 的 packet。
每個 `iptables` 的 table 會含有若干個 chains,也就是會依據每個 chain 處理 packet 的功能將 chain 分類到不同 table,而每個 chain 負責處理特定類型的 packet。
- `POSTROUTING` 是針對離開本機的 packet 的規則。更準確地來說是在已經完成 routing decision 之後、但 packet 實際離開 network interface 之前的最後一個處理點。處理所有即將離開本機的 packet,包括從本機發出的和被轉發的 packet。
- 這選項就是說在 `POSTROUTING` 這個 chain 添加(`A`ppend)一個規則,這個規則是 `-o enp1s0 -j MASQUERADE`。
- `-o enp1s0`:
- 這個規則只對從 `enp1s0` 這個 interface 送出去的 packet 有效。
- `-j MASQUERADE`:
- `j`ump 到 `MASQUERADE`。`MASQUERADE` 是 `iptables` 的一個 `target`,`target` 是一個 "操作"。`MASQUERADE` 這個操作會做 address 偽裝,也就是將 packet 的 source address 改成 output interface 的 IP address,以這個例子來講,就是 `enp1s0` 這個 interface 的 address。
- `MASQUERADE` 大多用在動態分配 IP address 的情況,像是藉由 DHCP 取得 IP Address。
- 所以這個指令是說,我要用 `iptables` 這個工具,且對 `iptables` 的 `nat` 這個 table 做操作:
我們要在 `nat` table 的 `POSTROUTING` chain 添加一個 rule(`POSTROUTING` 處理的是要離開本機的 packet),這個 rule 只對從 `enp1s0` 出去的 packet 有效。而這個 rule 就是:
從 `enp1s0` 這個 interface 出去的 packet 都要做 `MASQUERADE`,`MASQUERADE` 就是將這些 packet 的 IP 改成 `enp1s0` 這個 interface 的 IP address。
4. 執行以下兩個指令新增防火牆的規則:
```shell
$ sudo iptables -A FORWARD -i enx00e04c78256e -o enp1s0 -j ACCEPT
$ sudo iptables -A FORWARD -i enp1s0 -o enx00e04c78256e -m state --state ESTABLISHED,RELATED -j ACCEPT
```
第一個指令:
- `-A FORWARD`:
- 添加規則到 `FORWARD` chain。
- `FORWARD` chain 處理的是經過本機,但不是源自於本機,也不以本機為目的地的 packet,也就是這些 packet 只是經過這台機器。
- `FORWARD` chain 屬於 `filter` 這個 table。可以看到這兩個指令都沒指定 table,這是因為若沒有使用 `-t` 指定哪個 table,那預設就會使用 `filter` table。
- `-i enx00e04c78256e -o enp1s0`:
- 這條規則適用於從 `enx00e04c78256e` interface 進入的 packet,且要從 `enp1s0` interface 出去的 packet。
- `-j ACCEPT`:
- 接受從 `enx00e04c78256e` interface 進入,且要從 `enp1s0` interface 出去的 packet,也就是允許這樣的 packet 通過。
- 所以這條指令是說,使用 `iptables` 這個工具,對 `FORWARD` chain 添加一條規則,`FORWARD` chain 是處理經過這台機器的 packet,而這個添加的規則就是允許從 `enx00e04c78256e` interface 進入且要從 `enp1s0` interface 出去的 packet 通過。
第二個指令:
- `-A FORWARD`:
- 添加規則到(`filter` table 的)`FORWARD` chain。
- `-i enp1s0 -o enx00e04c78256e`:
- 這條規則適用於從 `enp1s0` interface 進入且要從 `enx00e04c78256e` interface 出去的 packet。
- `-m state --state ESTABLISHED,RELATED`:
- `iptables` 有許多可以用來 matching 的 module,讓我們可以決定要針對有哪些屬性的 packet 來做操作。
- 這個選項就是說,我要使用的 `m`atching module 是 `state` 這個 matching module。`state` 這個 matching module 讓我們可以選擇特定連線狀態的 packet,而我們要的是 `ESTABLISHED` 和 `RELATED` 這兩種連線狀態的 packet。
- `ESTABLISHED` 是指這個 packet 屬於已經建立的連線,像是已經完成 TCP three way hand shake 的連線的 packet 就是一種。
`RELATED` 是指與一個已經建立的連線有關,但不屬於該連線的 packet。
- Packet 的 `state` 的資訊並不存在 packet 本身裡面,而是 Linux kernel 的 `conntrack` 這個 module 所 maintain 的。當 packet 通過時,`conntrack` 會依據 packet 的一些資訊,像是 source/target IP、port number、protocol 等等來辨識和追蹤連線。
- `-j ACCEPT`:
- 符合前面所指定的 packet,就允許讓它通過。
- 所以第二個指令就是說,使用 `iptables` 這個工具,對 `FORWARD` chain 添加一條規則,`FORWARD` chain 是處理經過這台機器的 packet。而這個添加的規則就是對於從 `enp1s0` interface 進入且要從 `enx00e04c78256e` interface 出去的 packet,且 packet 的狀態是 `ESTABLISHED` 和 `RELATED` 狀態的 packet,那我們就允許這樣的 packet 通過。
這兩條規則就實現了防火牆的基本規則:
- 允許內網的裝置發起的連線通過防火牆。
- 允許回應內網請求的 packet 通過。
- 不允許外網主動發起的新連線到內網。
5. 儲存設定的 `iptables` rules:
由於 `iptables` 的 rules 是存在 memory 內,所以每次重開機都會消失,可以使用以下指令安裝 `iptables-persistent` 並儲存目前的 rules,這樣在系統啟動時就會自動載入儲存的 rules:
```shell
$ sudo apt install iptables-persistent
$ sudo netfilter-persistent save
```
- Rules 會被儲存到 `/etc/iptables/rules.v4` 和 `/etc/iptables/rules.v6`
- 系統啟動時,`iptables-persistent` 會自動從這兩份文件內載入 rules。
6. 檢查 Ubuntu 桌機的網路設定:
a. 執行以下指令確認開啟 IP Forwarding 功能:
```shell
$ sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
```
- 應該要可以看到 `net.ipv4.ip_forward = 1` 這個輸出結果,若沒有則用以下指令啟動 IP Forwarding:
```shell
$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
```
b. 檢查 NAT 設定:
```shell
$ sudo iptables -t nat -L -v
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 358 packets, 72983 bytes)
pkts bytes target prot opt in out source destination
593 211K MASQUERADE all -- any enp1s0 anywhere anywhere
```
- 確保要有類似以下的規則:
```shell
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
593 211K MASQUERADE all -- any enp1s0 anywhere anywhere
```
- 若沒有,則添加規則:
```shell
$ sudo iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE
```
## 開發板的資訊
我用的開發板是 Marvell ESPRESSObin v7,以下是他的硬體規格、以及我安裝在上面的 Linux distribution 和 Kernel 資訊:
```shell
root@espressobin:~# lscpu
Architecture: aarch64
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: ARM
Model: 4
Model name: Cortex-A53
Stepping: r0p4
CPU max MHz: 1200.0000
CPU min MHz: 200.0000
BogoMIPS: 25.00
NUMA node0 CPU(s): 0,1
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
root@espressobin:~# uname -ra
Linux espressobin 4.18.0 #1 SMP PREEMPT Wed Jun 26 15:52:13 CST 2024 aarch64 GNU/Linux
root@espressobin:~# cat /proc/version
Linux version 4.18.0 (cpt1020@cpt1020) (gcc version 13.2.0 (Ubuntu 13.2.0-23ubuntu4)) #1 SMP PREEMPT Wed Jun 26 15:52:13 CST 2024
root@espressobin:~# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```
接下來分別使用 `NetworkManager` 和 `ip` 這兩個網路管理工具做設置讓開發板經由前面設置的 Ubuntu 主機可以連到外網~
## 使用 NetworkManager 設置開發板的網路
:::info
`NetworkManager`、`ip`、`ifconfig` 都是網路管理的工具。
- `NetworkManager` 的使用比較簡單,適合用在動態的網路環境。
- `nmcli` 是 `NetworkManager` 的 command line 工具,可用它對 `NetworkManager` 做設定。
- `ip` 和 `ifconfig` 則算是比較傳統的設定網路的工具。
:::
<!-- 安裝 `NetworkManager`:
```shell
$ sudo apt install network-manager
``` -->
開發板上安裝的 `NetworkManager` 的版本:
```shell
root@espressobin:~# NetworkManager --version
1.14.6
root@espressobin:~# NetworkManager --print-config
# NetworkManager configuration: /etc/NetworkManager/NetworkManager.conf (lib: no-mac-addr-change.conf)
[main]
# rc-manager=resolvconf
# auth-polkit=true
# dhcp=dhclient
plugins=ifupdown,keyfile
[ifupdown]
managed=false
[logging]
# backend=journal
# audit=true
[device-mac-addr-change-wifi]
match-device=driver:rtl8723bs,driver:rtl8189es,driver:r8188eu,driver:8188eu,driver:eagle_sdio,driver:wl
wifi.scan-rand-mac-address=no
wifi.cloned-mac-address=preserve
ethernet.cloned-mac-address=preserve
```
### 使用 `nmcli` 設定 `NetworkManeger`
以下僅是一些 `nmcli` 基本的指令示範:
- 查看目前的網路連線:
```shell
root@espressobin:~# nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 3ff64b66-ef39-4187-83b3-0dc3a18e503d ethernet wan
Wired connection 2 31a4f694-90e3-37a0-9c3a-9b3e6ddda1d8 ethernet --
```
可以看到目前有兩個有線網路的設定:
- 這兩個有線網路的 `TYPE` 都是 `ethernet`。
- 從 `DEVICE` 欄位可以看到,`Wired connection 1` 已經分配給 `wan`,這代表 `wan` interface 正在使用此連線,所以可以使用此連線來連到網路,且應該已經在使用中。
- `Wired connection 2` 也是一個有線網路連線,但是目前沒有分配給任何網路 interface。
- `UUID` 只是給這個網路連線的一個識別碼,之後即使有多的網路連線的名稱相同,還是可以靠 `UUID` 來作識別。
- 用以下指令檢查目前使用的是哪個連線:
```shell
root@espressobin:~# nmcli c show --active
NAME UUID TYPE DEVICE
Wired connection 1 3ff64b66-ef39-4187-83b3-0dc3a18e503d ethernet wan
```
可以看到目前是用 `Wired connection 1`。
- 查看目前的連線狀態:
```shell
root@espressobin:~# nmcli device
DEVICE TYPE STATE CONNECTION
wan ethernet connected Wired connection 1
eth0 ethernet disconnected --
lan0 ethernet unavailable --
lan1 ethernet unavailable --
lo loopback unmanaged --
```
- 啟動/關閉某個網路連線:
```shell
$ nmcli connection down 'Wired connection 2'
$ nmcli connection up 'Wired connection 1'
```
- 刪除網路連線:
```shell
$ nmcli connection delete 'Wired connection 2'
```
- 新增網路連線:
```shell!
$ nmcli connection add type ethernet ifname wan con-name 'Wired connection 1' ipv4.method manual ipv4.addresses 192.168.2.20/24 ipv4.gateway 192.168.2.1 ipv4.dns 8.8.8.8
```
這個新增的指令會一併給此網路連線做以下設定:
- `type ethernet`:指定這是一個 Ethernet 連線。
- `ifname wan`:指定這個連線要用在 `wan` 這個 interface。
- `con-name 'Wired connection 1'`:connection name 為 `Wired connection 1`。
- `ipv4.method manual`:手動設置 IP,而不是使用 DHCP Server 自動分配 IP。
- `ipv4.addresses 192.168.2.20/24`:設定 IPv4 的 IP 為 `192.168.2.20`,以及 network number 是 24 個 bit。
- 所以這個網路的 network address 是 `192.168.2.0`,Network Mask 是 `255.255.255.0`。
- `192.168.2.255` 是 Broadcast number。
- 這個網路有 254 個可用 IP address(`192.168.2.1` 至 `192.168.2.254`)可以分配給裝置。
- `ipv4.gateway 192.168.2.1`:設定 gateway 的 IP,也就是 Router 的 IP。
- `ipv4.dns 8.8.8.8`:設定 DNS 的 IP,此 IP 是 Google 的公共 DNS 伺服器之一。
### 修改網路連線
我們可以經由進入 `nmcli` 互動模式來修改某一個網路連線的設定。假設目前有的網路連線如下:
```shell
root@espressobin:~# nmcli c show
NAME UUID TYPE DEVICE
Wired connection 1 7d44bc99-e8a5-40e8-99bf-20475a0833ae ethernet eth0
```
我們想要修改 `Wired connection 1` 這個連線,那就用以下指令進入 `nmcli` 互動模式來指定要修改某個連線:
```shell
$ nmacli c edit <uuid>
```
例如:
```shell
root@espressobin:~# nmcli c edit 7d44bc99-e8a5-40e8-99bf-20475a0833ae
===| nmcli interactive connection editor |===
Editing existing '802-3-ethernet' connection: '7d44bc99-e8a5-40e8-99bf-20475a0833ae'
Type 'help' or '?' for available commands.
Type 'print' to show all the connection properties.
Type 'describe [<setting>.<prop>]' for detailed property description.
You may edit the following settings: connection, 802-3-ethernet (ethernet), 802-1x, dcb, sriov, ethtool, match, ipv4, ipv6, tc, proxy
```
這樣就進入了 `nmcli` 的互動模式,且正在編輯 `7d44bc99-e8a5-40e8-99bf-20475a0833ae` 這個連線。
輸入 `print` 會顯示這個網路連線詳細的資訊:
```nmcli
nmcli> print
===============================================================================
Connection profile details (Wired connection 1)
===============================================================================
connection.id: Wired connection 1
connection.uuid: 7d44bc99-e8a5-40e8-99bf-20475a0833ae
connection.stable-id: --
connection.type: 802-3-ethernet
connection.interface-name: --
connection.autoconnect: yes
connection.autoconnect-priority: 0
connection.autoconnect-retries: -1 (default)
connection.multi-connect: 0 (default)
connection.auth-retries: -1
connection.timestamp: 0
connection.read-only: no
connection.permissions: --
connection.zone: --
connection.master: --
connection.slave-type: --
connection.autoconnect-slaves: -1 (default)
connection.secondaries: --
connection.gateway-ping-timeout: 0
connection.metered: unknown
connection.lldp: default
connection.mdns: -1 (default)
connection.llmnr: -1 (default)
-------------------------------------------------------------------------------
802-3-ethernet.port: --
802-3-ethernet.speed: 0
802-3-ethernet.duplex: --
802-3-ethernet.auto-negotiate: no
802-3-ethernet.mac-address: --
802-3-ethernet.cloned-mac-address: --
802-3-ethernet.generate-mac-address-mask:--
802-3-ethernet.mac-address-blacklist: --
802-3-ethernet.mtu: auto
802-3-ethernet.s390-subchannels: --
802-3-ethernet.s390-nettype: --
802-3-ethernet.s390-options: --
802-3-ethernet.wake-on-lan: default
802-3-ethernet.wake-on-lan-password: --
-------------------------------------------------------------------------------
ipv4.method: auto
ipv4.dns: --
ipv4.dns-search: --
ipv4.dns-options: ""
ipv4.dns-priority: 0
ipv4.addresses: --
ipv4.gateway: --
ipv4.routes: --
ipv4.route-metric: -1
ipv4.route-table: 0 (unspec)
ipv4.ignore-auto-routes: no
ipv4.ignore-auto-dns: no
ipv4.dhcp-client-id: --
ipv4.dhcp-timeout: 0 (default)
ipv4.dhcp-send-hostname: yes
ipv4.dhcp-hostname: --
ipv4.dhcp-fqdn: --
ipv4.never-default: no
ipv4.may-fail: yes
ipv4.dad-timeout: -1 (default)
-------------------------------------------------------------------------------
ipv6.method: auto
ipv6.dns: --
ipv6.dns-search: --
ipv6.dns-options: ""
ipv6.dns-priority: 0
ipv6.addresses: --
ipv6.gateway: --
ipv6.routes: --
ipv6.route-metric: -1
ipv6.route-table: 0 (unspec)
ipv6.ignore-auto-routes: no
ipv6.ignore-auto-dns: no
ipv6.never-default: no
ipv6.may-fail: yes
ipv6.ip6-privacy: -1 (unknown)
ipv6.addr-gen-mode: stable-privacy
ipv6.dhcp-duid: --
ipv6.dhcp-send-hostname: yes
ipv6.dhcp-hostname: --
ipv6.token: --
-------------------------------------------------------------------------------
proxy.method: none
proxy.browser-only: no
proxy.pac-url: --
proxy.pac-script: --
-------------------------------------------------------------------------------
```
用以下指令將 `connection.interface-name` 設定成 `wan`:
```nmcli
nmcli> set connection.interface-name wan
```
用以下指令將 `ipv4.method` 從 `auto` 改成 `manual`,因為我們想要手動設置 IPv4 address:
```nmcli
nmcli> set ipv4.method manual
```
用以下指令設定 `ipv4.addresses` 為 `192.168.2.20/24`:
```nmcli
nmcli> set ipv4.addresses 192.168.2.20/24
```
用以下指令設定 `ipv4.gateway` 為 `192.168.2.1`:
```nmcli
nmcli> set ipv4.gateway 192.168.2.1
```
再 `print` 一次,確認有真的修改此網路連線:
```nmcli
nmcli> print
===============================================================================
Connection profile details (Wired connection 1)
===============================================================================
connection.id: Wired connection 1
connection.uuid: 7d44bc99-e8a5-40e8-99bf-20475a0833ae
connection.stable-id: --
connection.type: 802-3-ethernet
connection.interface-name: wan
connection.autoconnect: yes
connection.autoconnect-priority: 0
connection.autoconnect-retries: -1 (default)
connection.multi-connect: 0 (default)
connection.auth-retries: -1
connection.timestamp: 0
connection.read-only: no
connection.permissions: --
connection.zone: --
connection.master: --
connection.slave-type: --
connection.autoconnect-slaves: -1 (default)
connection.secondaries: --
connection.gateway-ping-timeout: 0
connection.metered: unknown
connection.lldp: default
connection.mdns: -1 (default)
connection.llmnr: -1 (default)
-------------------------------------------------------------------------------
802-3-ethernet.port: --
802-3-ethernet.speed: 0
802-3-ethernet.duplex: --
802-3-ethernet.auto-negotiate: no
802-3-ethernet.mac-address: --
802-3-ethernet.cloned-mac-address: --
802-3-ethernet.generate-mac-address-mask:--
802-3-ethernet.mac-address-blacklist: --
802-3-ethernet.mtu: auto
802-3-ethernet.s390-subchannels: --
802-3-ethernet.s390-nettype: --
802-3-ethernet.s390-options: --
802-3-ethernet.wake-on-lan: default
802-3-ethernet.wake-on-lan-password: --
-------------------------------------------------------------------------------
ipv4.method: manual
ipv4.dns: --
ipv4.dns-search: --
ipv4.dns-options: ""
ipv4.dns-priority: 0
ipv4.addresses: 192.168.2.20/24
ipv4.gateway: 192.168.2.1
ipv4.routes: --
ipv4.route-metric: -1
ipv4.route-table: 0 (unspec)
ipv4.ignore-auto-routes: no
ipv4.ignore-auto-dns: no
ipv4.dhcp-client-id: --
ipv4.dhcp-timeout: 0 (default)
ipv4.dhcp-send-hostname: yes
ipv4.dhcp-hostname: --
ipv4.dhcp-fqdn: --
ipv4.never-default: no
ipv4.may-fail: yes
ipv4.dad-timeout: -1 (default)
-------------------------------------------------------------------------------
ipv6.method: auto
ipv6.dns: --
ipv6.dns-search: --
ipv6.dns-options: ""
ipv6.dns-priority: 0
ipv6.addresses: --
ipv6.gateway: --
ipv6.routes: --
ipv6.route-metric: -1
ipv6.route-table: 0 (unspec)
ipv6.ignore-auto-routes: no
ipv6.ignore-auto-dns: no
ipv6.never-default: no
ipv6.may-fail: yes
ipv6.ip6-privacy: -1 (unknown)
ipv6.addr-gen-mode: stable-privacy
ipv6.dhcp-duid: --
ipv6.dhcp-send-hostname: yes
ipv6.dhcp-hostname: --
ipv6.token: --
-------------------------------------------------------------------------------
proxy.method: none
proxy.browser-only: no
proxy.pac-url: --
proxy.pac-script: --
-------------------------------------------------------------------------------
```
從以上結果可以看到確實有依照我們的設定做修改。
接下來用 `save` 將此設定儲存,並用 `quit` 退出 `nmcli` 的互動模式:
```nmcli
nmcli> save
Connection 'Wired connection 1' (7d44bc99-e8a5-40e8-99bf-20475a0833ae) successfully updated.
nmcli> quit
```
更改設定後可能會需要重新啟動該網路連線才能使剛才的更改生效:
```shell
$ nmcli c down 7d44bc99-e8a5-40e8-99bf-20475a0833ae
$ nmcli c up 7d44bc99-e8a5-40e8-99bf-20475a0833ae
```
此時用 ip route 檢查,就可看到有 default gateway 了:
```shell
root@espressobin:~# ip route
default via 192.168.2.1 dev wan proto static metric 100
192.168.2.0/24 dev wan proto kernel scope link src 192.168.2.20 metric 100
```
用 `ping` 檢查確認可以通到外網:
```shell
root@espressobin:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=61 time=11.1 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=61 time=7.35 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=61 time=30.1 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 7.345/16.170/30.051/9.935 ms
root@espressobin:~# ping google.com
PING google.com (142.251.42.238) 56(84) bytes of data.
64 bytes from tsa01s11-in-f14.1e100.net (142.251.42.238): icmp_seq=1 ttl=61 time=12.5 ms
64 bytes from tsa01s11-in-f14.1e100.net (142.251.42.238): icmp_seq=2 ttl=61 time=43.4 ms
64 bytes from tsa01s11-in-f14.1e100.net (142.251.42.238): icmp_seq=3 ttl=61 time=47.4 ms
64 bytes from tsa01s11-in-f14.1e100.net (142.251.42.238): icmp_seq=4 ttl=61 time=18.7 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 12.512/30.510/47.426/15.137 ms
```
:::info
除了進入 `nmcli` 互動模式做修改,我們也可以用以下方式不進入互動模式做修改,以下是一些例子:
- 修改連線名稱:
```shell
$ nmcli connection modify 'Wired connection 1' connection.id 'My Connection'
```
- 將 `Wired connection 1` 設定為自動連線:
```shell
$ nmcli connection modify "Wired connection 1" connection.autoconnect yes
```
- 將 `Wired connection 1` 設定為使用 `wan` interface:
```shell
$ nmcli connection modify "Wired connection 1" connection.interface-name wan
```
:::
## 使用 `ip` 設置開發板的網路
### 1. 先檢查目前網路的狀態
用以下指令查看目前的網路狀態:
```shell
$ ip addr show
## 或者是
$ ip a
```
```shell
root@espressobin:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 532
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
3: wan@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
4: lan0@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
5: lan1@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
root@espressobin:~# ip route
root@espressobin:~#
```
可以看到目前 `eth0` 和 `wan` 這兩個 interface 都是 `DOWN`,沒有被啟動,且 `ip route` 沒有任何資訊。
### 2. 啟動 `eth0` 和 `wan`
用以下指令啟動 `eth0` 和 `wan`:
```shell
root@espressobin:~# ip link set eth0 up
[ 212.774156] mvneta d0030000.ethernet eth0: configuring for fixed/rgmii-id link mode
[ 212.779258] mvneta d0030000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
root@espressobin:~# ip link set wan up
[ 216.819665] mv88e6085 d0032004.mdio-mii:01 wan: configuring for phy/ link mode
[ 216.824506] IPv6: ADDRCONF(NETDEV_UP): wan: link is not ready
[ 220.913300] mv88e6085 d0032004.mdio-mii:01 wan: Link is Up - 1Gbps/Full - flx
[ 220.919177] IPv6: ADDRCONF(NETDEV_CHANGE): wan: link becomes ready
root@espressobin:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 532
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
inet6 fe80::34f5:56ff:fe18:e746/64 scope link
valid_lft forever preferred_lft forever
3: wan@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 10
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
inet6 fe80::34f5:56ff:fe18:e746/64 scope link
valid_lft forever preferred_lft forever
4: lan0@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
5: lan1@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
```
### 3. 手動設置 IP、Gateway、以及 DNS Server
用以下指令設置 IP 和 Gateway:
```shell
root@espressobin:~# ip addr add 192.168.2.20/24 dev wan
root@espressobin:~# ip route add default via 192.168.2.1
```
- 第一個指令是將 `192.168.2.20` 這個 IP address 配置到 `wan` 這個 network interface,且 netmask 是 `255.255.255.0`。
- 第二個指令是設定 default gateway 為 `192.168.2.1`,也就是前面設定的 Ubuntu 主機的 `enx00e04c78256e` interface 的 IP address。
- 所有未明確指定 routing 的 packet 都會送到這個 default gateway。
用以下指令指定說要使用 Google 的 DNS server:
```shell
$ sh -c 'echo "nameserver 8.8.8.8" >> /etc/resolv.conf'
```
檢查設置的結果:
```shell
root@espressobin:~# ip route
default via 192.168.2.1 dev wan
192.168.2.0/24 dev wan proto kernel scope link src 192.168.2.20
root@espressobin:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 532
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
inet6 fe80::34f5:56ff:fe18:e746/64 scope link
valid_lft forever preferred_lft forever
3: wan@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 10
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.20/24 scope global wan
valid_lft forever preferred_lft forever
inet6 fe80::34f5:56ff:fe18:e746/64 scope link
valid_lft forever preferred_lft forever
4: lan0@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
5: lan1@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 36:f5:56:18:e7:46 brd ff:ff:ff:ff:ff:ff
```
### 4. 用 `ping` 做檢查
```shell
root@espressobin:~# ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=0.651 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=0.560 ms
64 bytes from 192.168.2.1: icmp_seq=3 ttl=64 time=0.529 ms
^C
--- 192.168.2.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 59ms
rtt min/avg/max/mdev = 0.529/0.580/0.651/0.051 ms
root@espressobin:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=6.79 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=54 time=6.15 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=54 time=6.98 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 6.154/6.643/6.982/0.354 ms
root@espressobin:~# ping google.com
PING google.com (142.251.43.14) 56(84) bytes of data.
64 bytes from tsa03s08-in-f14.1e100.net (142.251.43.14): icmp_seq=1 ttl=54 time=6.39 ms
64 bytes from tsa03s08-in-f14.1e100.net (142.251.43.14): icmp_seq=2 ttl=54 time=5.91 ms
64 bytes from tsa03s08-in-f14.1e100.net (142.251.43.14): icmp_seq=3 ttl=54 time=7.19 ms
^C
--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 5.914/6.497/7.192/0.531 ms
```
從 `ping` 的結果確認可以連到桌機,也可以連到外網,且也能連到 DNS Server。
且從桌機也可以用 `ssh` 連到開發板:
```shell
cpt1020@cpt1020: ~ $ ssh root@192.168.2.20
root@192.168.2.20's password:
Linux espressobin 4.18.0 #3 SMP PREEMPT Tue Jul 2 17:54:09 CST 2024 aarch64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Jul 3 07:00:19 2024
root@espressobin:~#
```
### 寫成 Shell Function 啟動網路
由於每次開機都要手動輸入這些 `ip` 的指令,有點麻煩,可以把這些指令寫在 `~/.bashrc` 並且用 shell function 包起來(如下),之後每次開機只要輸入 `network_start` 即可~
```shell
network_start() {
ip link set eth0 up
ip link set wan up
ip addr add 192.168.2.20/24 dev wan
sleep 5
ip route add default via 192.168.2.1
}
```
之所以有用 `sleep 5` 是因為我的開發板在啟動 `wan` 時,它大概要三四秒才會 `wan: link becomes ready`,若還沒 `wan: link becomes ready` 就執行 `ip route add default via 192.168.2.1`,會沒有效果,所以才讓他等個五秒才執行最後一個指令。
<!-- ## $Acknowledgements$
感謝主管 Eric 耐心地指導,讓我對這些過程和步驟更加瞭解~也讓我能將之前研究所修網路課的知識實際應用在實務上~ -->
<!--
:::info
從你提供的 `ip a` 命令的結果來看,要判斷哪個網絡接口(interface)連接到外網,哪個接口連接到內網,主要需要觀察 IP 地址配置和網絡的布局。以下是對每個接口的分析:
### 接口分析
1. **enp1s0**:
- IP 地址:`10.194.10.72/24`,廣播地址(Broadcast):`10.194.10.255`
- 這個地址屬於私有地址範圍,通常用於內部網絡。然而,由於這個接口的 IP 是動態配置(dynamic),很有可能這個接口是連接到了外部網絡,並從一個 DHCP 服務器獲得 IP 地址。
2. **lxdbr0**:
- IP 地址:`10.218.136.1/24`
- 這是一個 Linux 容器使用的橋接網絡接口。通常,這種接口是用於容器間的內部網絡通信,不直接連接到外網。
3. **veth9233397e** 和 **veth089791db**:
- 這些是虛擬以太網接口,通常與 lxdbr0 橋接。它們同樣用於 Linux 容器或虛擬機的內部網絡,不直接連接到外網。
4. **enx000ec6f0229a**:
- IP 地址:`192.168.2.1/24`,廣播地址:`192.168.2.255`
- 這同樣是一個私有地址範圍,通常用於內部網絡。這個接口可能用於本地網絡(例如家庭或辦公室局域網)的路由器或交換機的連接。
### 確認外網連接
要確認哪個接口連接到外網,可以檢查默認路由設定,因為默認路由通常指向外網的網關。使用以下命令檢查:
```sh
ip route show default
```
這個命令會顯示配置為默認網關的接口。通常,連接到外網的接口會被設置為默認網關。
### 總結
從 IP 配置來看,`enp1s0` 很可能是連接到外網的接口,因為它使用動態 IP。`enx000ec6f0229a` 有固定的私有 IP,可能是用於內網或特定設備的接口。`lxdbr0` 和 `veth*` 接口主要用於內部或虛擬機容器網絡,通常不直接連接到外網。要確切知道哪個接口連接到外網,還需查看路由表配置。
您的問題非常詳細,讓我一一回答:
### 1. `enp1s0` 接口從 DHCP 獲得 IP 地址的判斷
從您提供的 `ip a` 輸出中的這一行可以看出:
```
inet 10.194.10.72/24 brd 10.194.10.255 scope global dynamic noprefixroute enp1s0
```
其中,`dynamic` 這個詞表明 IP 地址是動態分配的,通常這意味著這個地址是通過 DHCP (Dynamic Host Configuration Protocol) 獲得的。
### 2. 私有地址空間的劃分
您正確地指出,`10.0.0.0 - 10.255.255.255` 是屬於私有地址範圍的 Class A 地址空間。在您的例子中,`10.194.10.0/24` 確實表示這是一個使用 24 位子網遮罩的網絡,這個子網遮罩將 IP 地址範圍限制在 `10.194.10.0` 到 `10.194.10.255`。在這個範圍內,`10.194.10.0` 是網絡地址,`10.194.10.255` 是廣播地址,因此可用的主機地址範圍是 `10.194.10.1` 到 `10.194.10.254`,共有 254 個可能的地址。
### 3. `lxdbr0` 的用途
是的,`lxdbr0` 通常用於 Linux 容器工具 LXD。它是一個虛擬的網橋接口,用於管理 LXD 容器間的網絡連接。這種設置允許容器通過這個虛擬橋接器與外部網絡或其他容器通信。
### 4. `veth9233397e` 和 `veth089791db` 接口的作用
這些 `veth` 接口是虛擬以太網接口,通常用於容器之間或容器與主機之間的網絡橋接。在 `ip a` 輸出中,這些接口被列為 `master lxdbr0`,這意味著它們是掛載到 `lxdbr0` 網橋上的。這種設置是容器網絡虛擬化的一部分,允許容器網絡流量被正確路由和隔離。
您的問題非常專業,如果有更多相關問題或需要進一步解釋,請隨時提問!
:::
-->
<!--
### 判讀 `ip addr show` 的資訊
```shell
root@espressobin:~# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 532
link/ether d2:40:a9:54:96:38 brd ff:ff:ff:ff:ff:ff
3: wan@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether d2:40:a9:54:96:38 brd ff:ff:ff:ff:ff:ff
4: lan0@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
link/ether d2:40:a9:54:96:38 brd ff:ff:ff:ff:ff:ff
5: lan1@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
link/ether d2:40:a9:54:96:38 brd ff:ff:ff:ff:ff:ff
root@espressobin:~# ip addr show
# 用 `ip a` 這個指令也可以
# 此指令所顯示的訊息包含 `ip link` 指令
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 532
link/ether d2:40:a9:54:96:38 brd ff:ff:ff:ff:ff:ff
inet6 fe80::902a:8a4a:7d3a:e7a7/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: wan@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d2:40:a9:54:96:38 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.20/24 brd 192.168.2.255 scope global noprefixroute wan
valid_lft forever preferred_lft forever
inet6 fe80::9b9b:2dea:7da3:2b3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: lan0@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
link/ether d2:40:a9:54:96:38 brd ff:ff:ff:ff:ff:ff
5: lan1@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
link/ether d2:40:a9:54:96:38 brd ff:ff:ff:ff:ff:ff
```
當然,我很樂意為您解釋這個 `ip addr show` 的輸出結果。讓我們逐個接口進行說明:
1. lo(回環接口):
- 這是本地回環接口,用於本機通信。
- IP地址是 127.0.0.1(IPv4)和 ::1(IPv6)。
- 狀態為 UP,表示接口已啟用。
2. eth0:
- 這是物理以太網接口。
- MAC地址為 b2:62:1b:1b:4b:de。
- 狀態為 UP,表示接口已啟用。
- 沒有配置 IP 地址,可能作為其他虛擬接口的基礎。
3. wan@eth0:
- 這是一個虛擬接口,基於 eth0。
- 使用相同的 MAC 地址 b2:62:1b:1b:4b:de。
- 配置了 IPv4 地址 192.168.2.20/24。
- 也有一個鏈路本地 IPv6 地址。
- 狀態為 UP,正在使用中。
4. lan0@eth0:
- 另一個基於 eth0 的虛擬接口。
- 使用相同的 MAC 地址。
- 狀態為 NO-CARRIER,表示物理鏈路未連接。
5. lan1@eth0:
- 類似於 lan0@eth0,也是基於 eth0 的虛擬接口。
- 使用相同的 MAC 地址。
- 狀態也是 NO-CARRIER。
總結:
- 您的設備有一個物理以太網接口(eth0),上面配置了多個虛擬接口。
- wan 接口正在使用中,並有一個可用的 IP 地址。
- lan0 和 lan1 接口已配置但未連接(可能是因為沒有實際的網絡連接)。
這種配置通常用於路由器或類似設備,其中一個物理接口被分割成多個邏輯接口,用於不同的網絡功能(如 WAN 和多個 LAN)。
當你執行 `ip addr show` 指令時,會顯示系統中所有網路介面的狀態和 IP 地址。讓我們逐行解析你所提供的輸出:
1. **lo: (loopback interface)**
- `1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000`
- `lo` 是 loopback 介面,用於網路測試和內部通訊。
- `UP` 表示這個介面是啟用的。
- `mtu 65536` 表示最大傳輸單元(Maximum Transmission Unit)大小是 65536 字節。
- `link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00`
- `link/loopback` 表示這是 loopback 介面。
- `00:00:00:00:00:00` 是 loopback 的 MAC 地址,這是一個虛擬地址。
- `inet 127.0.0.1/8 scope host lo`
- `127.0.0.1/8` 是 loopback 的 IPv4 地址,範圍是 `127.0.0.1` 到 `127.255.255.255`。
- `scope host` 表示這個地址僅在本機有效。
- `inet6 ::1/128 scope host`
- `::1/128` 是 loopback 的 IPv6 地址。
- `scope host` 表示這個地址僅在本機有效。
2. **eth0: (主網路介面)**
- `2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 532`
- `eth0` 是你的主網路介面。
- `UP` 表示這個介面是啟用的。
- `mtu 1500` 表示最大傳輸單元大小是 1500 字節。
- `link/ether b2:62:1b:1b:4b:de brd ff:ff:ff:ff:ff:ff`
- `b2:62:1b:1b:4b:de` 是這個介面的 MAC 地址。
- `brd ff:ff:ff:ff:ff:ff` 是廣播地址。
3. **wan: (eth0 的子介面,連接外部網絡)**
- `3: wan@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000`
- `wan` 是 `eth0` 的子介面,用於連接外部網絡。
- `UP` 表示這個介面是啟用的。
- `mtu 1500` 表示最大傳輸單元大小是 1500 字節。
- `link/ether b2:62:1b:1b:4b:de brd ff:ff:ff:ff:ff:ff`
- `b2:62:1b:1b:4b:de` 是這個介面的 MAC 地址,與 `eth0` 相同。
- `brd ff:ff:ff:ff:ff:ff` 是廣播地址。
- `inet 192.168.2.20/24 brd 192.168.2.255 scope global noprefixroute wan`
- `192.168.2.20/24` 是這個介面的 IPv4 地址,子網範圍是 `192.168.2.0` 到 `192.168.2.255`。
- `scope global` 表示這個地址在全局範圍內有效。
- `noprefixroute` 表示不使用前綴路由。
- `inet6 fe80::7f67:bfb5:eafb:1c98/64 scope link noprefixroute`
- `fe80::7f67:bfb5:eafb:1c98/64` 是這個介面的鏈路本地 IPv6 地址。
- `scope link` 表示這個地址僅在本地鏈路內有效。
4. **lan0: (eth0 的子介面,連接內部 LAN)**
- `4: lan0@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000`
- `lan0` 是 `eth0` 的子介面,用於連接內部局域網(LAN)。
- `NO-CARRIER` 表示這個介面沒有連接到任何設備。
- `UP` 表示這個介面是啟用的。
- `mtu 1500` 表示最大傳輸單元大小是 1500 字節。
- `link/ether b2:62:1b:1b:4b:de brd ff:ff:ff:ff:ff:ff`
- `b2:62:1b:1b:4b:de` 是這個介面的 MAC 地址,與 `eth0` 相同。
5. **lan1: (eth0 的另一個子介面,連接內部 LAN)**
- `5: lan1@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000`
- `lan1` 是 `eth0` 的另一個子介面,用於連接內部局域網(LAN)。
- `NO-CARRIER` 表示這個介面沒有連接到任何設備。
- `UP` 表示這個介面是啟用的。
- `mtu 1500` 表示最大傳輸單元大小是 1500 字節。
- `link/ether b2:62:1b:1b:4b:de brd ff:ff:ff:ff:ff:ff`
- `b2:62:1b:1b:4b:de` 是這個介面的 MAC 地址,與 `eth0` 相同。
這些資訊顯示了你的開發板網路配置的詳細資訊,包括每個網路介面的 MAC 地址、IP 地址和連接狀態。
---
您提出了一個很好的問題。讓我來解釋一下 eth0 和其他接口之間的關係:
1. eth0 的角色:
- eth0 通常代表物理網絡接口卡(NIC)。
- 在您的設備中,它是實際的硬件以太網端口。
2. 虛擬接口(wan, lan0, lan1):
- 這些是基於 eth0 創建的虛擬(或邏輯)接口。
- 它們使用 eth0 作為底層物理接口。
3. 關係說明:
- 可以將 eth0 想像成一個"主幹",而 wan、lan0、lan1 是從這個主幹分出的"分支"。
- 所有這些虛擬接口共享同一個物理硬件(因此有相同的 MAC 地址)。
4. 為什麼要這樣設計:
- 這種設置允許一個物理端口被用於多個不同的網絡功能。
- 例如,wan 用於連接外部網絡,而 lan0 和 lan1 可能用於不同的內部網絡段。
5. 實際連接:
- 當您將網線插入設備的以太網端口時,您實際上是連接到 eth0。
- 系統然後決定將流量路由到哪個虛擬接口(wan、lan0 或 lan1)。
6. wan 接口的工作方式:
- 當 wan 接口配置為使用 eth0 時,它實際上是在監聽通過 eth0 的特定流量。
- 系統會將符合 wan 配置的流量導向 wan 接口處理。
7. 靈活性:
- 這種設置提供了極大的靈活性,允許在不改變物理連接的情況下重新配置網絡。
總結:
雖然您確實是通過物理連接(eth0)連接到外部網絡,但 wan 虛擬接口負責管理這個連接的邏輯方面。這種抽象允許更靈活的網絡配置和管理,特別是在路由器或類似設備中。
這樣的解釋是否幫助您更好地理解了這些接口之間的關係?如果您還有任何疑問,請隨時問我。
`eth0`、`wan`、`lan0`、`lan1` 這些名稱都是網絡接口(network interfaces),每個接口代表一個具體的網絡連接點。讓我來解釋一下這些接口之間的關係:
1. **eth0**:
- `eth0` 是以太網接口,通常代表物理以太網卡。這是開發板上的主網絡接口,物理網卡插入的所有網絡連接都是通過這個接口進行的。這個接口可以分配給不同的虛擬接口,如 `wan` 和 `lan` 接口。
2. **wan、lan0、lan1**:
- 這些都是 `eth0` 接口的虛擬子接口。每個子接口代表一個不同的網絡用途或區域。例如:
- **wan**(Wide Area Network)接口通常用於連接到外部網絡或互聯網。
- **lan0** 和 **lan1**(Local Area Network)接口通常用於內部局域網連接,連接到內部設備。
這些虛擬子接口通過 `eth0` 共享物理網卡。下面是它們之間的具體關係和作用:
### 關係
- `eth0` 是物理網卡接口。
- `wan`、`lan0`、`lan1` 是在 `eth0` 基礎上創建的虛擬接口,分別用於不同的網絡用途。
### 配置和使用
- `eth0`:這個接口代表物理網卡,是所有網絡通信的基礎。開發板的所有網絡流量最終都通過這個接口進行。
- `wan`:這個接口綁定在 `eth0` 上,並且用於外部網絡連接。當你配置路由和 NAT(Network Address Translation)時,`wan` 是用來連接外部網絡的接口。
- `lan0` 和 `lan1`:這些接口也是綁定在 `eth0` 上,用於內部網絡連接。通常,這些接口用於局域網內部的通信,例如連接到其他內部設備或子網。
### 例子
假設你的開發板有一個物理以太網接口 `eth0`,並且你希望將它用作一個路由器:
- **物理接口(eth0)**:這是實際的網卡,連接到網絡。
- **WAN 虛擬接口**:通過 `eth0` 連接到互聯網或上游路由器。
- **LAN 虛擬接口**:通過 `eth0` 連接到局域網內的設備。
### 實際配置
在你的系統中,你可能會看到以下配置:
```plaintext
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 532
link/ether b2:62:1b:1b:4b:de brd ff:ff:ff:ff:ff:ff
3: wan@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether b2:62:1b:1b:4b:de brd ff:ff:ff:ff:ff:ff
inet 192.168.2.20/24 brd 192.168.2.255 scope global noprefixroute wan
valid_lft forever preferred_lft forever
inet6 fe80::7f67:bfb5:eafb:1c98/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: lan0@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
link/ether b2:62:1b:1b:4b:de brd ff:ff:ff:ff:ff:ff
5: lan1@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
link/ether b2:62:1b:1b:4b:de brd ff:ff:ff:ff:ff:ff
```
- `eth0`:實體網卡。
- `wan@eth0`:wan 虛擬接口,通過 `eth0` 連接到外部網絡。
- `lan0@eth0` 和 `lan1@eth0`:lan 虛擬接口,通過 `eth0` 連接到內部網絡。
總之,`eth0` 是物理網卡接口,而 `wan`、`lan0` 和 `lan1` 是在 `eth0` 基礎上創建的虛擬接口,用於不同的網絡連接用途。
---
非常好的問題!讓我一一為您解答:
1. 關於實際網卡:
是的,eth0 通常代表實際的物理網卡。在您的開發板上,eth0 很可能就是實際的硬件以太網接口。
2. 虛擬接口和 VLAN:
- 虛擬接口是一個廣泛的概念,包括但不限於 VLAN。
- 在您的情況下,wan、lan0 和 lan1 可能是使用了一種叫做"子接口"或"虛擬 LAN 設備"的技術。
- 這與 VLAN 相似,但不完全相同。VLAN 通常用於在同一物理網絡中創建多個邏輯分隔的網絡。
3. 判斷虛擬接口的信息:
在 `ip addr show` 的輸出中,有幾個線索:
- 接口名稱中的 "@" 符號:例如 "wan@eth0" 表示 wan 是基於 eth0 的虛擬接口。
- 相同的 MAC 地址:所有接口(eth0、wan、lan0、lan1)都有相同的 MAC 地址,這表明它們共享同一個物理硬件。
4. 關於 lan0 和 lan1:
- 是的,這個配置表明您的開發板有能力創建兩個獨立的本地網絡。
- lan0 和 lan1 可以被配置為兩個不同的網絡段,每個都可以有自己的 IP 地址範圍和網絡設置。
- 這種設置常見於路由器或網絡設備中,允許創建多個隔離的網絡區域(例如,一個用於一般使用,另一個用於訪客或 IoT 設備)。
補充說明:
- 這種配置提供了極大的靈活性,允許一個物理網卡服務多個網絡功能。
- 實際使用時,您可能需要通過軟件(如網絡配置工具或直接編輯配置文件)來設置這些虛擬接口的具體參數和用途。
您的開發板似乎是一個功能豐富的網絡設備,能夠同時處理 WAN 連接和多個 LAN 網段。這種設計使得它非常適合用於開發和測試各種網絡配置和應用。
---
很高興您問到這個問題!Loopback interface(回環接口)是一個特殊的網絡接口,它在網絡和系統管理中扮演著重要角色。讓我為您詳細解釋:
什麼是 Loopback Interface:
1. 它是一個虛擬網絡接口,不與任何實際的硬件相關聯。
2. 在大多數系統中,它被命名為 "lo" 或 "localhost"。
3. 它通常被分配 IP 地址 127.0.0.1(IPv4)和 ::1(IPv6)。
Loopback Interface 的功能和用途:
1. 本地通信:
- 允許應用程序通過網絡協議棧與同一台機器上的其他程序通信。
- 即使所有物理網絡接口都關閉,本地程序仍可通過 loopback 相互通信。
2. 測試和診斷:
- 用於測試網絡配置和網絡應用,無需實際的網絡連接。
- 可以用來檢查本地網絡協議棧是否正常工作。
3. 服務器配置:
- 許多服務器應用程序(如數據庫服務器)默認綁定到 loopback 接口,以限制外部訪問。
4. 安全性:
- 通過 loopback 發送的數據不會離開計算機,提高了安全性。
5. 性能:
- 通過 loopback 的通信比通過物理網卡更快,因為數據不需要實際離開計算機。
6. DNS 解析:
- 主機名 "localhost" 通常解析到 loopback 地址,用於本地服務訪問。
7. 系統健康檢查:
- 很多監控工具使用 loopback 接口來檢查系統的網絡功能是否正常。
8. 容器和虛擬化:
- 在容器和虛擬化環境中,loopback 接口用於內部通信和服務隔離。
實際應用例子:
- 當您運行 Web 服務器並通過 `http://localhost` 訪問時,您實際上是通過 loopback 接口訪問的。
- 數據庫服務器(如 MySQL)默認可能只監聽 127.0.0.1,以防止遠程訪問。
總結:
Loopback interface 是一個重要的虛擬網絡接口,主要用於本地通信、測試和安全目的。它在網絡應用開發、系統管理和網絡診斷中扮演著關鍵角色。
希望這個解釋能幫助您理解 loopback interface 的概念和重要性。如果您還有任何疑問或需要更多例子,請隨時問我。
-->