困擾我很多天的問題在今天加班的時候終於解決了,很開心!費了這麼大精力才弄出來,當然要記錄下來,以防下次再用,嘻嘻~

需求

首先來說一下我們的需求:

1、一臺裝有Ubuntu20。04 server系統的電腦

2、一臺Ubuntu server系統的電腦(該電腦上Ubuntu系統版本任意)

3、裝有Ubuntu20。04 server系統的電腦上有一個無線網絡卡,一個有限網絡卡,我們想讓該電腦的無線網絡卡連線外網,使用網線連線到另一臺電腦,使得另一臺電腦可以上網。

Ubuntu20。04 server系統的配置

1、配置網路資訊

從網上搜集了很長時間,很多都是修改/etc/network/interfaces檔案,這種方式在Ubuntu17之後就不適用了,之後的系統都使用netplan來管理網路,因此我們要修改的是/etc/netplan目錄下以。yaml為字尾的檔案,以下內容為我係統中的配置

network:

renderer: networkd #

ethernets: # 有線配置

enx00e04c00f946: #指定需配置網路介面的名稱

dhcp4: true #是否開啟 IPv4 的 dhcp。

addresses: [192。168。10。1/24] #定義網路介面的靜態 IP 地址

wifis: #無線配置

wlan0: #無線網路介面名稱

dhcp4: true #是否開啟IPV4的dhcp

access-points:

“TP-LINK”: #連線的無線的名稱

password: “123123123” #連線的無線的密碼

version: 2

我們在配置網路之前可以使用ifconfig命令來檢視一下網絡卡名稱

配置完成後,我們可以使用以下命令來進行啟動

netplan apply

2、開啟路由轉發功能

Linux系統本身就有IP資料包轉發的功能,但是預設情況下是關閉的,你需要透過修改配置檔案來啟動這個功能,修改/etc/sysctl。conf檔案,將net。ipv4。ip_forward=1前面的註釋去掉。

Ubuntu20.04 雙網絡卡 共享上網解決方案

3、新增路由表使得兩個網絡卡之間可以通訊

依次在命令列中執行以下命令

iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

iptables -A FORWARD -i wlan0 -o enx00e04c00f946 -m state ——state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -i wlan0 -o enx00e04c00f946 -j ACCEPT

接下來就是要儲存這些規則

iptables-save > /etc/iptables。rules

另一臺電腦網路配置

相比較而言,這一臺電腦的網路配置就簡單多了,把有線網絡卡也設定成和上一臺電腦有限網絡卡處於同一網路的靜態ip就可以,如何設定靜態ip在第二部分已經講了,這裡就不多做介紹了。

結果

這樣我們就可以進行訪問了喲!

我們ping一下無線所在的閘道器,可以看到,已經通了

Ubuntu20.04 雙網絡卡 共享上網解決方案

我又嘗試ping了一下www。baidu。com

但是沒有任何反應,這種情況一般是未配置dns,使用8。8。8。8或114。114。114。114或其他。

我們只需要在/etc/resolve。conf檔案中加入下面這句話即可,加入dns

nameserver 8。8。8。8

最佳化

這樣配置Ubuntu20。04網路資訊後,路由表規則雖然儲存下來,但是每次開機後需要自己手動重啟,我想讓它開機時自動啟動,就進行了如下操作

1、建立rc.local檔案

由於Ubuntu20。04的/etc路徑下並沒有rc。local檔案,我們需要自己新建該檔案,並把想要啟動的命令放入該檔案中。

Ubuntu20.04 雙網絡卡 共享上網解決方案

2、建立 rc-local.service 檔案

Ubuntu20。04 不能像16。04 那樣可以直接使用 /etc/rc。local 檔案,需要設定service

nano /etc/systemd/system/rc-local。service

以下為我的rc-local。service檔案中的內容

[Unit]

Description=/etc/rc。local Compatibility

ConditionFileIsExecutable=/etc/rc。local

After=network。target

[Service]

Type=forking

ExecStart=/etc/rc。local start

TimeoutSec=0

RemainAfterExit=yes

GuessMainPID=no

[Install]

WantedBy=multi-user。target

3、給rc.local加許可權

chmod +x /etc/rc。local

4、啟用服務

systemctl enable rc-local

5、啟用服務並查詢服務狀態

systemctl start rc-local。service

systemctl status rc-local。service

在啟用服務的時候出現以下錯誤:

● rc-local。service - /etc/rc。local Compatibility

Loaded: loaded (/etc/systemd/system/rc-local。service; enabled; vendor preset: enabled)

Drop-In: /usr/lib/systemd/system/rc-local。service。d

└─debian。conf

Active: failed (Result: exit-code) since Sun 2020-05-24 09:36:11 UTC; 14s ago

Process: 2611 ExecStart=/etc/rc。local start (code=exited, status=203/EXEC)

May 24 09:36:11 scope systemd[1]: Starting /etc/rc。local Compatibility。。。

May 24 09:36:11 scope systemd[2611]: rc-local。service: Failed to execute command: Permission denied

May 24 09:36:11 scope systemd[2611]: rc-local。service: Failed at step EXEC spawning /etc/rc。local: Permission denied

May 24 09:36:11 scope systemd[1]: rc-local。service: Control process exited, code=exited, status=203/EXEC

May 24 09:36:11 scope systemd[1]: rc-local。service: Failed with result ‘exit-code’。

May 24 09:36:11 scope systemd[1]: Failed to start /etc/rc。local Compatibility。

經過查資料而知,是有shell的問題造成的。有些命令需要在bash shell中執行,而不能在dash中執行。

從Ubuntu 6。10開始,預設使用dash(theDebian Almquist Shell)而不是bash(the GNUBourne-Again Shell)。 但Login Shell還是bash。

因此,在rc。local檔案開頭加上下面這句話即可

#!/bin/bash