文章目录
  1. 1. 配置网卡
  2. 2. 配置iptables nat
  3. 3. 端口转发
  4. 4. 下载限速
  5. 5. 上传限速
  6. 6. 观察连接数
  7. 7. 写在结尾

最近我这边原来的那个老的路由器出了点问题,经常抽风。正好因为以前外网有6个ip,所以当时把外网线直接接在了交换机上,那么就想着用虚拟机自己搭建一个简单的路由器用用。现在服务器资源过剩,有什么方案就在上面建虚拟机试验。去网上找了很多资料然后自己摸索着在ubuntu上搭了一个路由器。

配置网卡

建立一台虚拟机,并安装完成后以桥接的方式在虚拟机上面添加两张网卡。分别为eth0和eth1。

  • eth0: a.b.c.d(外网的上网地址)
  • eth1: 172.16.44.1(做为内网的网关)

tip

原先我使用eth0:0的这种虚拟网卡的形式去配置一直不成功,后来使用双网卡的时候一直忘了把eth0:0这张虚拟网卡删掉导致了限速配置一直不成功,浪费了大把的青葱。

配置iptables nat

1
2
3
4
5
6
7
8
9
10
#开启ip_forward
echo "1">/proc/sys/net/ipv4/ip_forward

#清除原来的防火墙规则
iptables -F
iptables -t nat -F
iptables -t mangle -F

#添加nat转发
iptables -t nat -A POSTROUTING -s 172.16.44.0/24 -o eth0 -j MASQUERADE

通过执行上面的代码后,局域网内的电脑就可以上网了。

端口转发

由于我的内网还挂了网站,所以要开启80端口的转发。

1
2
iptables -t nat -I PREROUTING -p tcp -d a.b.c.d --dport 80 -j DNAT --to 172.16.44.210:80
iptables -t nat -I POSTROUTING -p tcp -d 172.16.44.210 --dport 80 -j SNAT --to 172.16.44.1

这条命令指定外网地址a.b.c.d的80端口转发到172.16.44.210:80上。由于是双网卡,所以需要做一下回路。

下载限速

下载限速要在eth1上面做,判断数据包的目的地址来做限制。tc包括三部分:队列、类、过滤器。我使用了htb方式去限制速度,也可以使用cbq,但cbq配置比较复杂一点,而且据说性能没htb好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#删除原来的tc规则队列
tc qdisc del dev eth1 root
#添加tc规则队列
tc qdisc add dev eth1 root handle 10: htb default 256
#生成根类
tc class add dev eth1 parent 10: classid 10:1 htb rate 100mbit ceil 100mbit
#支类列表用于限制速度
#这里的rate指的是保证带宽,ceil是最大带宽。
tc class add dev eth1 parent 10:1 classid 10:10 htb rate 400kbps ceil 400kbps prio 1

#添加支类规则队列
#采用sfq伪随机队列,并且10秒重置一次散列函数。
tc qdisc add dev eth1 parent 10:10 handle 101: sfq perturb 10

#建立网络包过滤器,设置fw。
tc filter add dev eth1 parent 10: protocol ip prio 10 handle 1 fw classid 10:10
#在iptables里面设定mark值,与上面的handle值对应。
iptables -t mangle -A POSTROUTING -d 172.16.44.130 -j MARK --set-mark 1
iptables -t mangle -A POSTROUTING -d 172.16.44.130 -j RETURN

通过上面的代码就可以限制172.16.44.130这台机子的下载速度到400kbps。

tip

经过实际测试这里的kbps实际上就是KB/S每秒千字节。另一个单位是kbit,这个才是每秒千比特。这里的172.16.44.130也可以写成一个网段,比如:172.16.44.0/24

上传限速

上传限速的原理其实跟下载的差不多,只不过限制的网卡不同,要在eth0上过滤来源地址去限制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#删除原来的tc规则队列
tc qdisc del dev eth0 root

#添加tc规则队列
tc qdisc add dev eth0 root handle 20: htb default 256

#生成根类
tc class add dev eth0 parent 20: classid 20:1 htb rate 100mbit ceil 100mbit

#支类列表用于限制速度
tc class add dev eth0 parent 20:1 classid 20:10 htb rate 40kbps ceil 40kbps prio 1

#添加支类规则队列
tc qdisc add dev eth0 parent 20:10 handle 201: sfq perturb 10

#建立网络包过滤器
tc filter add dev eth0 parent 20: protocol ip prio 100 handle 2 fw classid 20:10
iptables -t mangle -A PREROUTING -s 172.16.44.130 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -s 172.16.44.130 -j RETURN

tip

跟下载不同的是POSTROUTING要改成PREROUTING,-d改成-s。

观察连接数

通过iptables的nat连接可以通过下面的代码查看。至于统计连接数可以写代码实现,也可以利用awk,grep等工具。反正里面的内容就是文本,处理起来也比较简单。

1
cat /proc/net/ip_conntrack

写在结尾

到此上网、端口转发和流量限制都已经实现。下次再考虑配置个dhcp server和dnsmasq。至于一些路由器其它诸如mac地址绑定,限制上网等用到的时候再去研究研究。

文章目录
  1. 1. 配置网卡
  2. 2. 配置iptables nat
  3. 3. 端口转发
  4. 4. 下载限速
  5. 5. 上传限速
  6. 6. 观察连接数
  7. 7. 写在结尾