# 將 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 的概念和重要性。如果您還有任何疑問或需要更多例子,請隨時問我。 -->