天天看点

ubuntu20 开机启动_Ubuntu20.04 双网卡 共享上网解决方案

ubuntu20 开机启动_Ubuntu20.04 双网卡 共享上网解决方案

困扰我很多天的问题在今天加班的时候终于解决了,很开心!费了这么大精力才弄出来,当然要记录下来,以防下次再用,嘻嘻~

需求

首先来说一下我们的需求:

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 开机启动_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 开机启动_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 开机启动_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
           

继续阅读