我对我正在使用的 HTB 结构有一些疑问。
我的目标是限制本地网络中用户的下载和上传速度。网络的每个用户都有一个个人域列表,其中包含他不能超过的域的上下速度。
这意味着用户 1 可以在 slashdot.org 上的访问权限限制为 8KB 下载和 3KB 上传,用户 2 可以在 slashdot.org 上访问限制为 4KB 和 1KB。
现在我设置了一个很好的 iptables/tc 对,但规模很小,同时使用 2 或 3 个虚拟主机(不幸的是,我无法执行实际大小测试)。
这是我当前的结构(我只会显示 LAN 出口的结构,用于上传的结构只是该结构的“副本”)
连接在接口上的 HTB qdisc(句柄 2:),默认流量类是类 FFFF。
根类 2:1 直接位于 HTB qdisc 下,具有速率和上限下行链路容量。
默认类 2:FFFF 作为 2:1 的子级,速率为 1kbsp,下行容量为 ceil。
然后,当某个域的用户有新的限制时,动态添加其他类,添加新的 tc 类来控制来自其域的下载速度。
现在,这就是我所做的:
新建一个具有唯一id的tc类(取自数据库,不是这里的重点),作为父类2:1,速率值为1bps,ceil值设置为限制下载速度。
下面是 tc 命令:
-------------- BEGIN SCRIPT --------------
DOWNLINK=800
## Setting up the static tc qdisc and class
$tc qdisc add dev $LAN_IFACE root handle 2: htb default …Run Code Online (Sandbox Code Playgroud) 我必须为路由器编写 bash 脚本来控制给定域名上给定用户的带宽限制。
为此,我使用 iptables 来标记从受限域传入到专用网络中的用户 IP 地址的数据包。对于每一对 user_ip/domain_ip,我都有一个可以标记数据包的密钥。
我在 mangle 表中添加这些规则,如下所示:
$iptables -t mangle -A PREROUTING -p tcp -d $userIp -s $restrictedDom -j MARK --set-mark $id
$iptables -t mangle -A PREROUTING -p tcp -d $userIp -s $restrictedDom -j RETURN
Run Code Online (Sandbox Code Playgroud)
我在 nat 表中的 NAT 设置(eth0 是我的互联网接口,我使用 tap0 作为 LAN 接口)是
$iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
我的 LAN 用户的数据包应该与 mangle 表中的规则匹配,但没有被捕获。
示例:(PREROUTING CHAIN 中的 table mangle)这例如用于为 LAN 网络中的用户 192.168.0.2 标记来自 slashdot.org 的数据包。
Chain PREROUTING (policy ACCEPT 14858 …Run Code Online (Sandbox Code Playgroud) 我正在尝试找到一种方法来获取域名的真实 IP 地址。我正在使用iptables和tc对路由器进行流量整形。然后我需要设置iptables规则来标记来自某些域的数据包,使用它们的 ip 地址。
我第一次使用 dig命令,查询域的名称服务器,如下所示:
nbNameServer=`$dig NS $url +short | wc -l`
# If there is NS for the given domain
if [ $nbNameServer -gt 0 ]; then
for i in $($dig NS $url +short $TOdig); do
ipDom=`$dig @$i $url +short $TOdig`
# Ip found on the $i name server, no need to consult the others
if [ -n "$ipDom" ]; then
failed=`echo -e "$ipDom" | egrep "no servers could be …Run Code Online (Sandbox Code Playgroud)