FRIMIN

Web Name: FRIMIN

WebSite: http://www.frimin.com

ID:324202

Keywords:

FRIMIN

Description:


跳至内容

简单模拟弱网的终极解决方案

在之前的两篇文章中:

使用 Linux 内置 tc 命令来模拟弱网环境

创建一台 Linux 路由器设备以模拟弱网环境

因为 Linux 下的 tc 流量整形只能对出口流量进行配置。若要双向流量限制,只能通过之前的方案:使用一台作为路由的主机当作网关来控制另一台主机,在路由主机上配置 tc 策略进行双向出口 (路由->WAN, 路由->内部主机) 流量整形。

但是这里有一个缺点,那就是很麻烦。除非你想作为一个专门的网管,对内部网络进行配置,然而大多数情况下,其实只需要有一台测试的 Linux 临时配置一下而已。

那么有没有一种很爽的方式来解决这个问题呢?那肯定是有的。

虚拟以太网设备

Linux 内置了创建虚拟以太网设备的支持。通过 ip-link 可以添加虚拟的以太网设备,下列命令可以创建一组虚拟以太网接口:

ip link add dev veth type veth peer name vpeer

veth 和 vpeer 设备互为对端。可以对其分配 ip 地址等正常网络设备的操作。

网络命名空间

同时 Linux 也支持网络命名空间 ip-netns,网络命名空间作为网络堆栈的一个副本。包含自己的路由,防火墙和网络设备。通过配置可用的网络命名空间,就可以在单个主机上配置一个包可以通过两次防火墙!

通过将虚拟以太网设备的 vpeer 端设备移动到网络命名空间中,并且配置正确的 ip 和 默认路由规则。在网络命名空间中就可以访问外部网络:

ip netns add myns # 创建命名空间ip link set vpeer netns myns # 移动 vpeer 到命名空间中

双向流量控制

目标进程启动在网络命名空间中,然后直接在两个虚拟以太网设备上通过 tc 配置流量规则,则可以实现双向流量控制:网络命名空间中的 vpeer 设备上配置,则意味着是命名空间中的内部到外部的流量进行整形。veth 设备则是配置外部网络到命名空间内部的流量整形。

这样就可以这样的通过双向流量整形来实现模拟下载很慢的情况了(如果只是限制发出的包仅仅只是限制了确认回包。虽然也可以通过这种方式来限制发送端的发送窗口进而影响发送速率,但是不是实际理想的情况),实际的网络状态可能非常好。

成品解决方案

上述所有的配置功能已经编写好一个脚本:https://github.com/frimin/vetc.sh,并已兼容 firewalld / iptables / nftables 防火墙由非命名空间网络 NAT 到命名空间网络中。

https://superuser.com/questions/764986/howto-setup-a-veth-virtual-network
https://etherarp.net/connecting-network-namespaces-with-veth/index.html
https://gist.github.com/dpino/6c0dca1742093346461e11aa8f608a99#file-ns-inet-sh-L64
https://samwho.dev/blog/emulating-bad-networks/
https://github.com/lukaszlach/docker-tc

发布于文章、服务器开发标签: bash、linux、tc于简单模拟弱网的终极解决方案留下评论

创建一台 Linux 路由器设备以模拟弱网环境

在某些时候需要模拟一些弱网环境,而 Linux 本身通过可以配置成一个路由,同时结合流量整形命令 tc 可以达到弱网以及流量限制的功能。

对于流量整形,单个网络适配器只能正对出口带宽进行整形,所以需要配置一台路由以便于双向流量整形 (WAN 及 LAN)。同时此路由设备后面可以接入多台主机设备,以便于统一配置弱网环境。

文本以 CentOS 7 为例在 Windows 桌面环境的 VMware 虚拟机环境下配置一个弱网模拟的路由。

对于其它虚拟机软件或平台,可以找到类似的方法配置网络。对于其它 Linux 发行版也可以找到对应的网络配置,此方法大概率兼容更高的 CentOS 版本以及 RHEL

虚拟机配置

需要两台虚拟机,一台作为路由设备,一台作为客户机。客户机也可以用其它操作系统,例如 Win 10,这里不影响实际配置。

路由机的网卡选择桥接模式(或者NAT,取决于需要)。另外添加一个额外的网适配器,选择自定义网络 VMNet19。

客户机的唯一网络适配器选择自定网络 VMNet19。

继续阅读“创建一台 Linux 路由器设备以模拟弱网环境”

发布于文章、服务器开发标签: ESXi、linux、nas、tc创建一台 Linux 路由器设备以模拟弱网环境有2条评论

KCP 协议基本数据结构和算法介绍

(本文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的源代码,会在关键处添加指向源代码相应位置的链接。

继续阅读“KCP 协议基本数据结构和算法介绍”

发布于文章、服务器开发标签: kcp、linux、网络于KCP 协议基本数据结构和算法介绍留下评论

AI 中 100% 缩放显示与实际像素问题

illustrator 中遇到一个实际编辑的大小和导出图片后缩放大小不一致的问题,最开始以为是文档栅格效果设置的问题,实际修改无效果。

解决方案:https://illustrator.uservoice.com/forums/333657-illustrator-desktop-feature-requests/suggestions/33253402-100-size-is-actually-actual-size

取消首选项中:常规->以 100% 缩放比例显示打印大小。

发布于问题记录标签: Adobe Illustrator于AI 中 100% 缩放显示与实际像素问题留下评论

Windows Server 2019 部署 L2TP/ipsec 服务的一些坑

关于部署远程服务的文章视频网上内容已经很多了:

部署:https://www.snel.com/support/how-to-set-up-an-l2tp-ipsec-vpn-on-windows-server-2019/

自动路由规则添加:http://woshub.com/add-routes-after-connect-vpn-windows/

但是有些坑要注意:Win 10 内置的 L2TP/ipsec 的客户端默认不能连接NAT后面的L2TP服务器,需要按照说明处理:https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-zh.md#windows-%E9%94%99%E8%AF%AF-809

另外建议首次配置不要用 Windows 设备当测试客户端(包括Windows Server 自己),建议用其它设备 iOS/MAC/Android 连接 L2TP 服务器。

需要给用户设置拨入中的网络访问权限为允许。

另外编写了一个快速配置 L2TP 客户端的 Win 脚本:https://github.com/frimin/l2tp-ipsec-setup-client.ps1

发布于问题记录标签: nas、Windows Server于Windows Server 2019 部署 L2TP/ipsec 服务的一些坑留下评论

使用 Linux 内置 tc 命令来模拟弱网环境

大多数 Linux 发行版中都带有流量控制的命令 tc。

关于 tc 的 qdisc 可以文末的文章可以理解更多 tc 的 qdisc 相关的内容。

这里直接给出模拟弱网的命令。

直接作用于指定物理网卡:

# 200m 延迟 30ms 抖动 + 10%丢包 + 10%重复 + 10% 乱序tc qdisc add dev ens256 root netem delay 200ms 30ms loss 10% duplicate 10% reorder 10%

作用于网卡下指定的端口,这里以 2000 端口为例:

tc qdisc add dev ens256 root handle 1: htbtc class add dev ens256 parent 1: classid 1:10 htb rate 10000mbittc qdisc add dev ens256 parent 1:10 handle 10: netem delay 200ms 30ms loss 10% duplicate 10% reorder 10%tc filter add dev ens256 parent 1:0 protocol ip prio 1 u32 match ip dport 2000 0xffff flowid 1:10

更复杂一点的情况,若当前机器为路由设备,出口网卡为 ens192, 内部网络为 ens256 网段为 192.168.200.0/24, 对传入该网段 2000 端口和从 2000 端口传出的数据全部执行流量控制:

tc qdisc del dev ens192 roottc qdisc add dev ens192 root handle 1: htbtc class add dev ens192 parent 1: classid 1:10 htb rate 10000mbittc qdisc add dev ens192 parent 1:10 handle 10: netem delay 150ms 30mstc filter add dev ens192 parent 1:0 protocol ip prio 1 u32 match ip src 192.168.200.0/24 match ip sport 2000 0xffff flowid 1:10tc qdisc del dev ens256 roottc qdisc add dev ens256 root handle 1: htbtc class add dev ens256 parent 1: classid 1:10 htb rate 10000mbittc qdisc add dev ens256 parent 1:10 handle 10: netem delay 150ms 30mstc filter add dev ens256 parent 1:0 protocol ip prio 1 u32 match ip dst 192.168.200.0/24 match ip dport 2000 0xffff flowid 1:10

另外一种,除了 192.168.200.0/24 相关 22/3389 端口之外所有的转发流量进行丢包:

tc qdisc del dev ens192 roottc qdisc add dev ens192 root handle 1: htbtc class add dev ens192 parent 1: classid 1:1 htb rate 10000mbittc class add dev ens192 parent 1: classid 1:2 htb rate 10000mbittc filter add dev ens192 parent 1: protocol ip prio 1 u32 match ip src 192.168.200.0/24 match ip sport 22 0xffff flowid 1:1tc filter add dev ens192 parent 1: protocol ip prio 2 u32 match ip src 192.168.200.0/24 match ip sport 3389 0xffff flowid 1:1tc filter add dev ens192 parent 1: protocol ip prio 3 u32 match ip src 192.168.200.0/24 flowid 1:2tc qdisc add dev ens192 parent 1:2 handle 20: netem delay 100ms 15ms loss 2% duplicate 2% reorder 2%tc qdisc del dev ens224 roottc qdisc add dev ens224 root handle 1: htbtc class add dev ens224 parent 1: classid 1:1 htb rate 10000mbittc class add dev ens224 parent 1: classid 1:2 htb rate 10000mbittc filter add dev ens224 parent 1: protocol ip prio 1 u32 match ip dst 192.168.200.0/24 match ip dport 22 0xffff flowid 1:1tc filter add dev ens224 parent 1: protocol ip prio 2 u32 match ip dst 192.168.200.0/24 match ip dport 3389 0xffff flowid 1:1tc filter add dev ens224 parent 1: protocol ip prio 3 u32 match ip dst 192.168.200.0/24 flowid 1:2tc qdisc add dev ens224 parent 1:2 handle 10: netem delay 100ms 15ms loss 2% duplicate 2% reorder 2%

移除流量控制规则:

 tc qdisc del dev ens256 root

查看状态:

tc -s qdisc show dev ens256tc -s class show dev ens256tc -s filter show dev ens256

其他相关命令

# 删除 filter tc filter del dev ens256 parent 1: handle 800::800 prio 1 protocol ip u32

参考文章

tc(8), tc-netem(8)
https://arthurchiao.art/blog/lartc-qdisc-zh/ (页面快照备份)
发布于服务器开发标签: it、linux、tc于使用 Linux 内置 tc 命令来模拟弱网环境留下评论

使用 ntpd 时间同步

有些服务需要依赖正确的时间,本地部署 ntpd 服务来平滑同步时间:

rm -f /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

安装 ntp

yum install ntp -y

从 http://www.pool.ntp.org/zone/cn 获取 ntp 同步服务地址。编辑 /etc/ntp.conf 填入新的同步地址:

server 0.pool.ntp.orgserver 1.pool.ntp.orgserver 2.pool.ntp.orgserver 3.pool.ntp.org

或者使用阿里云的 ntp 同步服务器:

server ntp.aliyun.com iburst minpoll 6 maxpoll 10server ntp1.aliyun.com iburst minpoll 6 maxpoll 10server ntp2.aliyun.com iburst minpoll 6 maxpoll 10server ntp3.aliyun.com iburst minpoll 6 maxpoll 10server ntp4.aliyun.com iburst minpoll 6 maxpoll 10server ntp5.aliyun.com iburst minpoll 6 maxpoll 10server ntp6.aliyun.com iburst minpoll 6 maxpoll 10

开机启动和启动 ntpd 服务:

systemctl enable ntpdsystemctl start ntpd

也可以停止 ntpd 服务后进行手动同步:

systemctl stop ntpdntpdate 0.pool.ntp.org
发布于服务器开发标签: CentOS、it、linux于使用 ntpd 时间同步留下评论

CentOS 中部署 DNS 服务

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.1www     IN  CNAME       test.local.

编辑完成名字区域文件后建议使用命令检查一下合法性:

named-checkzone test.local /var/named/test.local.zone

启动名字服务:

systemctl enable named-chrootsystemctl start named-chroot
继续阅读“CentOS 中部署 DNS 服务”
发布于服务器开发标签: dns、it、linux于CentOS 中部署 DNS 服务留下评论

直通 SATA 设备到 ESXi 虚拟机中

SSH 连接到 ESXi,列出所有设备:

 ls -l /vmfs/devices/disks

从设备创建 vmdk:

vmkfstools -z /vmfs/devices/disks/t10.ATA_____HGST_HDN726050ALE610____________________NAG4P4YX____________ "/vmfs/volumes/Samsung 850 Pro/Ubuntu Storage/HGST_RDM_1.vmdk"

之后就可以添加硬盘到虚拟机中。

参考文章

https://gist.github.com/Hengjie/1520114890bebe8f805d337af4b3a064
发布于NAS、问题记录标签: ESXi于直通 SATA 设备到 ESXi 虚拟机中留下评论

使用树莓派 GPIO 端口控制继电器开启主机

安装 ESXi 的主机因为是用的家用机主板,兼容性原因网卡 PICE 开机不能使用,主板仅支持异常断电自启。在异常断电之后,有远程物理按下开机的需求。

PC家用机开机本质就是把主板上的 Power Switch 针脚连接到机箱上,按钮按下给两个针脚路后主板开机。

想起树莓派有 GPIO 端口,一番研究之下确实可以通过树莓派驱动继电器来实现打开主板电源的功能。

准备工作

需要材料:

1.树莓派3B+ (40针版本GPIO)

2.杜邦线(公对母若干,母对母x3)

3.KV019 继电器(若有更多需求,也可以买多路继电器,这里仅使用单路继电器,仅需¥1.56)

4. 杜邦线一分二(可选,没有的话只能使用树莓派开机,不能按下物理按键)

5.小号平口螺丝刀

继续阅读“使用树莓派 GPIO 端口控制继电器开启主机”
发布于NAS标签: linux、nas、树莓派于使用树莓派 GPIO 端口控制继电器开启主机留下评论

标签

近期文章

分类

归档

功能

Friends

欧长坤
FRIMIN,粤ICP备17087507号

TAGS:FRIMIN

<<< Thank you for your visit >>>

Websites to related :

ads

Hot Websites