
困擾我很多天的問題在今天加班的時候終于解決了,很開心!費了這麼大精力才弄出來,當然要記錄下來,以防下次再用,嘻嘻~
需求
首先來說一下我們的需求:
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前面的注釋去掉。
依次在指令行中執行以下指令
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一下無線所在的網關,可以看到,已經通了
我又嘗試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 不能像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