背景:要给网络灵活的设置各种带宽限制,通过对路由器下发tc命令实现。设置python脚本的ssh链接 + tc脚本下发 + 针对某一个id进行配置。
Paramiko 是一个用于在 Python 中进行 SSH(Secure Shell)协议通信的库。
它提供了在远程服务器上执行命令、上传和下载文件、建立 SSH 连接等功能,使得开发者可以轻松地通过 Python 与远程服务器进行交互。Paramiko 是一个非常有用的工具,特别是在自动化任务、配置管理和远程服务器管理方面。
以下是 Paramiko 的一些主要特点和功能:
-
SSH 连接支持:Paramiko 允许你在 Python 中建立 SSH 连接,可以用于执行命令、传输文件和进行远程管理。
-
SCP 和 SFTP 支持:Paramiko 提供了用于文件传输的 SCP(Secure Copy Protocol)和 SFTP(SSH File Transfer Protocol)的实现,使你能够轻松地上传和下载文件。
-
远程命令执行:你可以使用 Paramiko 在远程服务器上执行命令,并获取其输出。这对于自动化任务和远程服务器管理非常有用。
-
SSH 密钥认证:Paramiko 支持 SSH 密钥认证,这是一种更安全的身份验证方式,而不是使用密码。
-
支持代理:Paramiko 支持 SOCKS 代理和 HTTP 代理,以便在需要时通过代理服务器连接到远程主机。
-
支持各种加密算法:Paramiko 支持多种加密算法,包括 AES、DES、3DES、RSA 和 DSA 等,以确保通信的安全性。
-
跨平台性:Paramiko 是跨平台的,可以在多个操作系统上运行,包括 Linux、macOS 和 Windows。
-
活跃的社区支持:Paramiko 拥有活跃的社区和开发团队,因此你可以期望获得支持和不断的更新和改进。
以下是一个简单的示例,演示了如何使用 Paramiko 在远程服务器上执行命令:
import paramiko
# 创建 SSH 客户端
ssh_client = paramiko.SSHClient()
# 连接到远程服务器
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect('hostname', username='username', password='password')
# 执行远程命令
stdin, stdout, stderr = ssh_client.exec_command('ls -l')
# 输出命令执行结果
print(stdout.read().decode())
# 关闭 SSH 连接
ssh_client.close()
要使用 Paramiko,你需要先安装这个库,可以使用 pip 进行安装:
pip install paramiko
总之,Paramiko 是一个功能强大的库,可以帮助你轻松地进行远程服务器管理和自动化任务执行,而不需要手动登录到远程服务器。
登陆路由器设置tc命令
要在路由器上设置 Traffic Control(TC)命令,你通常需要登录到路由器的管理界面,然后在其中找到适当的选项来配置流量控制规则。每个路由器品牌和型号都有不同的管理界面,但一般步骤如下:
-
连接到路由器:首先,确保你已经连接到了你的路由器,可以通过有线或无线方式与路由器连接。你的计算机需要在同一局域网中。
-
查找路由器管理地址:通常,你可以在路由器的标签上找到默认的管理地址(例如,192.168.1.1)。如果没有找到,请查看路由器的手册或前往路由器制造商的网站以获取更多信息。
-
打开浏览器:打开一个网页浏览器,然后在地址栏中输入路由器的管理地址,并按下回车键。这将带你进入路由器的登录页面。
-
登录到路由器:输入路由器的管理员用户名和密码。这些凭据通常可以在路由器的标签上找到,或者你可能已经自行更改过。登录成功后,你将进入路由器的管理界面。
-
找到流量控制设置:在路由器的管理界面中,查找与流量控制或 Quality of Service (QoS) 相关的选项。不同路由器可能会将这些选项命名为不同的名称。一般来说,你需要查找一个与网络设置、QoS、带宽管理或流量控制相关的部分。
-
配置 TC 命令:在流量控制或 QoS 部分,你可以设置 TC 命令来控制网络流量。这可能包括设置带宽限制、延迟、丢包率等参数,以及指定要应用 TC 规则的设备或应用程序。
-
保存设置:完成配置后,确保保存设置。通常,你需要点击一个保存或应用按钮,以使更改生效。
-
测试流量控制:最后,测试你的流量控制设置,确保它们按预期工作。你可以使用网络速度测试工具或应用程序来检查网络性能和流量控制效果。
请注意,不同路由器型号和品牌的管理界面可能有所不同,因此具体的设置步骤可能会因路由器而异。如果你不确定如何在你的特定路由器上配置 TC 命令,建议查阅路由器的用户手册或在制造商的支持网站上查找相关文档和指南。
tc相关命令
“tc” 是 Linux 中的一个命令,它是 Traffic Control 的缩写,用于配置网络流量控制。Traffic Control 可以帮助你管理网络带宽、延迟、丢包等网络参数,以优化网络性能或模拟不同网络条件进行测试。以下是一些常见的 “tc” 命令及其介绍:
-
tc qdisc(Queueing Discipline):
tc qdisc add
: 添加一个队列规则。tc qdisc del
: 删除一个队列规则。tc qdisc show
: 显示当前系统上的队列规则。
-
tc class(Traffic Class):
tc class add
: 添加一个流量类别。tc class del
: 删除一个流量类别。tc class show
: 显示当前系统上的流量类别。
-
tc filter:
tc filter add
: 添加一个过滤器规则,可以根据不同的标记或条件来控制数据包的流向。tc filter del
: 删除一个过滤器规则。tc filter show
: 显示当前系统上的过滤器规则。
-
tc qdisc change:
- 用于修改现有的队列规则,包括修改带宽、延迟等参数。
-
tc class change:
- 用于修改现有的流量类别,包括修改带宽、延迟等参数。
-
tc qdisc replace 和 tc class replace:
- 这些命令与
tc qdisc change
和tc class change
类似,但是可以用新的规则替换现有的规则。
- 这些命令与
-
tc qdisc show 和 tc class show:
- 这些命令用于显示当前系统上的队列规则和流量类别的详细信息,包括配置参数。
-
tc qdisc stats 和 tc class stats:
- 用于查看队列规则和流量类别的统计信息,如包的数量、字节数等。
-
tc -s:
- 通过使用
tc -s
命令,你可以查看更详细的队列和类别统计信息,包括每个队列的详细统计数据。
- 通过使用
-
tc policy:
tc policy add
: 添加一个策略规则,用于指定流量控制策略。tc policy del
: 删除一个策略规则。tc policy show
: 显示当前系统上的策略规则。
这些命令提供了广泛的功能,可以用于网络流量控制、QoS(Quality of Service)配置、模拟不同网络条件以进行测试等。要了解每个命令的详细用法和选项,可以使用 man tc
命令查看 “tc” 的手册页。
根据id指定设置和删除网络限制
tc qdisc add
和tc class add
是 Linux
中用于配置网络流量控制的两个不同的命令,它们的功能和作用是不同的。
-
tc qdisc add(Queueing Discipline):
tc qdisc add
用于添加一个队列规则(Queue Discipline),用于管理和控制数据包的排队和调度。队列规则决定了数据包进入网络接口的方式以及它们在队列中的排序和处理方式。常见的队列规则包括 pfifo(简单的先进先出队列)、htb(层次 Token Bucket)等。通常,你会使用tc qdisc add
来为网络接口分配特定的队列规则。
-
tc class add(Traffic Class):
tc class add
用于添加一个流量类别(Traffic Class),它是用于对数据包进行分类和标记的规则。流量类别通常用于实现不同的服务质量(QoS)策略,例如,将网络流量分成高优先级和低优先级,或根据源/目标 IP 地址、端口号等进行分类。流量类别的设置可以帮助你在网络中应用特定的规则,以实现更精细的流量控制。
要更好地理解它们之间的区别,可以将它们看作是一种层次关系。首先,你使用 tc qdisc add
来定义如何排队和调度数据包,然后在这个队列规则下使用 tc class add
来对不同类型的流量进行分类和标记。
举个例子,你可以使用 tc qdisc add
来创建一个 Token Bucket 队列规则,然后使用 tc class add
来为不同的流量类别分配不同的令牌桶参数,以实现对高优先级和低优先级流量的不同处理。
总之,tc qdisc add
用于定义队列规则,而 tc class add
用于定义流量类别,它们一起协同工作以实现网络流量的控制和管理。
self.executeCommand("tc qdisc add dev {0} handle 1: root htb".format(networkinterface))
self.executeCommand("tc class add dev {0} parent 1: classid 1:{1} htb rate {2} ceil {3}".format(networkinterface, id, bandwidth, bandwidth))
设置
self.executeCommand("opkg install kmod-netem")
self.executeCommand("modprobe sch_netem")
# self.executeCommand("tc qdisc replace dev {0} parent 1:{1} handle {2}: netem delay {3} {4} loss {5}".format(networkinterface,id+1,id,delay,jitter,packetloss))
self.executeCommand("tc qdisc add dev {0} parent 1:{1} handle {1}: netem delay {2} {3} loss {4}".format(networkinterface, id, delay,jitter,packetloss))
if direction == "up":
network.setNetworkByIpAndId(restrictIP,destinationports,id,outgoingInterface,delay,jitter,packetLoss, bandwidth)
elif direction == "down":
network.setNetworkByIpAndId(restrictIP, destinationports, id, incomingInterface, delay, jitter, packetLoss, bandwidth)
else:
network.setNetworkByIpAndId(restrictIP, destinationports, id, outgoingInterface, delay, jitter, packetLoss, bandwidth)
network.setNetworkByIpAndId(restrictIP, destinationports, id, incomingInterface, delay, jitter, packetLoss, bandwidth)
删除
if args.operation == "delete":
network = NetworkSettings(routerIP)
if restrictID == "-1":
network.delAllCommands(incomingInterface)
network.delAllCommands(outgoingInterface)
network.closeSSH()
else:
network.delImpairmentsByID(incomingInterface, restrictID)
network.delImpairmentsByID(outgoingInterface, restrictID)