我已经设置了带有赛扬 j1900 处理器的 Linux 路由器,安装了 Arch Linux 和防火墙。通过 PPPoE 连接到 ISP。

防火墙正在降低最大下载速度,上传看起来不错:

当我通过 systemctl 停止防火墙并再次进行测试时,一切看起来都很好。

即使出于测试目的,我也没有设置任何区域和策略,因此防火墙配置很简单。

/etc/firewalld/firewalld.conf  

DefaultZone=drop  
CleanupOnExit=yes  
CleanupModulesOnExit=no  
IPv6_rpfilter=strict  
IndividualCalls=no
LogDenied=all
FirewallBackend=nftables
FlushAllOnReload=yes
ReloadPolicy=INPUT:DROP,FORWARD:DROP,OUTPUT:DROP
RFC3964_IPv4=yes
NftablesFlowtable=enp4s0 enp5s0 enp6s0
NftablesCounters=no
NftablesTableOwner=yes
/etc/firewalld/direct.xml  

<?xml version="1.0" encoding="utf-8"?>
<direct>
  <passthrough ipv="ipv4">-t mangle -I FORWARD -p tcp --syn -j TCPMSS --clamp-mss-to-pmtu</passthrough>
  <passthrough ipv="ipv6">-t mangle -I FORWARD -p tcp --syn -j TCPMSS --clamp-mss-to-pmtu</passthrough>
</direct>

EDIT: I have managed it without MSS Clamping.
      I changed MTU for enp6s0 to 1512, pppoe-vlan to 1508 and for ppp0 to 1500. 
      Unfortunately this does not help with max download speed.

网络配置由 systemd 完成,也非常简单:

/etc/systemd/network/enp4s0.network (LAN)  

[Match]
Name=enp4s0

[Network]
Address=192.168.1.1/28
Address=192.168.2.1/28
LinkLocalAddressing=ipv6
IPv6LinkLocalAddressGenerationMode=stable-privacy


/etc/systemd/network/enp6s0 (WAN)

[Match]
Name=enp6s0

[Network]
ConfigureWithoutCarrier=yes
VLAN=pppoe-vlan


/etc/systemd/network/pppoe-vlan.netdev

[NetDev]
Name=pppoe-vlan
Kind=vlan

[VLAN]
Id=6

以及 ppp 配置:

/etc/ppp/peers/kpn

linkname "pppoe"
updetach
plugin pppoe.so
nic-pppoe-vlan
noauth
defaultroute
defaultroute6
maxfail "5"
#usepeerdns
"persist"
+ipv6
user "*"
password "*"

这是非常简单的设置,所以我不知道为什么防火墙会导致这个问题。

任何建议都会很有帮助。

问候。

14

  • 1
    如果连接不需要数据包就能工作,那为什么要限制数据包呢?(我并不是说这是问题所在,但根据我的经验,使用 MTU 可以修复并产生速度问题。


    – 

  • 1
    此外,以太网数据包大小的实际最大 MTU 通常略大于(有时会显著大于)1500 字节 – 请参阅


    – 

  • 2
    @davidgo MTU 是最大以太网有效负载大小,而不是最大帧大小,并且几乎所有地方的默认 MTU 都是 1500,即使帧大小有时会因 VLAN 标签等原因而略有增加。(但即使到 ISP 的路径可以承载更大的帧,用户也不可能确切知道它允许在 1518 字节默认 L2MTU 之外增长多少 – 是 1526、1568 还是 1596? – 因此 1500 字节 MTU 和 1518 字节帧仍然是通用默认值。)并且给定 1500 字节最大有效负载减去 8 字节 PPPoE 标头,IP 数据包的最终空间变为 1492 字节


    – 


  • 1
    @davidgo:至于 MSS 限制,通常是为了避免碎片化——TCP 总是试图协商一个完全适合接口 MTU 的段大小,因此让防火墙“修补”握手以获得较小的 MSS 将导致数据包更小,碎片更少。(虽然在 OP 的情况下,它是同一台机器,因此 TCP 应该已经知道 ppp0 接口的较低 MTU……当客户端不知道路由器正在执行 PPPoE 时,才需要在路由器上进行手动限制。)


    – 

  • 1
    @Andrzej:不过我真正好奇的是,在速度测试中你会看到什么样的 CPU 负载……赛扬 j1900看起来应该能够处理 1 Gbps,但是添加的防火墙规则越多(而且firewalld 肯定会添加一些自己的规则),每个数据包所需的 CPU 就越多,等等。


    – 


最佳答案
1

我已经设置了带有赛扬 j1900 处理器的 Linux 路由器

我主要怀疑 Celeron J1900 的速度不够快,无法通过 PPPoE 处理 1 Gbps 的速度,而且还要检查每个数据包的大量防火墙规则。它似乎是一款基于 Atom 的 CPU,即使在当时也属于低端产品;更何况,您在评论中说,即使没有防火墙,速度测试也会消耗 100% 的一个核心。

(firewalld 网站声称 NftablesFlowtable 应该比传统的 Linux conntrack 流跟踪具有更高的性能……但这仍可能被 firewalld 的基本规则集所做的所有其他事情所抵消。)

虽然目前还不清楚有多少 CPU 占用是由于数据包转发,又有多少是由于 Speedtest 应用程序本身。可能是因为赛扬在没有其他负载时能够路由 1Gbps ,但当你在其上运行其他软件时就会不堪重负。

您使用的“Ookla 测速”应用似乎与我在 Debian 上找到的应用不同;后者占用大量 CPU,但我不知道您的版本是否也存在这种情况。不过,无论哪种情况,除了升级 CPU 之外,我建议尝试不同的“测速”工具 – 不仅用于测试互联网连接,还用于检查它是否也能在本地处理 1Gbps 。

(为了进行比较,我在 2007 年的 Xeon 系统上运行了一些测试,Debianspeedtest-cli应用程序在某些时候达到了 CPU 的约 450%,而iperf3 -P4两个本地系统之间只需要一个核心的约 7%。)

3

  • 有多个速度测试应用程序,官方应用程序是我所知道的最新应用程序。speedtest.net 是我运行的,看起来与 OP 运行的相同。根据我的经验,它往往能提供“最佳”基准,效率略高,并且在我作为浏览器运行的第 4 代酷睿 i3 ULT 上提供接近线速的速度/


    – 

  • 在同样的 2007 Xeon 上进行下载测试时,该程序的 CPU 占用率似乎约为 13%(结果约为 910 Mbps)。对于 Atom CPU 来说,除了 IP 路由和 nftables 之外,它可能仍然是一个相当大的额外负载。


    – 

  • 我同意你的回答。我在这台机器上安装了 OpenWRT,速度测试得到 ~810 Mbps,但 LuCI 无法访问。速度测试完成后单击即可获得结果。谢谢你的回答。


    –