基于ubuntu18.04搭建双线adsl路由器和私有云服务器(samba、ftp和http)

基于ubuntu搭建双线adsl路由器和私有云服务器(samba、ftp和http)

摘要:本文内容包括硬件环境介绍、软件环境介绍、设置双线adsl网络配置文件interfaces、adsl断线自动重拨、配置内网dhcp服务和内网路由器、配置双线adsl路由表、利用AliDDNS实现域名和动态IP绑定、安装和配置ftp和samba服务

1. 目的

谨以此文纪念2020年春节的新型冠状流行期的生活,感谢医务人员和其他为我们提供生活保障的人们!
搭建一个稳定和快速的服务器,并提供稳定和快速的路由、SAMBA文件共享服务、ftp文件共享服务和http网页服务,能实现SAMBA传输速度50M/S以上,在外出差时也能随时通过安卓手机APP:ES文件浏览器或电脑:filezilla访问服务器上的资料。这些功能通常,可以用购买家用网络硬盘或某些路由器提供的附带USB共享服务,但缺点一是速度慢,二是不稳定,三是不能提供ftp服务供在外出差时访问。例如TP-LINK等路由器内置了花生壳和端口转发的功能,由于稳定性问题,经常会出现连接不上服务器的情况。
本文的最新版本随时在:http://www.hasil.top:808/06-网络配置、软路由、WIFI热点、SAMBA和FTP服务器搭建/基于ubuntu18.04搭建双线adsl路由器和私有云服务器(samba、ftp和http).txt
更新。

2. 使用环境

2.1 硬件环境

最好用大品牌的旧笔记本电脑,因为通常笔记本电脑稳定性比普通的台式机要稳定得多,而且耗电量很少。

本文有些命令行和配置文件中的行显示为两行,实际上是一行,请根据上下文自行判断

所有命令和配置文件中的标点符号均为英文标点符号。

同时,由于字体显示的原因,1(数字1)、l(小写字母l)、I(大写字母I)、o(小写字母o)、O(大写字母O)和0(数字0),可能有些时候会分不清,这时可以换不同的字体和选择不同的文本编辑器进行分辨。

sudo lspci
#显示当前电脑硬件,本人使用6年前的笔记本电脑acer1810tz,硬件环境如下,以下凡以sudo开头到#前为止的内容均为需要输入并运行的命令。

00:00.0 Host bridge: Intel Corporation Mobile 4 Series Chipset Memory Controller Hub (rev 07)
00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)
00:02.1 Display controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)
00:1a.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 03)
00:1a.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 03)
00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 03)
00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 03)
00:1c.3 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 4 (rev 03)
00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 03)
00:1d.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 03)
00:1d.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 03)
00:1d.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 03)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 93)
00:1f.0 ISA bridge: Intel Corporation ICH9M-E LPC Interface Controller (rev 03)
00:1f.2 SATA controller: Intel Corporation 82801IBM/IEM (ICH9M/ICH9M-E) 4 port SATA Controller [AHCI mode] (rev 03)
00:1f.3 SMBus: Intel Corporation 82801I (ICH9 Family) SMBus Controller (rev 03)
01:00.0 Ethernet controller: Qualcomm Atheros AR8131 Gigabit Ethernet (rev c0)
02:00.0 Network controller: Intel Corporation Centrino Wireless-N 1000 [Condor Peak]

另外还有enxfb #毕亚兹USB有线网卡(RTL8153芯片)一块和enxd3、enxd7 #TP-LINK TL-UG310 USB3.0有线网卡两块

sudo cat /proc/cpuinfo #显示CPU信息
model name : Genuine Intel® CPU U4100 @ 1.30GHz
主力1000M飞鱼星双WAN口无线路由器一个
TKLINK无线路由器一个

2.2 软件环境

ubuntukylin 18.04 desktop amd64版(以下简称麒麟18.04或qilin18.04),安全相关的软件更新至2020.2.4
推荐到:mirrors.163.com/ubuntu-releases/
下载
也可到:http://www.hasil.top:808
下载
优点如下:
1)麒麟18.04对USB有线网卡支持很好,即插即用,这点对笔记本极为重要。对我手上的毕亚兹USB有线网卡和TP-LINK TL-UG310有线网卡都支持,还有一款EDUP的USB口一拖三有线网卡也支持,推荐购买TP-LINK TL-UG310有线网卡。
2)对中文支持很好,特别是命令行模式下,中文都不乱码,原生的ubuntu就做不到,资深IT人员可以做到完全中文化,普通工科男就不必在这上面花时间了,现成的就好。

2.3 网络环境

本人搭建网络环境如下:

联通ADSL猫(有公网IP)=(TPLINK USB有线网卡A)麒麟18.04(AR8131网卡)=(LAN口)飞鱼星路由器(LAN口/WIFI)=其他电脑/手机

广电ADSL猫(无公网IP)=(TPLINK USB有线网卡B)麒麟18.04(毕亚兹USB有线网卡)=(LAN口)TPLINK路由器(LAN口/WIFI)=其他电脑/手机

为什么会有这么奇葩的配置,主要原因是飞鱼星路由器和TPLINK路由器内置的动态域名服务均不支持阿里云DDNS服务,而Oray的DDNS服务有点小贵,但阿里云的DDNS服务仅支持有公网IP的网络。以上网络配置既能保证麒麟18.04实现本文的功能,又能分担飞鱼星路由器WIFI的压力。

3. install qilin18.04-amd64

Ubuntu的安装方法如下(也可自行搜索其他方法,懂的跳过):
http://www.hasil.top:808/02-系统安装/ubuntu-xubuntu-installation
安装时一定要有网络,否则安装会失败,还有一点:安装时将“安装时下载软件和更新”选项前的钩取消,否则系统将使用netplan而不是networking来管理网络,而配置netplan的学习资料不多。

4. 检查网卡是否正确安装

打开终端,输入:
sudo apt-get install net-tools
#安装网络工具,包括ifconfig或ip命令工具
sudo ifconfig 或 ip a
if correct, the samiliar display will be as below:
enp1s0 Link encap:以太网 硬件地址
inet6 地址: Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:544 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:418 错误:0 丢弃:0 过载:0 载波:1
碰撞:0 发送队列长度:1000
接收字节:57442 (57.4 KB) 发送字节:33700 (33.7 KB)

lo Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 跃点数:1
接收数据包:12 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:12 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:552 (552.0 B) 发送字节:552 (552.0 B)

wlp2s0 Link encap:以太网 硬件地址
inet 地址:169.254.219.96 广播:169.254.219.255 掩码:255.255.255.0
inet6 地址: Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:3004 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:137 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:826293 (826.2 KB) 发送字节:21974 (21.9 KB)

另外三块USB网卡名称为:TPLINK USB有线网卡A简写为enxd3,TPLINK USB有线网卡B简写为enxd7,毕亚兹USB有线网卡A简写为enxfb

5. 安装必要软件

首先在mate桌面的软件中心,选择软件源,推荐华为源或163的源,取消不稳定软件前的钩。
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install isc-dhcp-server bridge-utils linux-igd ppp pppoe pppoeconf
#上面的bridge-utils linux-igd 也可以不装

6. config network

6.1 config ADSL

sudo pppoeconf enxd3
#配置联通ADSL网络,请将enxd3替换为您自己的网卡名,通过ifconfig显示,下同
注意当配置窗口问及:是否需要开机启动拨号程序时,建议回答“否”,其他选择默认
sudo ifconfig ppp0
if correctly connect to internet, the samiliar display will be as below:
ppp0 Link encap:Point-to-Point Protocol
inet addr:101.204.148.108 P-t-P:101.204.148.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
RX packets:497794 errors:0 dropped:0 overruns:0 frame:0
TX packets:268948 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:422905325 (422.9 MB) TX bytes:18754324 (18.7 MB)
or
sudo ping www.news.cn -c3
if pppoeconf is correct and ppoe is running, the samiliar display will be as below:
PING cc00008.h.cnc.lxsvc.cn (113.207.34.20) 56(84) bytes of data.
64 bytes from 113.207.34.20: icmp_seq=1 ttl=56 time=10.3 ms
64 bytes from 113.207.34.20: icmp_seq=2 ttl=56 time=11.3 ms
64 bytes from 113.207.34.20: icmp_seq=3 ttl=56 time=12.0 ms
— cc00008.h.cnc.lxsvc.cn ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
如果没有配置好,请重新配置。
sudo pon dsl-provider
#手动启动ADSL拨号程序
sudo poff dsl-provider
#手动挂断ADSL拨号程序

以下步骤专为双线ADSL,单线ADSL的跳过
sudo cp /etc/ppp/peers/dsl-provider /etc/ppp/peers/dsl-provider-enxd3
sudo pppoeconf enxd7
#配置联通ADSL网络
sudo cp /etc/ppp/peers/dsl-provider /etc/ppp/peers/dsl-provider-enxd7
有动手能力的可以跳过sudo pppoeconf enxd7直接cp /etc/ppp/peers/dsl-provider /etc/ppp/peers/dsl-provider-enxd7并修改该配置文件,并将第二条adsl线路的用户名和密码添加到/etc/ppp/pap-secrets文件中

sudo nano /etc/network/interfaces
配置文件如下:
auto lo
iface lo inet loopback

auto enp1s0
#AR8131有线网卡连飞鱼星路由器
iface enp1s0 inet static
address 169.254.219.6
netmask 255.255.255.0
broadcast 169.254.219.255
#由于本身为服务器,不需配置gateway和dns name server

auto enxfb
#毕亚兹USB有线网卡连TPLINK路由器
iface enxfb inet static
address 169.254.218.6
netmask 255.255.255.0
broadcast 169.254.218.255
#由于本身为服务器,不需配置gateway和dns name server

auto enxd3
#TP-LINK TL-UG310有线网卡A连联通猫
iface enxd3 inet manual
iface dsl-provider-enxd3 inet ppp
pre-up /bin/ip link set enxd3 up # line maintained by pppoeconf
provider dsl-provider-enxd3

auto enxd7
#TP-LINK TL-UG310有线网卡B连广电猫
iface enxd7 inet manual
iface dsl-provider-enxd7 inet ppp
pre-up /bin/ip link set enxd7 up # line maintained by pppoeconf
provider dsl-provider-enxd7

配置完成后,拨号和挂断拨号的命令变为:
sudo pon dsl-provider-enxd3或sudo pon dsl-provider-enxd7
sudo poff dsl-provider-enxd3或sudo pon dsl-provider-enxd7
以上步骤专为双线ADSL,单线ADSL的跳过

sudo nano /etc/rc.local
单线ADSL在exit 0行前插入一行:
pon dsl-provide
按Ctrl+x退出并保存,以便每次启动电脑时自动拨号上网。

双线ADSL在exit 0行前插入一行,注意请将有公网IP的网络放在前面,本例中联通网络在前,广电网络在后:

pon dsl-provide-enxd3
sleep 2
pon dsl-provide-enxd7
sleep 2
按Ctrl+x退出并保存,以便每次启动电脑时自动拨号上网。

ubuntu从16.04开始,已取消通过rc.local来开机自启动程序,恢复rc.local参考如下文件或自行百度:
http://www.hasil.top:808/05-软件安装及使用/在ubuntukylin-18.04中设置rc.local和systemd.txt

另一种开机自动拨号方法:
可以在/etc/profile.d下创建一个脚本文件,不需要以#!/bin/bash开头,也不需要将文件设置为可执行属性。
sudo nano /etc/profile.d/pppoe.sh
示例脚本如下:
#startup pppoe program
pon dsl-provider
#该脚本可以实现在用户登录时自动进行ADSL拨号,双线ADSL的对照前文修改。

6.2 使pppoe断线自动重拨

编辑ppp配置文件,这里修改/etc/ppp/peers/dsl-provider而不是修改/etc/ppp/peers/options是因为,dsl-provider文件下的配置会覆盖options下的配置,所以我们只需要修改dsl-provider就可以了
sudo nano /etc/ppp/peers/dsl-provider或dsl-provide-enxd3和dsl-provide-enxd7
找到:
lcp-echo-interval 30 #也可能是其他数值
改为:
lcp-echo-interval 20
找到:
lcp-echo-failure 10 #也可能是其他数值
改为:
lcp-echo-failure 3
lcp-echo-interval指令代表系统每20秒会向 ADSL 服务器发出echo request以确认连线是否正常,lcp-echo-failure指令代表发送多少次以后判断为断线。连起来就是:如果ADSL服务器在60秒 (20 秒 x 3) 都没有回应,系统会假定连线有问题,自动断开。如果您所处的网络环境较差的话,可以增加次数可以避免网络环境较差的用户被误判断线。

继续搜索:
persist
如果没有找到则在配置文件中添加此指令,或者删除前面#取消其注释。
persist指令代表持续连接。使用这个指令以后,如果上面的lcp-echo-interval 30和lcp-echo-failure 10(也就是300秒)判断ppp断线以后,不是退出ppp,而是重新拨号。
这样配置好以后,重启连接,你的ppp软件就支持断线自动重拨了:

如果长时间运行后,发现有断线没法连接上的问题,一般情况下是pppd进程在ADSL断线以后会自动进行重拨尝试,但是尝试10次以后如果还没连接上就会退出进程。对于需要长期在线的计算机来说,这样就不能进行自动重拨了,因为它已经自己退出了进程,所以我们可以为Linux增加一个判断脚本,并定期执行。如果成功拨号会在/run目录下添加ppp0.pid文件,这个文件记录了当前pppd进程pid。我们利用脚本判断这个文件是否存在就能判断出是否pppd是否已经连接。

sudo nano /usr/bin/repppoe
单线ADSL加入以下内容:

  #!/bin/bash
  if [ -e /run/ppp0.pid ]; then
  #如果在/run下找到有ppp0进程
      exit 0
  else
      poff dsl-provider
      sleep 1
      pon dsl-provider
  fi
  exit 0

双线ADSL加入以下内容:

  #!/bin/bash
  if ![ -e /run/ppp0.pid ]; then
  #如果在/run下没有找到有ppp0进程
      poff dsl-provider-enxd3
      sleep 1
      pon dsl-provider-enxd3
  fi

  if [ -e /run/ppp1.pid ]; then
      exit 0
  else
      poff dsl-provider-enxd7
      sleep 1
      pon dsl-provider-enxd7
  fi
  exit 0

双线ADSL加入以上内容:

然后,
sudo chmod a+x /usr/bin/repppoe #修改文件属性为所有用户增加可执行权限
设置crontab每11分钟检测执行一次脚本:
sudo nano /etc/crontab
在文件末尾加入新的一行(要求系统每11分钟运行一次repppoe程序):
*/11 * * * * root /usr/bin/repppoe

还有一种方法也可以实现以上功能:
sudo nano /usr/bin/repppoe

单线ADSL加入以下内容:

  #!/bin/bash
  ping -c1 -s1 www.taobao.com
  if [ $? -ne 0 ]; then
    
  #$?为上一条命令的执行结果,成功时为0,不成功为非零,-eq为等于,-ne不等于,-gt大于,-lt 小于,-ge大于等于,-le 小于等于
      sleep 1
      ping -c1 -s1 www.sohu.com
      if [ $? -ne 0 ]; then
          echo "ppp0 is break! redial ppp0 now!"
          sleep 1
          poff dsl-provider
          sleep 1
          pon dsl-provider
          exit 0
      fi
  fi

双线ADSL加入以下内容:

  #!/bin/bash
  DNS1="www.taobao.com"
  DNS2="www.sohu.com"
  ping -c1 -s1 -I ppp0 $DNS1
  if [ $? -ne 0 ]; then
  
  #$?为上一条命令的执行结果,成功时为0,不成功为非零,-eq为等于,-ne不等于,-gt大于,-lt 小于,ge大于等于,le 小于等于
      sleep 1
      ping -c1 -s1 -I ppp0 $DNS1
      if [ $? -ne 0 ]; then
          echo "ppp0 is break! redial ppp0 now!"
          sleep 1
          poff dsl-provider-enxd3
          sleep 1
          #为什么是dsl-provider-enxd7见前文
          pon dsl-provider-enxd3
      fi
  fi
  sleep 2
  #等待2秒
  ping -c1 -s1 -I ppp1 $DNS1
  if [ $? -ne 0 ]; then
  
  #$?为上一条命令的执行结果,成功时为0,不成功为非零,-eq为等于,-ne不等于,-gt大于,-lt 小于,ge大于等于,le 小于等于
      sleep 1
      ping -c1 -s1 -I ppp1 $DNS2
      if [ $? -ne 0 ]; then
          echo "ppp1 is break! redial ppp1 now!"
          sleep 1
          poff dsl-provider-enxd7
          sleep 1
          pon dsl-provider-enxd7
          exit 0
      fi
  fi
  exit 0

双线ADSL加入以上内容:

然后,
sudo chmod a+x /usr/bin/repppoe
#修改文件属性为所有用户增加可执行权限
sudo nano /etc/crontab
在文件末尾加入新的一行,每11分钟执行程序一次:
*/11 * * * * root /usr/bin/repppoe >/dev/null

6.3 对/etc/network/interfaces文件的补充说明

注意ubuntu16.04及以后的18.04/19.04等有两种网络配置工具:
1)networking 无图形界面,通过修改/etc/network/interfaces配置文件工作
2)network-manager 图形界面配置工具,通过桌面的网络连接图标配置
以上两种工具可以同时运行,但注意一旦图形界面配置工具配置了的网络设备,则需要在/etc/network/interfaces中把相应网络设备删除,否则网络工作会不正常。推荐使用networking配置有线网卡,network-manager配置无线网卡,并在图形桌面中将network-manager下中所有的有线网卡的连接删除

/etc/network/interfaces中网卡DHCP的配置方式如下:
auto enxc9
#启动该网卡
iface enxc9 inet dhcp
#设置该网卡为dhcp模式
#dns-nameservers 119.6.6.6 221.10.251.52
#如果遇到DNS问题,取消本行前的#号,否则注释掉。上行两个IP地址间用一个空格分隔

/etc/network/interfaces中网卡静态地址的配置方式如下:
auto enxc9
#启动该网卡
iface enxc9 inet static
#设置该网卡为静态地址模式
address 192.168.1.6
#指定网卡的IP
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
#内网中路由器的IP
dns-nameservers 119.6.6.6 221.10.251.52
#需咨询您的ISP服务商提供DNS服务器IP,通常会在路由器网络连接信息中显示

/etc/network/interfaces中网桥的配置方式如下:
auto enp8s0f0
auto enp8s0f1
auto br0
#网桥作用是将enp8s0f0和enp8s0f1两网卡合2为1(br0),共用一个地址,以服务器为桥将另两个网络设备连接起来
iface br0 inet static
#为网桥指定静态地址
address 192.168.1.6
#指定网桥的地址,注意按您自己的网络修改
network 192.168.1.0
#指定网桥所在网段,注意按您自己的网络修改
netmask 255.255.255.0
broadcast 192.168.1.255
#指定网桥广播地址,注意按您自己的网络修改
bridge-ports enp8s0f0 enp8s0f1
#指定合并为网桥的真实网卡

7a. 配置单线adsl路由(双线adsl的跳过)

sudo nano /etc/rc.local
单线ADSL找到"exit 0" 在该行之前插入以下几行:
iptables -t nat -A POSTROUTING -s 169.254.219.0/24 -o ppp0 -j MASQUERADE
iptables -A FORWARD -s 169.254.219.0/24 -o ppp0 -j ACCEPT
iptables -A FORWARD -d 169.254.219.0/24 -m state --state ESTABLISHED,RELATED -i ppp0 -j ACCEPT
#以上三行作用为将192.168.1.0/24内部网段上(即连接网卡enx503eaa75xxxx的的所有IP包都转发到ppp0口(即连接ADSL猫的网卡enp1s0),从而实现内网电脑访问外网
#有些资料将192.168.1.0/24用enp1s0或br0代替,将ppp0用enp1s0代替,经本人验证均不能正常实现IP包的转发,当然这是建立在本人的环境条件和配置方法之上,
#也许别人不一样的配置方法在他的环境条件下也可以实现IP转发。
ip route flush cache
#刷新路由缓存

ubuntu从16.04开始,已取消通过rc.local来开机自启动程序,恢复操作参考如下文件:
http://www.hasil.top:808/05-软件安装及使用/在ubuntukylin-18.04中设置rc.local和systemd.txt

#iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j LOG --log-prefix “NEW_HTTP_CONN:” #从iptables到"NEW_HTTP_CONN:"显示为两行实为一行
#作用实时显示内网上电脑正在连接哪些网址,本人未启用该行,注释掉了

7b. 配置双线adsl路由表(单线adsl的跳过)

目的是将内网中经过ppp0发出的数据包到达目的地后返回的数据包又都从ppp0返回,内网中经过ppp1发出的数据包到达目的地后返回的数据包又都从ppp1返回。如果不进行双线adsl路由表的配置,就会出现本地网通过ppp0发出的数据包,返回到了ppp1,造成数据包丢失、网速变慢甚至某些程序不能正常工作。如AliDDNS-v2.0.sh和ping www.sohu.com -c3 -I ppp0或ppp1时会发现总有一条adsl不通。

辣条①号 2019年1月27日 Linux System 运维, 网络技术 156 0
吉祥快乐2020.2.22补充和修改
基本思路是分割访问。

#关闭防火墙、开启linux转发设置
sudo ufw disable
sudo nano /etc/sysctl.conf
找到:
#net.ipv4.ip_forward=1
修改为:
net.ipv4.ip_forward=1 #开启ipv4转发功能
#也可以通过在/etc/rc.local中添加一行echo 1 > /proc/sys/net/ipv4/ip_forward来达到开启IP4转发的功能

在麒麟18.04上创建两个路由表,CU(联通),GD (广电)添加到/etc/iproute2/rt-tables
sudo echo “200 CU” >> /etc/iproute2/rt-tables
sudo echo “300 GD” >> /etc/iproute2/rt-tables

创建脚本文件autoupdatert
sudo nano /usr/bin/autoupdatert

  #内容如下:
  #!/bin/bash
  #
  # This script is auto update route table UC and GD due to IP changed after each redial of adsl, UC and GD shall be built in advance.
  tmpstr=".0"
  logsct="0"
#
  adsL0="ppp0"
  #第一个拨号成功的adsl连接,对应网卡enxd3和联通adsl猫
  enxd3="enxd3"
  #enxd3网卡设备名,对应ppp0和联通猫
  IP0=""
  #网卡enxd3拨号成功后获取的动态IP
  IP_A=""
  #网卡enxd3拨号成功后获取的动态IP的临时存放变量
  CU_GW=""
  #网卡enxd3拨号成功后获取的联通网关的IP
  CU_NET=""
  #网卡enxd3拨号成功后获取的动态IP所属的网段
#
  adsL1="ppp1"
  #第二个拨号成功的adsl连接,对应网卡enxd7和广电adsl猫
  enxd7="enxd7"
  #enxd7网卡的设备名,对应ppp1和广电猫
  IP1=""
  #网卡enxd7拨号成功后获取的动态IP
  IP_B=""
  #网卡enxd7拨号成功后获取的动态IP的临时存放变量
  GD_GW=""
  #网卡enxd7拨号成功后获取的广电网关的IP
  GD_NET=""
  #网卡enxd7拨号成功后获取的动态IP所属的网段
#
  eth1="enp1s0"
  #eth1网卡的设备名,对应内网网段LC_NET1
  eth2="enxfb"
  #eth2网卡的设备名,对应内网网段LC_NET2
  LC_NET1="169.254.219.0"
  #内网网段1,对应eth1
  LC_NET2="169.254.218.0"
  #内网网段2,对应eth2
#
  while true
  #设定循环条件一直成立,程序启动后除非手动kill进程,否则一直运行
    do
    if [ -e /run/ppp0.pid ]; then
    #如果ppp0进程号存在,说明存在ppp0这个连接
      IP0=`ifconfig $adsL0 | sed ':a ; N;s/\n/ / ; t a ; ' | awk -v head="inet " -v tail="  net" '{print substr($0, index($0,head)+length(head),index($0,tail)-index($0,head)-length(head))}' | sed s/[[:space:]]//g`
      #通过ifconfig命令获取ppp0拨号成功后获取的动态IP,sed将所有行合并为一行,awk获取指定头尾字符间的字符,sed去除空格
      if [ "$IP_A" = "" ] || [ "$IP_A" != "$IP0" ]; then
      #如果ppp0的动态IP变量为空(第一次循环),或ppp0的动态IP变量值与最新测到的ppp0的动态IP值不一样
        CU_GW=`ifconfig $adsL0 | sed ':a ; N;s/\n/ / ; t a ; ' | awk -v head="tion" -v tail="ppp " '{print substr($0, index($0,head)+length(head),index($0,tail)-index($0,head)-length(head))}' | sed s/[[:space:]]//g`
        #通过ifconfig命令获取ppp0拨号成功后获取的网关IP,sed将所有行合并为一行,awk获取指定头尾字符间的字符,sed去除空格
        CU_NET=${IP0%.*}
        #删除ppp0动态IP最后一个.号及右边的字符
        CU_NET=${CU_NET%.*}
        #删除ppp0动态IP最后一个.号及右边的字符
        CU_NET=$CU_NET$tmpstr$tmpstr
        #补齐.0.0形成ppp0动态IP的所属网段
#
        ip route flush table CU
        #清空table名为CU的联通路由表
#
        ip route add $CU_NET dev $adsL0 src $IP0 table CU
        #增加从ppp0的IP到所属网段的路由到路由表CU中
        ip route add default via $CU_GW table CU
        #增加ppp0的连接的ISP网关IP,与上句合起来作用为在CU路由表中设定,如果要从内网到达$CU_NET,需要从网卡ppp0出去
#
        ip rule add from $IP0 table CU
        #添加策略路由,从ppp0对应的动态IP来的数据包均遵从路由表CU的规定
#
        ip route add $LC_NET1 dev $eth1 table CU
        #增加本地网段地址1到网卡1的路由,确保从网卡eth1所属的本地网NET1传入的数据包能进入联通路由表
        ip route add $LC_NET2 dev $eth2 table CU
        #增加本地网段地址2到网卡2的路由,确保从网卡eth2所属的本地网NET2传入的数据包能进入联通路由表
        ip route add 127.0.0.0/8 dev lo table CU
        #建立网卡设备的本地回环
        ip route flush cache
        #刷新路由表
        IP_A=$IP0
        #将新的ppp0动态IP赋值给中间变量
        date >> /var/log/autoupdatertlog
        #输出当前时间到日志文件
        echo $adsL0 "flushed to route table CU" >> /var/log/autoupdatertlog
        #输出“刷新新的静态路由到路由表CU”到日志文件中
      fi
    else
      date >> /var/log/autoupdatertlog
      echo "电脑没有ppp0的连接,更新对应的路由表失败,请检查网络连接后重新配置 !" >> /var/log/autoupdatertlog
    fi
#
    if [ -e /run/ppp1.pid ]; then
      IP1=`ifconfig $adsL1 | sed ':a ; N;s/\n/ / ; t a ; ' | awk -v head="inet " -v tail="  net" '{print substr($0, index($0,head)+length(head),index($0,tail)-index($0,head)-length(head))}' | sed s/[[:space:]]//g`
      if [ "$IP_B" = "" ] || [ "$IP_B" != "$IP1" ]; then
        GD_GW=`ifconfig $adsL1 | sed ':a ; N;s/\n/ / ; t a ; ' | awk -v head="tion" -v tail="ppp " '{print substr($0, index($0,head)+length(head),index($0,tail)-index($0,head)-length(head))}' | sed s/[[:space:]]//g`
        GD_NET=${IP1%.*}
        GD_NET=${GD_NET%.*}
        GD_NET=$GD_NET$tmpstr$tmpstr
#
        ip route flush table GD
#
        ip route add $GD_NET dev $adsL1 src $IP1 table GD
        ip route add default via $GD_GW table GD
        ip rule add from $IP1 table GD
        ip route add $LC_NET1 dev $eth1 table GD
        ip route add $LC_NET2 dev $eth2 table GD
        ip route add 127.0.0.0/8 dev lo table GD
        ip route flush cache
        IP_B=$IP1
        date >> /var/log/autoupdatertlog
        echo $adsL1 "flushed to route table GD" >> /var/log/autoupdatertlog
      fi
    else
      date >> /var/log/autoupdatertlog
      echo "电脑没有ppp1的连接,更新对应的路由表失败,请检查网络连接后重新配置 !" >> /var/log/autoupdatertlog
    fi
#
    let logsct++
    #日志数量自增1
    if [ "$logsct" -gt 2222 ]; then
    #如果日志数量大于2222
      echo "" > /var/log/autoupdatertlog
      #清空日志文件
      logsct="0"
      #日志数量归零
    fi
#
    sleep 222
    #每222秒循环一次
  done

sudo chmod ug+rx /usr/bin/autoupdatert
#为autoupdatert文件增加可执行属性

sudo nano /etc/rc.local
双线ADSL找到"exit 0" 在该行之前插入下面的内容:

  iptables -t nat -A POSTROUTING -s 169.254.219.0/24 -o ppp0 -j MASQUERADE
  iptables -t nat -A POSTROUTING -s 169.254.219.0/24 -o ppp1 -j MASQUERADE
  iptables -t nat -A POSTROUTING -s 169.254.218.0/24 -o ppp0 -j MASQUERADE
  iptables -t nat -A POSTROUTING -s 169.254.218.0/24 -o ppp1 -j MASQUERADE
  #确保每个内网网段发出的数据包都能被转发到ppp0和ppp1口
#
  sleep 11
  #等待11秒系统网络配置好后,再启用下面两条命令,确保生效
#
  ip route replace default scope global nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 1
  #设置两条线路各50%的负荷,如果设置为weight 60和weight 40则表示两条线路各承担60%和40%的负荷
  #负载均衡(Load balancing),默认基于目的IP的负载均衡,实现路由器本身及local network都能实现负载均衡,并且是容错形式
#
  ip route flush cache
  #刷新路由表缓存
#
  /usr/bin/autoupdatert &
#启动脚本,自动定时检查双线adsl的动态IP,若有变化则自动更新联通和广电的路由表, &表示在后台运行进程

#iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j LOG --log-prefix “NEW_HTTP_CONN:” #从iptables到"NEW_HTTP_CONN:"显示为两行实为一行
#作用实时显示内网上电脑正在连接哪些网址,本人未启用该行,注释掉了

重启电脑后测试本地网络LC_NET1/2中的主机是否可以通过两条线路访问外网
ping -c3 www.sohu.com -I ppp0
ping -c3 www.sohu.com -I ppp1

并检查以下两条命令是否可正常运行
sudo curl -s whatismyip.akamai.com --interface ppp0
#获取adsl线路1的本机公网IP
sudo curl -s whatismyip.akamai.com --interface ppp1
#获取adsl线路2的本机公网IP

#下面两条命令分别监控两条线路的负荷情况,按ctrl+c退出
sudo tcpdump -i ppp0
sudo tcpdump -i ppp1

经实测,经过双线adsl路由配置后,本地网的上网速度明显比不配置路由要快。

8. 设置DNS

在麒麟18.04中实测,本步骤可以跳过,若出现DNS网址解析问题可以参照本节内容)
首先重启电脑
cat /etc/resolv.conf
如果发现没有ISP方提供的DNS,则需修改一个文件来实现,如果没有该文件和目录就手动创建
sudo nano /etc/resolvconf/resolv.conf.d/tail
将该文件内容修改如下:
nameserver 119.6.6.6
#请修改为您的ISP的DNS服务器地址
nameserver 221.10.251.52
#请修改为您的ISP的第二DNS服务器地址,没有的话删除本行

通常DNS的服务器IP地址可以在路由器的运行状态页面查到,如果你的ubuntu能正常拨号上网,可以通过

9. 配置dhcp server

sudo nano /etc/default/isc-dhcp-server
找到 “INTERFACES=”
设置为:
INTERFACES=“enp0s1 enxfb”
#连接到飞鱼星路由器和TPLINK路由器的两块网卡名,中间有一空格相隔

sudo nano /etc/dhcp/dhcpd.conf
找到:
option domain-name “example.org”;
修改为:
#option domain-name “example.org”; #或者替换为您的真实域名服务器的网址
找到:
option domain-name-servers XXX.XXX.XXX.XXX;
修改为:
option domain-name-servers 119.6.6.6, 114.114.114.114;
#请用您的ISP服务商的DNS地址替换。两个IP地址用逗号相连,注意逗号前无空格,逗号后面有一个空格,并以分号结束。然后在该配置文件的最后加上以下内容来配置dhcp服务:

subnet 169.254.219.0 netmask 255.255.255.0 {
range 169.254.219.66 169.254.219.99;
option domain-name-servers 119.6.6.6,172.16.16.16;
#注意上面两个DNS服务器IP地址间用英文逗号分隔且无空格
option subnet-mask 255.255.255.0;
option routers 169.254.219.6;
#注意与/etc/default/isc-dhcp-server文件中设置的对应网卡、interfaces中对应网卡的IP地址和网段相同
option broadcast-address 169.254.219.255;
default-lease-time 600;
max-lease-time 7200;
}

subnet 169.254.218.0 netmask 255.255.255.0 {
range 169.254.218.66 169.254.218.99;
option domain-name-servers 119.6.6.6,172.16.16.16;
#注意上面两个DNS服务器IP地址间用英文逗号分隔且无空格
option subnet-mask 255.255.255.0;
option routers 169.254.218.6;
#注意与/etc/default/isc-dhcp-server文件中设置的对应网卡、interfaces中对应网卡的IP地址和网段相同
option broadcast-address 169.254.218.255;
default-lease-time 600;
max-lease-time 7200;
}

如果要为某个网卡配置固定地址,加入以下参考内容:
host T420 {
#host后面跟主机名称
hardware ethernet 08:00:06:25:c0:a5;
fixed-address 169.254.219.66;
}

然后运行以下命令:
sudo service isc-dhcp-server start
#启动dhcp服务
sudo service isc-dhcp-server stop
#停止dhcp服务
sudo service isc-dhcp-server status
#查看dhcp服务状态,如果显示inactive或dead,请根据提示查找原因
#经实测,isc-dhcp-server不能为两块同网段的网卡提供dhcp服务,即两块网卡必须分配两个不同的网段

重启电脑后
sudo ps -e|grep dhcp
如果没有找到dhcpd进程,则isc-dhcp-server没有加入自启动,运行以下命令
sudo update-rc.d isc-dhcp-server defaults
#将isc-dhcp-server加入开机默认启动程序中
sudo systemctl is-enabled isc-dhcp-server.service
#查询isc-dhcp-server是否已加入开机默认启动程序中

sudo sysv-rc-conf
#查询isc-dhcp-server是否已加入开机默认启动程序中

以上配置完成后重启networking
sudo service networking stop
sudo service networking start
最好以上操作完成建议直接重启电脑
sudo reboot

10. 配置路由器

检查网络配置和网线连接是否与2.3节的要求一致

进入飞鱼星路由器内网配置(LAN口设置)页面
将内网IP设置为:169.254.219.1
子网掩码:255.255.255.0
进入飞鱼星路由器外网配置(WAN口设置)页面,删除所有外网配置,WAN接口设置为不使用
进入DHCP服务器设置页面,选择不启用DHCP服务
重启路由器后,即可正常通过麒麟18.04上网。

进入TPLINK路由器内网配置(LAN口设置)页面
将内网IP设置为:169.254.218.1
子网掩码:255.255.255.0
进入TPLINK路由器外网配置(WAN口设置)页面,删除所有外网配置,WAN接口设置为不使用
进入DHCP服务器设置页面,选择不启用DHCP服务
重启路由器后,即可正常通过麒麟18.04上网。

另外一种通过上网的方法如下,但本人不推荐,因为WAN口网速通常只有100M,且不方便飞鱼星和TPLINK两个网段下的电脑手机之间相互访问:
1)将enxfb与TPLINK路由器的WAN口相连
2)进入TPLINK路由器WAN口设置页面,将WAN口连接类型改为“动态IP”方式,其他“手动设置DNS服务器”和“单播方式获取IP”均不选择
3)进入TPLINK路由器内网配置(LAN口设置)页面
将内网IP设置为:192.168.2.1(可自定义,需与TPLINK路由器WAN口相连的网卡enxfb的IP地址处于不同的网段)
子网掩码:255.255.255.0
4)进入DHCP服务器设置页面
1)启用DHCP服务
2)起始IP地址:192.168.2.66(可自定义)
5)结束IP地址:192.168.2.166(可自定义)
6)默认网关:192.168.2.1
7)DNS服务器1:119.6.6.6 (需与ISP提供的DNS一致)
8)DNS服务器2:172.16.16.16 (需与ISP提供的DNS一致)

11. 配置跨网段访问主机

在本网络中配置如下:
服务器(enp0s1:169.254.219.6)==主机A(169.254.219.66)
服务器(enxfb:169.254.218.6)==主机B(169.254.218.66)
主机B不能跨网段访问服务器IP:169.254.219.6(该IP用于在内网其他电脑中samba及vsftp访问)及主机B:169.254.219.66
解决办法如下:
sudo nano /etc/sysctl.conf
增加下面1行或将原有的该行前的#号删除
net.ipv4.ip_forward=1

12. 通过DDNS实现域名和动态IP绑定

12.1 利用AliDDNS实现域名和动态IP绑定

首先,你得先到阿里云官网先申请一个免费域名,如www.hasil.top

apt-get install wget curl cron

下载AliDDNS脚本: wget -O /usr/sbin/AliDDNS-v2.0.sh https://bitbucket.org/ilemonrain/aliddns/downloads/AliDDNS-v2.0.sh

或到http://www.hasil.top:808/09-softwares下载AliDDNS-v2.0.sh,并将文件复制到/usr/sbin下。
sudo chmod +x /usr/sbin/AliDDNS-v2.0.sh
#为脚本文件加上可执行属性
sudo /usr/sbin/AliDDNS-v2.0.sh
#执行脚本,弹出启动菜单中选择AliDDNS.sh 配置并运行工具 (如果已有配置将会直接运行)
开始进入AliDDNS配置向导:
[Info] 请输入一级域名 (比如 example.com)
(此项必须填写,查看帮助请输入“h”): 填写你的域名如hasil.top
然后提示输入二级域名:
一二级域名填写举例,以www.hasil.top为例,hasil.top为一级域名, www为二级域名。
其中AccessKey ID 和 AccessKey Secret 在登陆阿里云后–>控制台–>点击用户图标可查看。推荐有动手能力的用户使用子用户AccessKey(访问控制台RAM) 分配的权限!这样最安全!使用子用户AccessKey,请分配 AliyunDNSReadOnlyAccess(只读访问云解析(DNS)的权限) 和 AliyunDNSFullAccess(管理云解析(DNS)的权限) 这两个权限!

各选项中如果你不懂或者不需要配置,请留空,直接回车!必要时自行百度
配置完成后自动运行如果出现:
[Success] DDNS记录更新成功,新的IP为:…
即为DDNS记录同步成功,稍后等待DNS解析生效,即可完成DDNS域名更换!
  
sudo nano /etc/crontab
在文件最后添加如下行:
*/11 * * * * root /usr/sbin/AliDDNS-v2.0.sh run >/dev/null 2>&1 &

最后在/etc/profile.d下创建一个脚本文件,实现在用户登录时自动进行更新公网IP到阿里云。该文件夹按字母顺序执行,请确保本脚本在pppoe脚本以后。
sudo nano /etc/profile.d/startaliddns.sh
内容如下:

startup AliDDNS

/usr/sbin/AliDDNS-v2.0.sh run >/dev/null 2>&1 &

或者将
/usr/sbin/AliDDNS-v2.0.sh run >/dev/null 2>&1 &
加入到/etc/rc.local文件中“exit 0”行的前一行

以上为单线ADSL的配置方法,双线ADSL配置如下
如果两个ADSL连接ppp0和ppp1都有公网IP(使用命令curl whatismyip.akamai.com查看本机的IP地址是否与ifconfig显示的ppp0和ppp1的IP地址一致,如果不一致就说明你的ISP没有给你提供公网IP),跳过下面的内容。

本人的个人云服务器从单线ADSL升为双线ADSL后,其中ppp0有公网IP,ppp1无公网IP,经curl -s whatismyip.akamai.com命令如果从ppp1口出去则查询到的IP实际上是一个内网IP,经常导致从外部无法正常访问服务器。

当已经配置好双线adsl路由表后,对/usr/sbin/AliDDNS-v2.0.sh文件有两种处理方法,来使其正常运行,一种如下:
sudo cp /usr/sbin/AliDDNS-v2.0.sh /usr/sbin/AliDDNS-v2.0.sh.bak
sudo nano /usr/sbin/AliDDNS-v2.0.sh
找到所有的curl -s whatismyip.akamai.com字符
替换为curl -s whatismyip.akamai.com --interface ppp0
即可。
如果重启电脑后AliDDNS-v2.0.sh还不能正常运行,请再参考以下另一种方法。

当已经配置好双线adsl路由表后,若AliDDNS-v2.0.sh还不能正常运行,只能换个思路,在已知ppp0有公网IP的情况下通过截取ifconfig命令显示的ppp0的inet地址来取得本机的实际公网IP,经实测对AliDDNS-v2.0.sh修改如下:
sudo cp /usr/sbin/AliDDNS-v2.0.sh /usr/sbin/AliDDNS-v2.0.sh.bak
sudo nano /usr/sbin/AliDDNS-v2.0.sh
找到:
function_AliDDNS_CheckConfig(){
将该函数下的原:

  AliDDNS_LocalIP=`sed '/^AliDDNS_LocalIP=/!d;s/.*=//' /etc/OneKeyAliDDNS/config.cfg | sed 's/\"//g'`

替换为:

if [ -e /run/ppp0.pid ]; then
    AliDDNS_LocalIP=`ifconfig "ppp0" | awk -v head="inet " -v tail=" netmask" '{print substr($0, index($0,head)+length(head),index($0,tail)-index($0,head)-length(head))}' | sed s/[[:space:]]//g | sed /^$/d`
else
    echo -e "${Msg_Error}电脑没有ppp0的连接,请检查网络连接后重新配置 !"
    exit 1
fi

找到:
function_AliDDNS_GetLocalIP(){
将该函数下的原:

  AliDDNS_LocalIP=`$AliDDNS_LocalIP 2>&1`

替换为:

   if [ -e /run/ppp0.pid ]; then
        AliDDNS_LocalIP=`ifconfig "ppp0" | awk -v head="inet " -v tail=" netmask" '{print substr($0, index($0,head)+length(head),index($0,tail)-index($0,head)-length(head))}' | sed s/[[:space:]]//g | sed /^$/d`
    else
        echo -e "${Msg_Error}未能获取本机IP!"
        echo -e "${Msg_Error}电脑没有ppp0的连接,请检查网络连接后重新配置 !"
        exit 1
    fi

即可实现通过截取ifconfig命令显示的ppp0的inet地址来取得本机的实际公网IP,并上传Aliyun服务器更新对应域名的IP。

sudo nano /etc/rc.local
将:
/usr/sbin/AliDDNS-v2.0.sh run >/dev/null 2>&1 &
加入到/etc/rc.local文件中“exit 0”行的前一行

最后
** sudo chmod 700 /etc/OneKeyAliDDNS/config.cfg
#将该文件属性改为700以保护阿里域名用户密码的安全性**

12.2 利用花生壳实现域名和动态IP绑定

如果你的ISP不能提供公网IP,那你只能到花生壳官网先申请一个域名和内网穿透花生壳服务,建议花点钱购买内网穿透花生壳服务。

在花生壳官网下载peanuthull客户端并解压,我用的是phddns_2.0.6_amd64.deb
或到http://www.hasil.top:808/09-softwares
下载后将将文件复制到/tmp
sudo dpkg -i phddns_2.0.6_amd64.deb
sudo phddns
这时提示:Enter server address(press ENTER use phddns60.oray.net):
直接回车
接着提示:
Enter your Oray account: (输入花生壳帐号)
Password: (输入花生壳帐号对应密码)
Network interface(s):
[ppp0] = [IP:101.204.31.73]
[br0] = [IP:192.168.3.10]
[lo] = [IP:127.0.0.1]
Choose one(default eth0):ppp0
Log to use(default /var/log/phddns.log):
/var/log/phddns.log
Save to configuration file (/etc/phlinux.conf)?(yes/no/other):yes
101.204.31.73
NIC bind success
defOnStatusChanged okConnecting
defOnStatusChanged okRedirecting
defOnStatusChanged okConnecting
defOnStatusChanged okDomainListed
defOnDomainRegistered jjtjXXXX.gicp.net
defOnDomainRegistered yangXXXXX.wicp.net
……
……
UserType: 0
看到上面这些就表示登录成功,这个时候可以按ctrl+c先退出程序

sudo chmod 700 /etc/phlinux.conf
#保护花生壳的用户和密码
以后台模式启动花生壳并检查运行情况
sudo phddns -c /etc/phlinux.conf -d
提示:
101.204.31.73
NIC bind success
phddns started as daemon!

sudo tail /var/log/phddns.log
查看phddns运行情况。

查看进程ID
sudo ps -A | grep phddns
19049 ? 00:00:00 phddns
让后台进程退出
sudo kill -9 19049

将花生壳加到系统启动时运行
sudo nano /etc/rc.local
在文件的末尾exit 0的前一行加上一行:
/usr/bin/phddns -c /etc/phlinux.conf -d

12.3 直接利用TPLINK路由器和飞鱼星路由器的动态域名功能绑定花生壳动态域名

注意:若使用TPLINK路由器和飞鱼星路由器自带的动态域名功能,则本文以上所有内容均不适用
经实测,TPLINK用一段时间后会掉线,飞鱼星要好点。
飞鱼星路由器界面:
高级选项–动态域名
选择一个WAN接口
点击启用动态DNS客户端,输入服务类型、服务提供方的用户名和密码

TPLINK路由器界面:
动态DNS
选择服务提供者,输入花生壳的用户名和密码,点击启用DDNS,过会或重启后即可见到域名信息。

13. 安装ftp服务

请见:http://www.hasil.top:808/06-网络配置、软路由、WIFI热点、SAMBA和FTP服务器搭建/在ubuntu下安装和配置ftp服务器.txt

14. 安装samba服务

请见:http://www.hasil.top:808/06-网络配置、软路由、WIFI热点、SAMBA和FTP服务器搭建/在ubuntu下安装和配置samba服务器.txt

15. 参考资料

排名不分先后,感谢各位作者提供的经验!

Ubuntu超级802.11N无线软路由
Ubuntu+ADSL拨号+花生壳实现域名动态IP绑定
Ubuntu下利用AP架设WIFI热点(含网卡支持查询)
把ubuntu配置成路由器+DHCP
将debian配置为软路由
在Ubuntu12.04上使用hostapd和dhcp3-server建Wi-Fi AP
How to Setup a Wireless Ubuntu Router
ubuntu常用软件包deb的安装与卸载
Linux下PPPoE断线自动重拨
AliDDNS的作者ilemonrain
linux网络路由管理之二(多ISP出口负载均衡)
linux 高级路由及流量控制总结
在Linux下配置多线路ADSL的方法

你可能感兴趣的:(基于ubuntu18.04搭建双线adsl路由器和私有云服务器(samba、ftp和http))