---
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`

表示,iPhone已經成功將熱點分享給樹莓派了。
## DHCP伺服器
### 修改netplan資料
Ubuntu 20.04 使用的是netplan進行網路界面的設定,依照指示先到該資料夾中進行修改。
```bash=
cd /etc/netplan
ls #顯示資料夾內容
```

此時,使用`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`輸入完成並儲存。

在終端機械面輸入下列指令使網路變更生效
```bash=
sudo netplan --debug try
```
確認變更文件無錯誤後輸入:
```bash=
sudo netplan --debug apply
```
並重新開機。
重新開機後,輸入:
```bash=
ifconfig
```
確認`eth0`網卡是否已經連上`192.168.100.1`

### 安裝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
```
並重新開機。
## 用戶端測試

看來已經成功分配到位置。
利用`powershell` 輸入`ping`指令針對網際網路連線測試

完美!
## 利用內建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囉!