困扰我很多天的问题在今天加班的时候终于解决了,很开心!费了这么大精力才弄出来,当然要记录下来,以防下次再用,嘻嘻~
需求
首先来说一下我们的需求:
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前面的注释去掉。
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一下无线所在的网关,可以看到,已经通了
我又尝试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文件,我们需要自己新建该文件,并把想要启动的命令放入该文件中。
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