查看: 39960|回复: 96
[Debian]
Ubuntu 软路由全套折腾指南(持续更新)
火..
[复制链接]
gladys
gladys
当前离线
积分521
IP卡
狗仔卡
电梯直达
1#
发表于 2022-9-24 03:07
|
只看该作者
|倒序浏览
|阅读模式
本帖最后由 gladys 于 2024-7-18 01:05 编辑
目录
1. 写在前面
2. 选择Ubuntu作为路由器的理由
3. 设置方法及注意事项
3.1 固定网卡名称
3.2 网卡/网桥的基本配置
3.3 PPPoE配置
3.4 DNS配置
3.5 DHCP配置
3.6 路由功能配置
3.7 IPv6适配
3.8 性能优化
4. 自用路由功能管理工具(待补充)
4.1 基础路由功能
4.2 双上游健康度检查及故障秒级切换
4.3 基于MAC地址的端主机访问控制
4.4 基于动态NAT的IPv6适配
5. 功能和性能评估(待补充)
5.1 主备上游故障转移与恢复
5.2 IPv6适配情况
5.3 访问外网测速
5.4 内网设备间互联测速
6. 写在最后
7. 网关折腾过的其它有趣的东西(待补充)
7.1 自用防火墙管理工具
7.2 NTP服务器
7.3 透明代理
7.4 内网穿透/内网Web服务管理
7.5 基于EC20模块的短信网关/4G上网实现
7.6 自用消息推送服务
7.7 DNS分流
7.8 SSH配置优化
7.9 DDNS
7.10 系统配置sysctl优化
7.11 更换xanmod内核
7.12 Aria2安装与基于RSS的资源自动下载
7.13 UPS服务器
8 附件
1. 写在前面
折腾过不少路由系统,从一开始的老毛子,到后来的各家定制固件,再到官方固件、自己编译固件,发现可玩性都不够高。还好自己有一点点折腾服务器的经验,于是干脆一步到位,使用自己常用的Linux发行版Ubuntu作为底层系统,通过非侵入、最小化修改的方式实现一套路由器解决方案
整理的内容可能有疏漏,欢迎大家交流补充,在此提前谢各位大佬轻喷之恩。
2. 选择Ubuntu作为路由器的理由
本节内容可能引起您的不适,请谨慎阅读。
2.1 足够稳定可靠,性能不差
目前自己使用过的x86软路由,从J1900开始,到现在的J4125,性能都严重过剩,跑个Ubuntu服务器版,顺带跑个千兆网络乃至2.5G都没有一点问题。Ubuntu作为使用较为广泛的Linux发行版,除了预装些私货以外,在几年VPS的使用经历来看没有什么大问题,运行比较稳定。
2.2 配置管理标准化
这个需求可能有的人没法理解。自己手里很多服务器,包括虚拟或者实体的都以Debian系为主,很多系统和软件配置,也都是依据Debian系的系统和软件进行编写维护的。使用完全不同的Linux发行版不利于配置的精细化管理和重用,尤其是需要配置的软件超过20个、配置文件数量超过100项以后。目前个人的配置文件不得不使用git进行仓库化和版本管理,并通过自己写的配置管理工具进行配置项的同步分发。
举个简单的例子。在我用OpenWRT的时候,OpenWRT的系统服务还是采用init.d,而Debian系的服务配置全部使用systemd。这就意味着就服务配置文件一项而言,就需要多维护20个适用于init.d的系统服务配置文件用于适配OpenWRT,且对应的配置管理工具需要增加逻辑以适配OpenWRT,无疑大大增加了工作量。然而这只是一项,还有例如OpenSSH与DropBox,opkg与dpkg等许多例子。如此种种让配置管理维护成本激增,于是最终决定将网关系统也改为Debian系的操作系统。
通过操作系统的统一,路由器就可作为具有路由功能的服务器所对待,无需针对不同操作系统进行配置的适配,大大降低配置的创建、分发和维护成本。其他服务器上运行良好的服务也可以最少的改动移植到路由器中。
2.3 可定制性高
有的人用OpenWRT可能只是爱好在UI上点点点,觉得每次系统重置就重新点一遍就行了,大不了再记一下笔记。有的人可能稍微有心一些,定期把配置下载备份。然而这些是建立在对程序深度定制没要求的用户,但凡需求高一些的用户,这些方法都是行不通的。
一个很明显的例子,开发者提供的很多默认配置选项或功能存在各种问题,要么存在缺陷、或是不符合自己的要求,或是和其它程序存在冲突的情况。例如同时对iptables修改出现冲突的问题,三年前我用OpenClash的时候,它搞崩OpenWRT的iptables导致没法上网的情况我已经数不清了。要么放弃OpenClash,要么就要自己动手丰衣足食。当然,这也不全是OpenClash的锅,因为作者也不知道用户到底在用什么可能与OpenClash不兼容的程序。
假设你决定继续用OpenClash,那么只能尝试修改OpenClash的某些默认配置(例如其内置的一些运行脚本),以保证它的运行同你现在使用的程序兼容。如果你运气好,发现了OpenClash的问题,添加了相关逻辑修复了问题,然后希望给作者发个PR。结果作者可能会拒绝掉,理由是这个情况太小众。但对你不是啊,因为和它冲突的软件虽然大家不用,但你用的非常频繁。那OpenClash还要自动更新吗?如果要的话,你的修改可能会被覆盖掉;否则,没法及时获得最新的bug修复,可能会出现其他问题,而且手动更新也很麻烦。那只有自己在每次自动更新以后覆盖patch了。也许一两个程序、一两个文件的patch手动还能解决,但是如果patch文件太多呢?如果几个,甚至十几个软件都要这样呢?问题就很大了。
3. 设置方法及注意事项
3.1 固定网卡名称
3.1.1 设置方法
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"复制代码
3.1.2 补充说明
之前手里有一台3965U,安装系统后6个网卡的名称出现了enp*s0和eth*混用的情况,因此通过udev将所有网卡统一名称。非必需步骤,强迫症患者福音。
3.2 网卡/网桥的基本配置
3.2.1 设置方法
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
- dc00: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的网络检查造成系统启动延迟复制代码
3.2.2 补充说明
这里使用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节予以介绍。
3.3 PPPoE配置
3.3.1 设置方法
1) 通过运行命令apt install -y ppp以安装ppp;
2) 将配置文件(pppoe_dial)放置于/etc/ppp/peers目录下;
3) 配置文件中,user "******"和password "******"改成你的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复制代码
3.3.2 补充说明
如果上网环境为PPPoE上网,那么需要进行这一步配置;如果你的上网环境为DHCP,那么当插上网线至WAN口时即可正常上网,无需进行这一步配置。
3.4 DNS配置
3.4.1 配置示例
server-name ubuntu-router
bind-tcp [::]:53
bind [::]:53
tcp-idle-time 120
cache-size 8192
cache-persist yes
cache-file /tmp/smartdns.cache
prefetch-domain yes
serve-expired yes
serve-expired-ttl 86400
serve-expired-reply-ttl 1
speed-check-mode ping,tcp:80,tcp:443
dualstack-ip-selection yes
dualstack-ip-allow-force-AAAA yes
dualstack-ip-selection-threshold 10
rr-ttl-min 5
rr-ttl-max 600
rr-ttl-reply-max 600
max-reply-ip-num 2
response-mode first-ping
log-level notice
log-file /var/log/smartdns/smartdns.log
dnsmasq-lease-file /var/lib/misc/dnsmasq.leases
server-tls 223.5.5.5 -group bootstrap -group alidns
server-tls 223.6.6.6 -group bootstrap -group alidns
server-tls dns.alidns.com -group alidns
server-tls 1.12.12.12 -group bootstrap -group dnspod
server-tls 120.53.53.53 -group bootstrap -group dnspod
server-tls dot.pub -group dnspod
domain-rules /dns.alidns.com/ -speed-check-mode none -nameserver bootstrap
domain-rules /doh.pub/ -speed-check-mode none -nameserver bootstrap
domain-rules /dot.pub/ -speed-check-mode none -nameserver bootstrap
3.4.2 补充说明
这里采用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
3.5 DHCP配置
3.5.1 设置方法
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地址段为dc00:192:168:2::1/120,同IPv4保持一致
dhcp-range=dc00:192:168:2::1,dc00:192:168:2::ff,24h
# 设置无状态分配的IPv6地址段为dc00:192:168:2::1/64,兼容大部分情况
dhcp-range=dc00:192:168:2::,slaac
dhcp-option=option6:dns-server,[dc00:192:168:2::1]
dhcp-option=option6:ntp-server,[dc00: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,[dc00: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等的设置。
IPv6内网网段设置为dc00开头实际上并不合适,这一地址段只是保留地址而非内网地址,不过这样设置可以让Windows正确检查IPv6连通性
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复制代码
3.6.2 补充说明
这里对路由的基本知识进行简要的介绍,以帮助读者理解每项防火墙配置的目的,不想看可以跳过此部分。基本知识介绍的内容纯靠回忆手敲,可能有些许错误,还望大神们轻喷。
路由动作究其根本,就是路由器从一个端口接收到数据包后,决定数据包应当转发至的端口过程。与交换动作不同,路由的转发动作的决定依据是路由表。系统内核网络栈通过将数据包的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的内部设备的访问。在开放内部服务时较为有用,而不是本文所述路由器所必需的配置,故此处不做展开说明。
3.7 IPv6适配
如果以上的配置全部成功,你的路由器下的设备应该能通过NAT(PAT)的方式连接IPv6网络。如果你希望每个设备都有一个独立的IPv6地址,可通过dhcp6c与dnsmasq配合即可实现IPv6地址的分配。
需要说明的是,本人采用了动态一对一NAT的思路实现IPv6公网地址的分配,原因在于家宽IPv6前缀每天都会变化,会干扰局域网内IPv6网络的管理,而本人习惯于局域网内的所有IP尽可能保持稳定。在网关建立一对一的IPv6映射可以最大限度减少IPv6地址变化对局域网的干扰,将变化局限在网关上。
这里推荐一篇文章:https://github.com/torhve/blag/b ... smasq-for-dhcpv6.md。英文写的,但用翻译工具翻译后阅读也不会有障碍。它介绍了使用dhcp6c与dnsmasq配合实现IPv6地址下发的配置方式,仅供参考。
3.8 网卡性能优化
网卡性能优化一般涉及到中断队列设置、系统和网卡的收发缓存设置,五元组哈希设置,RSS/RPS调优等。
RSS调优是重点,为充分发挥多核性能,需要由硬件通过五元组哈希的方式将数据包尽可能平均分给多个队列,并绑定对应的CPU核处理,这样系统能够最大限度利用CPU处理数据包。
然而遗憾的是,不少网卡(包括常见的i210, i225之类)并不支持PPPoE的硬件级多队列均衡收包,如果使用软路由直接拨号,就会出现所有数据包全部排入一条队列的情况。如有条件,建议购买设备前仔细查阅网卡手册,确认硬件级RSS的支持情况。
如手头的网卡确实不支持PPPoE的RSS,那么只能通过RPS缓解,即单队列收包、多核心处理中断,虽然效果差一点但也不至于“一核有难八核围观”。
PPPoE在链路层隔离、鉴权等方面做得很好,但协议开销很大,而且硬件卸载支持情况的远不如单纯的以太网帧好。不过,数年前的J4125在设置好RPS后已经可以轻松驾驭正常MTU的千兆PPPoE,而PPPoE已经逐渐被IPoE等技术取代,不如静待未来。
具体优化配置有空再整理出来。
按理说系统优化的内容不应放在这一节,但务必注意在局域网设备的TCP拥塞控制算法不能用BBR!不能用BBR!不能用BBR!局域网设备的使用场景和VPS,尤其是境外VPS的使用场景完全不一致。
TCP拥塞控制算法仅作用于TCP协议的发送端,如果软路由没有部署工作于传输层且依赖TCP通信的程序,仅用于网络层数据包转发那根本没必要在意TCP拥塞控制算法。
如果有自建网盘等服务,还要注意,BBR的参数配置适用于长胖网络,也就是高延迟/大带宽的广域网环境,回国线路正好满足这一要求所以能用,但局域网是超低延迟,实际上用了会降速!直接用cubic就行。
4. 自用路由功能管理工具(待补充)
在上文3.6节所述的防火墙设置虽然可以保证路由功能正常,但在实际的使用环境中肯定是不方便的,因此本人写了个小工具用来自动完成防火墙设置。具体包括四个基本功能,将在下文进行详细介绍。这个工具目前仅个人在使用,可能还会有很多bug,不太推荐大家用(如果有不介意的可以试一试,后续会放出来)
4.1 基础路由功能
4.2 双上游健康度检查及故障秒级切换
4.3 基于MAC地址的端主机访问控制
4.4 基于动态NAT的IPv6适配
5. 功能和性能评估(待补充)
5.1 主备上游故障转移与恢复
5.2 IPv6适配情况
5.3 访问外网测速
5.4 内网设备间互联测速
6. 写在最后
本文作为长久以来基于Ubuntu的路由器折腾记录的总结,希望能为有相关需求或部分需求的用户提供一点小小的参考。后续将视情况更新一些在Ubuntu路由器上折腾过的小东西。
7. 网关折腾过的其它有趣的东西(待补充)
7.1 自用防火墙管理工具
这是自己数年前用Go写的一个小玩意儿,从最开始简陋的防火墙脚本演变而来的。最开始的功能就是把自己所在地区的IP作为白名单IP加到VPS的防火墙里以防止某些端口扫描或者主动探测行为的,后来演变为简单的防火墙入站规则管理工具。那时候觉得firewalld有点重,而且可能和别的存在编辑防火墙行为的程序出现冲突,于是就自己重新造了轮子。
基本思路就是将(传输层协议组,端口组)作为一个“应用”对待,例如:HTTP = (tcp 80,443,8080,8443),然后为每个“应用”配置一个ipset,以控制该应用的访问权限。
现在正在尝试将底层替换成eBPF等更高效的实现,方便替换底层实现也是自己造轮子的好处之一。
7.2 NTP服务器
7.2.1 设置方法
1)运行命令 apt install -y chrony 安装chrony
2)如有需要,调整系统时区至北京时间(CST): timedatectl set-timezone Asia/Shanghai;
2)将配置文件(chrony.conf)放置于/etc/chrony/目录下,若有重名文件,替换之;
3)将配置文件(ntp-pool.sources)放置于/etc/chrony/sources.d目录下;
4)重启chrony服务:sudo systemctl restart chrony;
5)可运行命令chronyc sources -v,以查看上游NTP服务器状态。
6)配置文件示例在下面给出。
# 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
复制代码
7.3 透明代理
(IPv6暂未找到比较优雅的实现方式,目前正在调研OSPF方案,故暂不更新)
7.4 内网穿透/内网Web服务管理
7.5 基于EC20模块的短信网关/4G上网实现
7.5.1 4G模块基础设置
1)确认你的工控机PCB板上有没有SIM卡插槽;
2)如无SIM卡插槽,可购买USB接口的4G模块,一般会带个插槽,缺点是模块没法安装到设备内部,看着不好看;有的话就可以购买mPCIe口的4G模块了,PCB板上自带的SIM插槽一般都能用;
3)个人买的型号是:移远EC20CEHDLG-MINIPCIE-CB。大家也可以购买其它品牌,但要注意其是否支持你SIM的运营商。【此处绝无带货恰饭】,选择这款的理由是它支持三网4G,而且网上资料较多较全;
4)装上SIM卡和4G模块,开机以确认模块是否可用。Ubuntu 20.04版本及以后实测免驱可用。
7.5.2 短信网关的实现
7.5.3 4G拨号上网
7.6 自用消息推送服务
7.7 DNS分流
7.8 SSH配置优化
7.9 DDNS
7.10 系统配置sysctl优化
7.11 更换xanmod内核
7.2.1 手动安装和设置方法
7.2.2 可能感兴趣的内核特性
1)RFC3489 full-cone NAT 支持
2)Cloudflare TCP collapse(TCP队列坍缩)以实现高吞吐量和低延迟的支持
7.12 Aria2安装与基于RSS的资源自动下载
8. 附件
1. 配置文件和脚本
ubuntu 路由软件
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
分享到:
QQ好友和群
QQ空间
收藏60
支持3
反对0
相关帖子
• 基于Ubuntu的软路由网络性能调优【软路由高级DIY篇】
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
使用道具
举报
置顶卡
沉默卡
喧嚣卡
顶贴卡
显身卡
jackyxiongcn
jackyxiongcn
当前离线
积分1725
IP卡
狗仔卡
2#
发表于 2022-9-24 09:34
|
只看该作者
看看有什么
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
runking
runking
当前离线
积分622
IP卡
狗仔卡
3#
发表于 2022-9-24 10:09
|
只看该作者
好文章,谢谢分享!
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
幽灵道人
幽灵道人
当前离线
积分598
IP卡
狗仔卡
4#
发表于 2022-9-24 12:20
|
只看该作者
谢谢分享。。。。。。。。。。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
wmf1029
wmf1029
当前离线
积分209
IP卡
狗仔卡
5#
发表于 2022-9-24 14:40
|
只看该作者
好文章,谢谢分享!
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
cjf
cjf
当前离线
积分1588
IP卡
狗仔卡
6#
发表于 2022-9-24 15:33
|
只看该作者
感觉好高大上的样子,问下这个还能当系统用吗?能再加个NAS功能吗?
点评
gladys
可以,最基本NAS功能用Samba server就可以实现(https://ubuntu.com/tutorials/install-and-configure-samba#1-overview),高级一点可以搞ZFS(实现安全文件系统),BT下载之类的拉个Docker就可以(https://hub.doc
详情
回复
发表于 2022-9-24 22:36
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
nmgmax
nmgmax
当前离线
积分1144
IP卡
狗仔卡
7#
发表于 2022-9-24 17:16
|
只看该作者
思考思考!!!
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
Moto88
Moto88
当前离线
积分574
IP卡
狗仔卡
8#
发表于 2022-9-24 17:32
|
只看该作者
谢谢分享
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
798388
798388
当前离线
积分156
IP卡
狗仔卡
9#
发表于 2022-9-24 17:40
|
只看该作者
感谢大礼分享
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
jwpia
jwpia
当前离线
积分1333
IP卡
狗仔卡
10#
发表于 2022-9-24 17:51
|
只看该作者
谢谢楼主的分享
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
tzmag
tzmag
当前离线
积分113
IP卡
狗仔卡
11#
发表于 2022-9-24 20:15
|
只看该作者
谢谢分享
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
a5276815
a5276815
当前离线
积分162
IP卡
狗仔卡
12#
发表于 2022-9-24 20:21
|
只看该作者
大神都是这么的秀。。。。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
yz8303
yz8303
当前离线
积分365
IP卡
狗仔卡
13#
发表于 2022-9-24 21:28
|
只看该作者
谢谢分享。。。。。。。。。。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
gladys
gladys
当前离线
积分521
IP卡
狗仔卡
14#
楼主|
发表于 2022-9-24 22:36
|
只看该作者
cjf 发表于 2022-9-24 15:33
感觉好高大上的样子,问下这个还能当系统用吗?能再加个NAS功能吗?
可以,最基本NAS功能用Samba server就可以实现(https://ubuntu.com/tutorials/ins ... re-samba#1-overview),高级一点可以搞ZFS(实现安全文件系统),BT下载之类的拉个Docker就可以(https://hub.docker.com/r/linuxserver/transmission)
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡
雪韵凌寒
雪韵凌寒
当前离线
积分674
IP卡
狗仔卡
15#
发表于 2022-9-28 10:49
|
只看该作者
谢谢楼主热心分享
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复
支持
反对
使用道具
举报
显身卡