原文地址

转发自恩山无线论坛 > 用户gladys

原始地址: https://www.right.com.cn/forum/thread-8255448-1-1.html

写在前面

折腾过不少路由系统,从一开始的老毛子,到后来的各家定制固件,再到官方固件、自己编译固件,发现可玩性都不够高。还好自己有一点点折腾服务器的经验,于是干脆一步到位,使用自己常用的Linux发行版Ubuntu作为底层系统,通过非侵入、最小化修改的方式实现一套路由器解决方案 整理的内容可能有疏漏,欢迎大家交流补充,在此提前谢各位大佬轻喷之恩。

选择Ubuntu作为路由器的理由

本节内容可能引起您的不适,请谨慎阅读。

  1. 足够稳定可靠,性能不差

    目前自己使用过的x86软路由,从J1900开始,到现在的J4125,性能都严重过剩,跑个Ubuntu服务器版,顺带跑个千兆网络乃至2.5G都没有一点问题。

    Ubuntu作为使用较为广泛的Linux发行版,除了预装些私货以外,在几年VPS的使用经历来看没有什么大问题,运行比较稳定。

  2. 配置管理标准化

    这个需求可能有的人没法理解。自己手里很多服务器,包括虚拟或者实体的都以Debian系为主,很多系统和软件配置,也都是依据Debian系的系统和软件进行编写维护的。使用完全不同的Linux发行版不利于配置的精细化管理和重用,尤其是需要配置的软件超过20个、配置文件数量超过100项以后。目前个人的配置文件不得不使用git进行仓库化和版本管理,并通过自己写的配置管理工具进行配置项的同步分发。

    举个简单的例子。在我用OpenWRT的时候,OpenWRT的系统服务还是采用init.d,而Debian系的服务配置全部使用systemd。这就意味着就服务配置文件一项而言,就需要多维护20个适用于init.d的系统服务配置文件用于适配OpenWRT,且对应的配置管理工具需要增加逻辑以适配OpenWRT,无疑大大增加了工作量。然而这只是一项,还有例如OpenSSH与DropBox,opkg与dpkg等许多例子。如此种种让配置管理维护成本激增,于是最终决定将网关系统也改为Debian系的操作系统。 通过操作系统的统一,路由器就可作为具有路由功能的服务器所对待,无需针对不同操作系统进行配置的适配,大大降低配置的创建、分发和维护成本。其他服务器上运行良好的服务也可以最少的改动移植到路由器中。

  3. 可定制性高

    有的人用OpenWRT可能只是习惯在UI上点点点,觉得每次系统重置就重新点一遍就行了,大不了再记一下笔记。有的人可能稍微有心一些,定期把配置下载备份。然而这些是建立在对程序深度定制没要求的用户,但凡需求高一些的用户,这些方法都是行不通的。 一个很明显的例子,开发者提供的很多默认配置选项或功能存在各种问题,要么存在缺陷、或是不符合自己的要求,或是和其它程序存在冲突的情况。例如同时对iptables修改出现冲突的问题,三年前我用OpenClash的时候,它搞崩OpenWRT的iptables导致没法上网的情况我已经数不清了。要么放弃OpenClash,要么就要自己动手丰衣足食。当然,这也不全是OpenClash的锅,因为作者也不知道用户到底在用什么可能与OpenClash不兼容的程序。

    假设你决定继续用OpenClash,那么只能尝试修改OpenClash的某些默认配置(例如其内置的一些运行脚本),以保证它的运行同你现在使用的程序兼容。如果你运气好,发现了OpenClash的问题,添加了相关逻辑修复了问题,然后希望给作者发个PR。结果作者可能会拒绝掉,理由是这个情况太小众。但对你不是啊,因为和它冲突的软件虽然大家不用,但你用的非常频繁。那OpenClash还要自动更新吗?如果要的话,你的修改可能会被覆盖掉;否则,没法及时获得最新的bug修复,可能会出现其他问题,而且手动更新也很麻烦。那只有自己在每次自动更新以后覆盖patch了。也许一两个程序、一两个文件的patch手动还能解决,但是如果patch文件太多呢?如果几个,甚至十几个软件都要这样呢?问题就很大了。

设置方法及注意事项

固定网卡名称

设置方法 ☮

  1. 将配置文件(custom-devices.rules)放置于/etc/udev/rules.d/目录下;
  2. ATTR{address}后面的MAC地址修改为自己设备对应的网卡MAC地址(可通过ifconfig -a命令获得)‘’
  3. 对应的NAME后面修改为自己喜欢的网卡别名;
  4. 配置文件示例在下面给出。

    # Located in /etc/udev/rules.d/custom-devices.rules
    # Network Interface Card
    # 格式:SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="(替换为MAC地址)", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="(替换的网卡名称)"
    # 举例:将MAC地址为 11:22:33:44:55:66:77 的网卡名称改为 eth1,每行设置一个网卡
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="11:22:33:44:55:66:77", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="eth1"
    

补充说明 ☸

之前手里有一台3965U,安装系统后6个网卡的名称出现了enp*s0和eth*混用的情况,因此通过udev将所有网卡统一名称。非必需步骤,强迫症患者福音。

网卡/网桥的基本配置

设置方法 ✝

  1. 检查当前系统下是否存在/etc/netplan/目录。若无,需运行命令apt install -y netplan.io安装netplan;
  2. 将配置文件(00-installer-config.yaml.yaml)放置于/etc/netplan/目录下,若有同名文件,替换之;
  3. 需要使用的网卡及名称根据实际情况进行替换,具体替换的方式通过配置文件内注释的方式予以说明;
  4. 配置文件示例在下面给出。

    # Located in /etc/netplan/00-installer-config.yaml
    # To config network interfaces
    # Run "sudo netplan generate && sudo netplan apply" after editing
    
    network:
    version: 2
    renderer: networkd
    ethernets:
    enp1s0: # 网卡enp1s0,作为LAN使用
      dhcp4: false # 禁用DHCPv4
      dhcp6: false # 禁用DHCPv6
      optional: true # 设置为非必须,防止Ubuntu的网络检查造成系统启动延迟
    enp2s0: # 网卡enp2s0,作为LAN使用,配置同网卡enp1s0一致
      dhcp4: false
      dhcp6: false
      optional: true
    enp4s0: # 网卡enp4s0,作为WAN使用
      dhcp4: true # 启用DHCPv4
      dhcp6: true # 启用DHCPv6
      optional: true # 设置为非必须,防止Ubuntu的网络检查造成系统启动延迟
      accept-ra: true # 接受Router Advertisement,IPv6适配相关的配置
    bridges:
    br_lan: # 将网卡enp1s0和网卡enp2s0组成网桥,网桥名称为br_lan
      interfaces: # 包含的所有网卡名称
        - "enp1s0"
        - "enp2s0"
      addresses: # 固定网卡所拥有的内网IP地址段
        - 192.168.2.1/24
        - fc00:192:168:2::1/64
      dhcp4: false # 禁用DHCPv4
      dhcp6: false # 禁用DHCPv6
      nameservers: # 设置默认DNS服务器,非必须
        addresses:
          - 223.5.5.5
          - 119.29.29.29
          # - "2400:3200::1"
      parameters:
        stp: true # 启用生成树协议,防止环路
        forward-delay: 4
      optional: true # 设置为非必须,防止Ubuntu的网络检查造成系统启动延迟
    

补充说明 ☪

这里使用netplan进行网卡配置,其通过yaml承载配置信息,清晰易读。一般而言,netplan会预装至Ubuntu系统中;否则可通过命令apt install -y netplan.io安装(需联网)。netplan配置文件放置于/etc/netplan/中,一般只需要替换默认的00-installer-config.yaml即可。本节所给出的netplan的配置示例中,底层的网络配置渲染器可采用Systemd-networkd(networkd),也可采用NetworkManager,具体可参考netplan的使用手册。示例配置中的其它内容将通过注释的形式予以说明。

需要注意的是,该配置作为路由器的基础配置,绝对不能出现错误,否则将可能无法通过SSH连接至路由器中。配置完成后通过命令:sudo netplan generate && sudo netplan apply生成与应用网络配置。 当该配置完成后,你的路由器就具备了基础的网络功能。只要安装了SSH,就可以在其他设备上对路由器进行操作,而不需要连接键盘和显示器至路由器中。SSH的配置优化将在第7节予以介绍。

PPPoE配置

设置方法 ✡

  1. 通过运行命令apt install -y ppp以安装ppp;
  2. 将配置文件(pppoe_dial)放置于/etc/ppp/peers目录下;
  3. 配置文件中,user “xxxxxx”和password “xxxxxx”改成你的PPPoE上网账号和密码;
  4. 将对应的系统服务配置文件pppoe_dial.service放置于/etc/systemd/system中;
  5. 运行systemctl daemon-reload以注册服务;
  6. 运行systemctl enable pppoe_dial即令服务开机启动(自动拨号);
  7. 运行systemctl start pppoe_dial立即拨号

    # Located in /etc/ppp/peers/pppoe_dial
    # Print debug info
    #debug
    logfile /var/log/pppoe_dial/run.log
    
    # interface name
    ifname pppoe_dial # 虚拟网卡名称设置为pppoe_dial
    
    # Keep pppd in terminal
    nodetach
    
    # Set default route
    defaultroute
    
    # Do not set PPP compression
    ipcp-accept-local
    ipcp-accept-remote
    local
    
    # Set PPPoE used interface
    plugin pppoe.so enp4s0 # PPPoE使用的实际网卡名称
    # Username & password
    user "******" # 你的上网用户名
    password "******" # 你的上网密码
    noauth
    # Hide password when print connect info
    hide-password
    
    # 启用IPv6
    # Use IPv6
    +ipv6
    ipv6cp-use-ipaddr
    ipv6cp-accept-local
    ipv6cp-accept-remote
    ipv6cp-max-failure 100
    ipv6cp-restart 2
    
    # Set default route v6
    defaultroute6
    
    usepeerdns
    
    # Conn check
    lcp-echo-interval 60 # Ping sending interval
    lcp-echo-failure 10 # Times of ping failure tolerance
    
    # Reconnect
    persist
    maxfail 10
    holdoff 1
    
    # PPPoE compliant settings.
    noaccomp
    default-asyncmap
    mtu 1452
    
    # Located in /etc/systemd/system/pppoe_dial.service
    [Unit]
    Description=PPPoE auto dial
    After=systemd-networkd.service
    StartLimitBurst=5
    StartLimitIntervalSec=120
    
    [Service]
    User=root
    ExecStartPre=-/bin/sh -ec '\
    /usr/bin/mkdir -p /var/log/pppoe_dial'
    ExecStart=pppd call pppoe_dial
    ExecStop=poff pppoe_dial
    Restart=always
    RestartSec=10s
    
    [Install]
    WantedBy=multi-user.target
    

补充说明 ☯

如果上网环境为PPPoE上网,那么需要进行这一步配置;如果你的上网环境为DHCP,那么当插上网线至WAN口时即可正常上网,无需进行这一步配置。

DNS配置

配置示例

# SmartDNS config
bind-tcp [::]:53

# 注意,当网卡上有多个IP地址时,绑定UDP套接字需要明确IP,否则仅网卡第一个IP生效(已作废)

补充说明 ☦

这里采用SmartDNS接管设备全局DNS。这里仅给出SmartDNS的配置示例(smartdns.conf),不给出具体的安装方法。你可以使用自己喜欢的方式安装SmartDNS,例如在https://github.com/pymumu/smartdns中使用作者所推荐的标准Linux系统的安装方式。关于程序手动安装与管理的方式,将在第7节中予以简要介绍。另外,关于SmartDNS配置的资料也较为丰富,你也可以使用一些其他网友提供的配置文件。

安装完成后,需要将本机DNS解析指向SmartDNS,你可以使用resolvconf进行设置。这里提供一个取巧的方法:使用root删除/etc/resolv.conf,重新新建该文件、修改内容(例如:nameserver 127.0.0.1)并保存,之后通过chattr +i /etc/resolv.conf命令使其成为不可修改文件。后续只要保证SmartDNS监听套接字不变(UDP 127.0.0.1:53)即可保证设备DNS服务正常运行。

需要提醒的是,这里SmartDNS作为基础的上游DNS服务,稳定可靠是第一要求。因此不推荐配置过于复杂的分流策略,建议仅配置可靠的上游以实现IP优选、解析加密等基本需求即可。复杂的功能可交给更为功能更丰富的DNS工具实现,例如mosdns等。

注意,若使用SmartDNS接管系统DNS解析,需禁用系统自带的systmed-resolved,具体方法为: 运行命令 sudo systemctl stop systemd-resolved && sudo systemctl disable systemd-resolved

DHCP配置

设置方法

  1. 运行命令apt install -y dnsmasq以安装dnsmasq;
  2. 将配置文件(dhcp.conf)放置于/etc/dnsmasq.d目录下;
  3. 内网IPv4和IPv6网段配置可根据实际需要修改,具体参考配置文件示例中的注释说明;
  4. 配置文件示例在下面给出。

    # located in /etc/dnsmasq.d/dhcp.conf
    # Set the interface on which dnsmasq operates.
    # If not set, all the interfaces is used.
    interface=br_lan
    
    # To disable dnsmasq's DNS server functionality.
    port=0
    
    # To enable dnsmasq's DHCP server functionality.
    # 设置可分配的IPv4段为192.168.2.1/24,其中192.168.2.100 ~ 192.168.2.254用于随机分配,其余IP用于静态分配
    dhcp-range=192.168.2.100,192.168.2.254,255.255.255.0,24h
    # Set gateway as Router.
    dhcp-option=3,192.168.2.1
    # Set DNS server as Router.
    dhcp-option=6,192.168.2.1
    # Set NTP server as Router
    dhcp-option=42,192.168.2.1
    
    # DHCPv6 config
    # 设置有状态分配的IPv6地址段为fc00:192:168:2::1/120,同IPv4保持一致
    dhcp-range=fc00:192:168:2::1,fc00:192:168:2::ff,24h
    # 设置无状态分配的IPv6地址段为fc00:192:168:2::1/64,兼容大部分情况
    dhcp-range=fc00:192:168:2::,slaac
    dhcp-option=option6:dns-server,[fc00:192:168:2::1]
    dhcp-option=option6:ntp-server,[fc00:192:168:2::1]
    enable-ra
    dhcp-authoritative
    
    # Set static IPs of other PCs and the Router.
    # 指定静态IP示例:
    dhcp-host=00:11:22:33:44:55,ESXi,192.168.2.2,[fc00:192:168:2::2],infinite
    
    # Logging.
    log-facility=/var/log/dnsmasq/dnsmasq.log   # logfile path.
    log-async=25
    log-queries # log queries.
    log-dhcp    # log dhcp related messages.
    
    3.5.2 补充说明
    这一步的目的在于实现路由器向局域网内设备下发IP地址的功能,包括网关、DNS服务器、IP范围、NTP服务器、静态IP等的设置。
    
    3.6 路由功能配置
    3.6.1 设置方法
    1)        将配置文件(99-forward.conf)放置于/etc/sysctl.d目录下;
    2)        运行命令sysctl -p /etc/sysctl.d/99-forward.conf,以启用路由器的转发功能;
    3)        将配置文件(99-custom-modules.conf)放置于/etc/modules-load.d/目录下,
    4)        运行命令insmod nf_conntrack,以启用链接跟踪模块;
    5)        运行命令apt install -y iptables-persistent,安装防火墙配置持久化程序;
    6)        运行firewall-set.sh中的命令以设置防火墙NAT转发,需以root身份运行该脚本;
    7)        运行netfilter-persistent save以持久化步骤6)中所设置的防火墙命令;
    8)        上文中所提到的所有配置文件示例均在下面给出。
    
    # Located in /etc/sysctl.d/99-forward.conf
    net.ipv4.ip_forward=1
    net.ipv4.conf.all.forwarding=1
    net.ipv4.conf.default.forwarding=1
    net.ipv4.conf.all.route_localnet=1
    
    net.ipv6.conf.all.forwarding=1
    net.ipv6.conf.default.forwarding=1
    
    # Located in /etc/modules-load.d/custom-modules.conf
    nf_conntrack
    
    #!/bin/bash
    # firewall-set.sh
    
    # 根据你的WAN网卡名称对应修改!!!
    WAN_NAME='pppoe_dial'
    
    # IPv4设置
    iptables -t nat -N mt_rtr_4_n_rtr
    iptables -t nat -A POSTROUTING -j mt_rtr_4_n_rtr
    iptables -t nat -A mt_rtr_4_n_rtr -o ${WAN_NAME} -j MASQUERADE # 添加路由到作为WAN的网卡的自动源地址转换规则
    
    # 添加IPv4转发优化规则
    iptables -t mangle -N mt_rtr_4_m_rtr
    iptables -t mangle -A FORWARD -j mt_rtr_4_m_rtr
    iptables -t mangle -A mt_rtr_4_m_rtr -o ${WAN_NAME} -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # 针对PPPoE链接的优化
    iptables -t mangle -A mt_rtr_4_m_rtr -m state --state RELATED,ESTABLISHED -j ACCEPT # 允许已建立连接的数据包直接通过
    iptables -t mangle -A mt_rtr_4_m_rtr -m conntrack --ctstate INVALID -j DROP
    iptables -t mangle -A mt_rtr_4_m_rtr -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
    iptables -t mangle -A mt_rtr_4_m_rtr -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
    iptables -t mangle -A mt_rtr_4_m_rtr -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
    iptables -t mangle -A mt_rtr_4_m_rtr -i br_lan -o ${WAN_NAME} -j ACCEPT
    
    # IPv6 NAT设置,与IPv4基本一致
    ip6tables -t nat -N mt_rtr_6_n_rtr
    ip6tables -t nat -A POSTROUTING -j mt_rtr_6_n_rtr
    ip6tables -t nat -A mt_rtr_6_n_rtr -o ${WAN_NAME} -j MASQUERADE # 添加路由到作为WAN的网卡的自动源地址转换规则
    
    # 添加IPv6转发优化规则
    ip6tables -t mangle -N mt_rtr_6_m_rtr
    ip6tables -t mangle -A FORWARD -j mt_rtr_6_m_rtr
    ip6tables -t mangle -A mt_rtr_6_m_rtr -o ${WAN_NAME} -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
    ip6tables -t mangle -A mt_rtr_6_m_rtr -m state --state RELATED,ESTABLISHED -j ACCEPT
    ip6tables -t mangle -A mt_rtr_6_m_rtr -m conntrack --ctstate INVALID -j DROP
    ip6tables -t mangle -A mt_rtr_6_m_rtr -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
    ip6tables -t mangle -A mt_rtr_6_m_rtr -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
    ip6tables -t mangle -A mt_rtr_6_m_rtr -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
    ip6tables -t mangle -A mt_rtr_6_m_rtr -i br_lan -o ${WAN_NAME} -j ACCEPT
    

补充说明

这里对路由的基本知识进行简要的介绍,以帮助读者理解每项防火墙配置的目的,不想看可以跳过此部分。基本知识介绍的内容纯靠回忆手敲,可能有些许错误,还望大神们轻喷。

路由动作究其根本,就是路由器从一个端口接收到数据包后,决定数据包应当转发至的端口过程。与交换动作不同,路由的转发动作的决定依据是路由表。系统内核网络栈通过将数据包的IP地址与路由表中IP段进行匹配(最长前缀匹配)以查找到最适合的路由表表项,进而决定数据包的转发出口。因此,路由表的配置是必须的,否则网络内设备无法通外网通信。而Ubuntu默认不开启路由转发功能,因此需通过sysctl开启系统的路由转发功能。 其次,路由器还有一个重要的功能:网络地址转换(NAT)。面对公网IP地址枯竭的问题,我们使用NAT技术以实现IP地址的有效利用。NAT一般分为三种:静态NAT、动态NAT和端口多路复用(PAT)。而我们常说的NAT1~4均为PAT。

对于由iptables所实现的NAT来说,比较重要的概念有两项:SNAT和DNAT。SNAT的含义为“源地址转换”,指的是内网发出的、源地址为保留IP的数据包在路由匹配完成并进入网卡A时,将源地址替换为对应网卡A上的一个外部IP地址(不一定是公网IP,想想看什么是NAT444);这样就实现了仅有保留IP同公网IP之间的通信。其中较为特殊的MASQUERADE功能含义在于,源IP地址(内网保留地址)所要被替换的外部IP地址由系统自动选择。DNAT为“目的地址转换”,其作用在于实现外网对不具有公网IP的内部设备的访问。在开放内部服务时较为有用,而不是本文所述路由器所必需的配置,故此处不做展开说明。

IPv6适配

如果以上的配置全部成功,你的路由器下的设备应该能通过NAT(PAT)的方式连接IPv6网络。如果你希望每个设备都有一个独立的IPv6地址,可通过dhcp6c与dnsmasq配合即可实现IPv6地址的分配。这里不详细展开说明的原因在于,本人采用了动态NAT的思路实现IPv6地址的分配,具体将在第4节进行介绍。

这里推荐一篇文章:https://github.com/torhve/blag/blob/master/using-dnsmasq-for-dhcpv6.md。英文写的,但用翻译工具翻译后阅读也不会有障碍。它介绍了使用dhcp6c与dnsmasq配合实现IPv6地址下发的配置方式,仅供参考。

用路由功能管理工具(待补充)

在上文3.6节所述的防火墙设置虽然可以保证路由功能正常,但在实际的使用环境中肯定是不方便的,因此本人写了个小工具用来自动完成防火墙设置。具体包括四个基本功能,将在下文进行详细介绍。这个工具目前仅个人在使用,可能还会有很多bug,不太推荐大家用(如果有不介意的可以试一试,后续会放出来)

  1. 基础路由功能
  2. 双上游健康度检查及故障秒级切换
  3. 基于MAC地址的端主机访问控制
  4. 基于动态NAT的IPv6适配

功能和性能评估(待补充)

  1. 主备上游故障转移与恢复
  2. IPv6适配情况
  3. 访问外网测速
  4. 内网设备间互联测速

写在最后

本文作为长久以来基于Ubuntu的路由器折腾记录的总结,希望能为有相关需求或部分需求的用户提供一点小小的参考。后续将视情况更新一些在Ubuntu路由器上折腾过的小东西。

网关折腾过的其它有趣的东西(待补充)

自用防火墙管理工具

这是自己数年前用Go写的一个小玩意儿,从最开始简陋的防火墙脚本演变而来的。最开始的功能就是把自己所在地区的IP作为白名单IP加到VPS的防火墙里以防止某些端口扫描或者主动探测行为的,后来演变为简单的防火墙入站规则管理工具。那时候觉得firewalld有点重,而且可能和别的存在编辑防火墙行为的程序出现冲突,于是就自己重新造了轮子。

基本思路就是将(传输层协议组,端口组)作为一个“应用”对待,例如:HTTP = (tcp 80,443,8080,8443),然后为每个“应用”配置一个ipset,以控制该应用的访问权限。

现在正在尝试将底层替换成eBPF等更高效的实现,方便替换底层实现也是自己造轮子的好处之一。

NTP服务器

设置方法 ☯

  1. 运行命令 apt install -y chrony 安装chrony
  2. 如有需要,调整系统时区至北京时间(CST): timedatectl set-timezone Asia/Shanghai;
  3. 将配置文件(chrony.conf)放置于/etc/chrony/目录下,若有重名文件,替换之;
  4. 将配置文件(ntp-pool.sources)放置于/etc/chrony/sources.d目录下;
  5. 重启chrony服务:sudo systemctl restart chrony;
  6. 可运行命令chronyc sources -v,以查看上游NTP服务器状态。
  7. 配置文件示例在下面给出。

    # Located in /etc/chrony/chrony.conf
    # Use chronyc sources -v to check NTP sources
    
    # Use time sources from DHCP.
    sourcedir /run/chrony-dhcp
    
    # Use NTP sources found in /etc/chrony/sources.d.
    sourcedir /etc/chrony/sources.d
    
    # This directive specify the location of the file containing ID/key pairs for
    # NTP authentication.
    keyfile /etc/chrony/chrony.keys
    
    # This directive specify the file into which chronyd will store the rate
    # information.
    driftfile /var/lib/chrony/chrony.drift
    
    # Save NTS keys and cookies.
    ntsdumpdir /var/lib/chrony
    
    # Uncomment the following line to turn logging on.
    #log tracking measurements statistics
    
    # Log files location.
    logdir /var/log/chrony
    
    # Stop bad estimates upsetting machine clock.
    maxupdateskew 100.0
    
    # This directive enables kernel synchronisation (every 11 minutes) of the
    # real-time clock. Note that it can’t be used along with the 'rtcfile' directive.
    rtcsync
    
    # Step the system clock instead of slewing it if the adjustment is larger than
    # one second, but only in the first three clock updates.
    makestep 1 3
    
    # Get TAI-UTC offset and leap seconds from the system tz database.
    # This directive must be commented out when using time sources serving
    # leap-smeared time.
    leapsectz right/UTC
    
    # Set chrony server to bind to
    # 设置绑定的IP,这里同时启用IPv4和IPv6访问
    bindcmdaddress 0.0.0.0
    bindcmdaddress ::
    # 允许访问的IP段,根据实际情况配置
    # 也可允许所有IP访问,通过防火墙实现访问控制
    # 以下配置为允许所有IP访问该NTP服务器
    allow 0.0.0.0/0
    allow ::/0
    # Located in /etc/chrony/sources.d/ntp-pool.sources
    # 设置 NTP 服务器池
    server 0.pool.ntp.org iburst
    server 1.pool.ntp.org iburst
    server 2.pool.ntp.org iburst
    server 3.pool.ntp.org iburst
    # 如果是在国内,也可以用下面的 NTP 服务器
    pool ntp.aliyun.com        iburst maxsources 4
    pool cn.ntp.org.cn         iburst maxsources 4
    pool ntp.ntsc.ac.cn        iburst maxsources 4
    pool time1.cloud.tencent.com iburst maxsources 4
    pool time2.cloud.tencent.com iburst maxsources 4
    pool time3.cloud.tencent.com iburst maxsources 4
    pool time4.cloud.tencent.com iburst maxsources 4
    pool time5.cloud.tencent.com iburst maxsources 4
    

透明代理

(IPv6暂未找到比较优雅的实现方式,目前正在调研OSPF方案,故暂不更新)

内网穿透/内网Web服务管理

基于EC20模块的短信网关/4G上网实现

4G模块基础设置

  1. 确认你的工控机PCB板上有没有SIM卡插槽;
  2. 如无SIM卡插槽,可购买USB接口的4G模块,一般会带个插槽,缺点是模块没法安装到设备内部,看着不好看;有的话就可以购买mPCIe口的4G模块了,PCB板上自带的SIM插槽一般都能用;
  3. 个人买的型号是:移远EC20CEHDLG-MINIPCIE-CB。大家也可以购买其它品牌,但要注意其是否支持你SIM的运营商。【此处绝无带货恰饭】,选择这款的理由是它支持三网4G,而且网上资料较多较全;
  4. 装上SIM卡和4G模块,开机以确认模块是否可用。Ubuntu 20.04版本及以后实测免驱可用。

短信网关的实现

4G拨号上网

自用消息推送服务

DNS分流

SSH配置优化

DDNS

系统配置sysctl优化

更换xanmod内核

手动安装和设置方法

可能感兴趣的内核特性

  1. RFC3489 full-cone NAT 支持
  2. Cloudflare TCP collapse(TCP队列坍缩)以实现高吞吐量和低延迟的支持

Aria2安装与基于RSS的资源自动下载