在之前的两篇文章中:
因为 Linux 下的 tc 流量整形只能对出口流量进行配置。若要双向流量限制,只能通过之前的方案:使用一台作为路由的主机当作网关来控制另一台主机,在路由主机上配置 tc 策略进行双向出口 (路由->WAN, 路由->内部主机) 流量整形。
但是这里有一个缺点,那就是很麻烦。除非你想作为一个专门的网管,对内部网络进行配置,然而大多数情况下,其实只需要有一台测试的 Linux 临时配置一下而已。
那么有没有一种很爽的方式来解决这个问题呢?那肯定是有的。
在之前的两篇文章中:
因为 Linux 下的 tc 流量整形只能对出口流量进行配置。若要双向流量限制,只能通过之前的方案:使用一台作为路由的主机当作网关来控制另一台主机,在路由主机上配置 tc 策略进行双向出口 (路由->WAN, 路由->内部主机) 流量整形。
但是这里有一个缺点,那就是很麻烦。除非你想作为一个专门的网管,对内部网络进行配置,然而大多数情况下,其实只需要有一台测试的 Linux 临时配置一下而已。
那么有没有一种很爽的方式来解决这个问题呢?那肯定是有的。
在某些时候需要模拟一些弱网环境,而 Linux 本身通过可以配置成一个路由,同时结合流量整形命令 tc 可以达到弱网以及流量限制的功能。
对于流量整形,单个网络适配器只能正对出口带宽进行整形,所以需要配置一台路由以便于双向流量整形 (WAN 及 LAN)。同时此路由设备后面可以接入多台主机设备,以便于统一配置弱网环境。
文本以 CentOS 7 为例在 Windows 桌面环境的 VMware 虚拟机环境下配置一个弱网模拟的路由。
对于其它虚拟机软件或平台,可以找到类似的方法配置网络。对于其它 Linux 发行版也可以找到对应的网络配置,此方法大概率兼容更高的 CentOS 版本以及 RHEL
需要两台虚拟机,一台作为路由设备,一台作为客户机。客户机也可以用其它操作系统,例如 Win 10,这里不影响实际配置。
路由机的网卡选择桥接模式(或者NAT,取决于需要)。另外添加一个额外的网适配器,选择自定义网络 VMNet19。
客户机的唯一网络适配器选择自定网络 VMNet19。
(本文Github地址为: learning-kcp-protocol)
在特定的应用场合,单纯的使用 TCP 不能满足需要。直接使用 UDP 数据报不能保证数据的可靠性,常需要在应用层基于 UDP 实现一套可靠的传输协议。
直接使用 KCP 协议是一种选择,它实现了健全的自动重传协议,并在此之上提供了自由的参数调整。通过配置参数和合适的调用方式来适应不同场景的需求。
KCP 简介:
KCP是一个快速可靠协议,能以比 TCP 浪费 10%-20% 的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。
整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。
本文对 KCP 协议的基础收发流程、拥塞窗口、超时算法作简单介绍,并同时提供了参考的示例代码。
参阅的 KCP 的版本为撰写文章时的最新版本。本文不会完全贴上所有KCP的源代码,会在关键处添加指向源代码相应位置的链接。
大多数 Linux 发行版中都带有流量控制的命令 tc。 关于 tc 的 qdisc 可以文末的文章可以理解更 … 阅读更多
有些服务需要依赖正确的时间,本地部署 ntpd 服务来平滑同步时间: 安装 ntp 从 http://www. … 阅读更多
CentOS 下的名字服务的部署和基础配置:
先安装相关软件包。
yum install bind-chroot bind-utils -y
编辑 /etc/named.conf 文件,在 option 配置中编辑 listen-on 与 allow-query 选项,前者添加额外的服务监听端口,后者添加授权查询请求主机。
options { listen-on port 53 { 127.0.0.1; 10.1.1.1; 10.1.2.1; }; ... allow-query { localhost; 10.1.1.0/24; 10.1.2.0/24; }; .... } zone "test.local" IN { type master; file "test.local.zone"; allow-update { none; }; };
创建文件 /var/named/test.local.zone 并编辑以下内容
$ORIGIN test.local. $TTL 86400 @ IN SOA dns1.test.local. root.test.local. ( 2021122501 ; serial 21600 ; refresh after 6 hours 3600 ; retry after 1 hour 604800 ; expire after 1 week 86400 ) ; minimum TTL of 1 day @ IN NS dns1.test.local. dns1 IN A 10.1.1.1 @ IN A 10.1.1.1 www IN CNAME test.local.
编辑完成名字区域文件后建议使用命令检查一下合法性:
named-checkzone test.local /var/named/test.local.zone
启动名字服务:
systemctl enable named-chroot systemctl start named-chroot
安装 ESXi 的主机因为是用的家用机主板,兼容性原因网卡 PICE 开机不能使用,主板仅支持异常断电自启。在异常断电之后,有远程物理按下开机的需求。
PC家用机开机本质就是把主板上的 Power Switch 针脚连接到机箱上,按钮按下给两个针脚路后主板开机。
想起树莓派有 GPIO 端口,一番研究之下确实可以通过树莓派驱动继电器来实现打开主板电源的功能。
需要材料:
1.树莓派3B+ (40针版本GPIO)
2.杜邦线(公对母若干,母对母x3)
3.KV019 继电器(若有更多需求,也可以买多路继电器,这里仅使用单路继电器,仅需¥1.56)
4. 杜邦线一分二(可选,没有的话只能使用树莓派开机,不能按下物理按键)
5.小号平口螺丝刀
因为某些原因战损了旧的16G存储卡,换用32G之后,使用官方 Raspberry Pi Imager 写入官方 … 阅读更多
在 CentOS 中的 firewalld 是基于 iptables 和一些其它程序构建的,firewalld 使用了一些更加友好的配置方式来实现了对 iptables 操作。同时还扩展了一些 iptables 本身不支持的功能,例如定时防火墙规则。完整的程序以及库依赖见 firewalld 官网 https://firewalld.org/。
iptables 通过操作 Linux 内核 netfilter 模块来针对网络包处理。
在操作命令之前请临时关闭机器的 firewalld 防火墙,同时需要确保有物理机的访问权限(或者虚拟机中的物理终端操作权限),有些规则会屏蔽 SSH 22 端口的访问导致无法后续操作。
# 停用 firewalld systemctl stop firewalld
iptables 的过滤规则是通过匹配策略链上的规则来决定不同情况下对包的处理,包含了三种策略链:
INPUT: 通过此链来控制传入的连接和包,例如允许来自某些 IP 的 SSH 传入连接。
FORWARD: 转发控制链接,如果你需要在机器上配置路由功能时会用到此链。
OUTPUT: 传出链,当前主机发送请求到外部时匹配此链,通常没有特殊需求时也不会给它配置特殊规则。
可以通过下列命令来查看当前设置的 iptables 规则:
~]# iptables -S -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT
对应的策略链会有默认的行为。意味着定义了未匹配任何规则的时,链对数据包的处理。
使用如下命令查看当前策略链的行为(同时输出了未匹配此链的数据包数量和流量)。
~]# iptables -L -v | grep policy Chain INPUT (policy ACCEPT 0 packets, 0 bytes) Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) Chain OUTPUT (policy ACCEPT 821 packets, 293K bytes)
如果当前的策略链的行为不是如上所示,可以通过下列命令来设置接受所有数据的行为:
iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT
可以尝试如下命令丢弃所有情况下的包:
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
注意:此时外部主机将无法访问主机,同时主机内部也无法访问外部。
OpenWrt 是一个面向嵌入式的Linux系统,常用于刷入路由器替换路由器原有系统。
个人部署的虚拟化环境中所有虚拟机需要一个私有的网络地址,ESXi 本身不提供 DHCP 功能,所以只能找其它解决方案。最开始部署了一个 CentOS7 当作路由器,详细请参考 https://linuxhint.com/centos7_router/ 一文。但是不太方便,最终考虑安装专给路由器诞生的 OpenWrt 系统。
准备工作:ESXi (安装目标),ESXi 中的 Windows (Web配置 OpenWrt),CentOS 或其它 Linux (转换官方镜像)。