--- lang: zh_TW tags: Linux, Ubuntu --- # 利用 Ubuntu 搭建DHCP軟路由 本文主要紀錄使用樹苺派安裝`Ubuntu 20.04 LTS 64bit`進行路由器的設定。 ## 主要想法 因為在公司的關係,公司內部網路其實不能隨意連線WiFi設備而使用樹莓派進行開發,往往卻需要使用`SSH`指令進行溝通與連線,又同時需要將筆記型電腦連接網路查詢資料,總不能一直處於網路線拔來拔去的狀態,同時也不希望手機做為熱點分享,一直要使用WiFi功能開啟狀態,因此想到利用Raspberry Pi 4本身帶有的1000Mbits的RJ45當成`LAN`,而Raspberry Pi4使用USB連接手機作為`WAN`進行對外連網,如此一來Raspberry Pi4則需要做為DHCP伺服器對連接到RJ45的設備進行網路的ip分配,並且也需要將USB的網路轉發到RJ45所連接的子設備上。 ### 再開始之前 首先,因為該設定會動到網路設定,所以有以下兩種方式進行處理 1. 使用樹莓派本身的USB與HDMI,在實體螢幕界面下使用CLS進行後續操作 2. 利用已經存在的區域網路(如WiFi界面進行設定) ### 簡述原理 樹莓派本身具有原生的一組`eth0`網卡,加上`wlan0`的無線網卡,這時候我們要借助`eth0`網卡作為`LAN`分配ip給其他設備(當然這部份需要連接switch),而利用手機的USB連接當成`eth1`網卡左為`WAN`連接網際網路。 ## 利用iPhone熱點上網 一般來說,可以利用iPhone熱點提供WiFi給ubuntu進行上網,而iPhone其實本身具有透過USB傳輸網路的功能,一來可以替手機充電,二來也不用使得wifi晶片一直處於工作狀態,有助於手機不會過熱。 但是在`Windows`下,可以透過安裝`iTunes`的方式使得手機熱點自動開通,而在`macOS`下更是無縫接軌,但是在`Linux`並沒有提供`iTunes`的工具,使得USB傳輸網路的部份需要令尋方法。好在透過社群的力量,在安裝完成Ubuntu後即可透過套件安裝的方式將手機USB上網的功能開通。 先更新系統與套件 ```bash= sudo apt update && sudo apt upgrade -y ``` 安裝iphone熱點套件,[參考資料](http://www.ubuntugeek.com/iphone-tethering-on-ubuntu-9-10-karmic.html) ```bash= sudo apt install ipheth-utils ``` 然後,待系統安裝完成後在進行重開機 ```bash= sudo reboot ``` 此時會看到 **eth1** 出現 `172.20.10.X` ![連線圖片](https://i.imgur.com/rmdCTgN.png) 表示,iPhone已經成功將熱點分享給樹莓派了。 ## DHCP伺服器 ### 修改netplan資料 Ubuntu 20.04 使用的是netplan進行網路界面的設定,依照指示先到該資料夾中進行修改。 ```bash= cd /etc/netplan ls #顯示資料夾內容 ``` ![實際情況](https://i.imgur.com/PKYZ42J.png) 此時,使用`vim`指令進行修改文本 ```bash= sudo vim 50-cloud-init.yaml ``` 這時候我們要修改位置為`eth0`的部份 原本的樣子 ```yaml= network: ethernets: eth0: dhcp4: true optional: true version: 2 ``` 修改為 ```yaml= network: ethernets: eth0: dhcp4: false addresses: - 192.168.100.1/24 eth1: dhcp4: true optional: true version: 2 ``` 修改完成後按下`esc`鍵在輸入`:wq`,最後按下`enter`輸入完成並儲存。 ![配置文件](https://i.imgur.com/tegyb1P.png) 在終端機械面輸入下列指令使網路變更生效 ```bash= sudo netplan --debug try ``` 確認變更文件無錯誤後輸入: ```bash= sudo netplan --debug apply ``` 並重新開機。 重新開機後,輸入: ```bash= ifconfig ``` 確認`eth0`網卡是否已經連上`192.168.100.1` ![eth0](https://i.imgur.com/zVzF7gF.png) ### 安裝DHCP伺服器 輸入指令 ```bash= sudo apt install isc-dhcp-server ``` #### 修改DHCP文件 ```bash= sudo vim /etc/default/isc-dhcp-server ``` 輸入以下內容,利用原本的網卡作為DHCP用 ```bash= INTERFACESv4="eth0" INTERFACESv6="eth0" ``` #### 修改DHCP範圍 ```bash= sudo vim /etc/dhcp/dhcpd.conf ``` 在找到 ```bash= # option definitions common to all supported networks... ``` 這行之後,輸入以下內容 ```bash= subnet 192.168.100.0 netmask 255.255.255.0 { range 192.168.100.100 192.168.100.200; option domain-name-servers 8.8.8.8, 8.8.4.4; option domain-name "Ubuntu"; option subnet-mask 255.255.255.0; option broadcast-address 192.168.100.255; option routers 192.168.100.1; default-lease-time 600; max-lease-time 7200; } ``` 儲存後,將設備插入該網路孔(*若設備對插記得使用跳線,否則應接入Switch*) #### 轉發網路 ```bash= sudo apt install iptables-persistent ``` 指令如下: ```bash= sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT sudo iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE ``` --- 利用`network-manager` ```bash= iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ``` 儲存轉發 ```bash= sudo dpkg-reconfigure iptables-persistent ``` --- ```bash= sudo vim /etc/iptables/rules.v4 ``` 在`*filer`的部份加入以下敘述 ```bash= -A FORWARD -i eth0 -o eth1 -j ACCEPT -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT ``` 而下方 `*nat`的部份則填入 ```bash= -A POSTROUTING -o eth1 -j MASQUERADE ``` 並重新開機。 ## 用戶端測試 ![windows10](https://i.imgur.com/cpvLtoi.png) 看來已經成功分配到位置。 利用`powershell` 輸入`ping`指令針對網際網路連線測試 ![測試](https://i.imgur.com/d3z6BAF.png) 完美! ## 利用內建wifi作為AP使用 樹苺派上有一個wifi晶片只要稍微修改內部的`netplan`設定,即可將WIFI晶片做為熱點發送 修改指令為: ```bash= sudo vim /etc/netplan/50-cloud-init.yaml ``` 其中`50-cloud-init.yaml`可能因為不同版本而不同名稱。 將其修改為: ```bash= network: version: 2 renderer: NetworkManager #啟用網路管理器 ethernets: eth0: dhcp4: false addresses: - 192.168.100.1/24 eth1: dhcp4: true optional: true wifis: wlan0: dhcp4: true access-points: "Ubuntu": #輸入熱點wifi名稱 password: "qwertyuiop" #輸入熱點密碼 mode: ap ``` 完成編輯後,儲存檔案並退出`esc`,並輸入`:wq`即可。 然後輸入以下指令使其生效 ```bash= sudo netplan generate ``` 及 ```bash= sudo netplan try ``` 若無問題後重新開機,即可再其他裝置上看到剛剛設定好的WIFI囉!