From: Bob Miller <bob@computerisms.ca>
To: netfilter <netfilter@vger.kernel.org>
Subject: Re: traffic shape per ip
Date: Tue, 01 Oct 2013 09:47:42 -0700 [thread overview]
Message-ID: <1380646062.2712.298.camel@worklian> (raw)
In-Reply-To: <CALFTrnM6OtNjcuvgm5meyeo_2XEJfQ6qhwrHxtO02bA5tx+cyw@mail.gmail.com>
Perhaps a little late to weigh in, but I found this to be an interesting
thread. Ray, thanks for sharing your script, I found it an educational
read.
I have always found it interesting that nobody ever seems to use/mention
tcng to implement the shaping. I found the learning curve a little
steep because there isn't a lot of examples and documentation, but now
that I have it, shaping is actually very very easy. This said, I have
never tried to use it to shape traffic on a vpn, but if you are
attaching the vpn to an interface, I don't see why it wouldn't work.
In case it is useful, I put an example of how to use tcng to limit speed
on a public access network here:
http://cocnm.computerisms.ca/index.php/Shape/Track_Bandwidth_-_Finalize_IPTables
--
Computerisms
Bob Miller
867-334-7117 / 867-633-3760
http://computerisms.ca
On Fri, 2013-09-20 at 09:17 -0400, Ray Soucy wrote:
> Bounced for HTML. Re-sending as plaintext.
>
> On Fri, Sep 20, 2013 at 9:15 AM, Ray Soucy <rps@maine.edu> wrote:
> > Try something like this.
> >
> > It's not perfect, but it will work for a pool of up to 8000 IPs (TC limit is
> > 9999 I believe). Sorry for it being in PHP, it was tossed on a box where
> > everything else is already PHP.
> >
> > Verified to work, and a modest Linux system doesn't have a problem keeping
> > up with it.
> >
> > #!/bin/php
> > <?php
> >
> > $config['wan_if'] = 'eth0';
> > $config['lan_if'] = 'eth1';
> > $config['global_down'] = '300mbit';
> > $config['global_up'] = '300mbit';
> > $config['default_down'] = '1mbit';
> > $config['default_up'] = '1mbit';
> > $config['network_list'] = array('172.19.0.0/20');
> >
> >
> >
> >
> > function cidrtorange($network) {
> > list($ip, $bits) = explode('/', $network);
> > $ip = ip2long($ip);
> > $mask = ~((1 << (32 - $bits)) - 1);
> > $start = ($ip & $mask) + 1;
> > $end = ($start - 3) - $mask;
> > $range = array($start, $end);
> > return $range;
> > }
> >
> > function exec_cmds($cmd) {
> > $log_data = "";
> > $cmd = str_replace('iptables ', '/usr/local/sbin/iptables ', $cmd);
> > $cmd = str_replace('tc ', '/usr/sbin/tc ', $cmd);
> > $cmd_list = explode("\n", $cmd);
> > foreach ($cmd_list as $c) {
> > if (strlen($c) < 1) continue;
> > $out = array();
> > exec($c . ' 2>&1', $out, $status);
> > if ($status == 0) $log_data .= $c . "\n";
> > else {
> > $log_data .= '# FAILED ' . $c . "\n";
> > foreach ($out as $o) $log_data .= '# ' . $o . "\n";
> > }
> > }
> > echo $log_data;
> > }
> >
> >
> >
> > function do_start() {
> > global $config;
> > $host_list = array();
> > foreach ($config['network_list'] as $network) {
> > list($start_ip, $end_ip) = cidrtorange($network);
> > for ($i = $start_ip + 1; $i < $end_ip; $i++) {
> > $host = long2ip($i);
> > $host_list[$host]['down'] = $config['default_down'];
> > $host_list[$host]['up'] = $config['default_up'];
> > }
> > }
> > $cmd = "";
> > $cmd .= 'iptables -t mangle -N Traffic_Control' . "\n";
> > $cmd .= 'iptables -t mangle -A PREROUTING -i ' . $config['lan_if'] . ' -j
> > Traffic_Control' . "\n";
> > $cmd .= 'tc qdisc add dev ' . $config['lan_if'] . ' root handle 1: htb
> > default 9999' . "\n";
> > $cmd .= 'tc class add dev ' . $config['lan_if'] . ' parent 1: classid
> > 1:9999 htb rate ' . $config['global_down'] . "\n";
> > $cmd .= 'tc qdisc add dev ' . $config['lan_if'] . ' parent 1:9999 handle
> > 9999: sfq perturb 10' . "\n";
> > $cmd .= 'tc qdisc add dev ' . $config['wan_if'] . ' root handle 1: htb
> > default 9999' . "\n";
> > $cmd .= 'tc class add dev ' . $config['wan_if'] . ' parent 1: classid
> > 1:9999 htb rate ' . $config['global_up'] . "\n";
> > $cmd .= 'tc qdisc add dev ' . $config['wan_if'] . ' parent 1:9999 handle
> > 9999: sfq perturb 10' . "\n";
> > $tc_index = 1;
> > foreach ($host_list as $host => $lim) {
> > $cmd .= 'iptables -t mangle -A Traffic_Control -s ' . $host . ' -j MARK
> > --set-mark ' . $tc_index . "\n";
> > $cmd .= 'tc class add dev ' . $config['wan_if'] . ' parent 1: classid
> > 1:' . $tc_index . ' htb rate ' . $lim['up'] . "\n";
> > $cmd .= 'tc filter add dev ' . $config['wan_if'] . ' protocol ip parent
> > 1: prio 1 handle ' . $tc_index . ' fw flowid 1:' . $tc_index . "\n";
> > $cmd .= 'tc class add dev ' . $config['lan_if'] . ' parent 1: classid
> > 1:' . $tc_index . ' htb rate ' . $lim['down'] . "\n";
> > $cmd .= 'tc filter add dev ' . $config['lan_if'] . ' protocol ip parent
> > 1: prio 1 u32 match ip dst ' . $host . ' flowid 1:' . $tc_index . "\n";
> > $tc_index++;
> > }
> > exec_cmds($cmd);
> > }
> >
> > function do_stop() {
> > global $config;
> > $cmd = "";
> > $cmd .= 'tc qdisc del dev ' . $config['lan_if'] . ' root' . "\n";
> > $cmd .= 'tc qdisc del dev ' . $config['wan_if'] . ' root' . "\n";
> > $cmd .= 'iptables -t mangle -D PREROUTING -i ' . $config['lan_if'] . ' -j
> > Traffic_Control' . "\n";
> > $cmd .= 'iptables -t mangle -F Traffic_Control' . "\n";
> > $cmd .= 'iptables -t mangle -X Traffic_Control' . "\n";
> > exec_cmds($cmd);
> > }
> >
> >
> >
> >
> > if ($argc == 2) {
> > if ($argv[1] == 'start') {
> > do_start();
> > } elseif ($argv[1] == 'stop') {
> > do_stop();
> > } elseif ($argv[1] == 'restart') {
> > do_stop();
> > do_start();
> > } else {
> > echo 'Usage: ' . $argv[0] . ' {start|stop|restart}' . "\n";
> > }
> >
> > } else {
> > echo 'Usage: ' . $argv[0] . ' {start|stop|restart}' . "\n";
> > }
> >
> >
> >
> > On Thu, Sep 19, 2013 at 4:34 PM, Andrew Beverley <andy@andybev.com> wrote:
> >>
> >> On Thu, 2013-09-19 at 21:43 +0300, binary wrote:
> >> > i would to limit the bandwidth of some users based on IPs:
> >>
> >> [...]
> >>
> >> This is not as simple as you might think. In order to shape per-IP,
> >> you'll need to set up a class for each individual IP address, and then
> >> filter to that class. I am not aware of a way to write one rule to say
> >> "limit each IP address to this amount".
> >>
> >> Presumably the reason to filter per-IP is to stop single users hogging
> >> the bandwidth. If so, a better approach might be to classify the type of
> >> traffic and then shape on that, or alternatively share bandwidth evenly
> >> per-IP rather than per-connection (as is the default). There is some
> >> information on how to do this on this page at the end of the "downlink"
> >> section:
> >>
> >>
> >> http://www.andybev.com/index.php/Fair_traffic_shaping_an_ADSL_line_for_a_local_network_using_Linux
> >>
> >> If you have any more questions you might want to use the LARTC mailing
> >> list instead of this mailing list.
> >>
> >> Andy
> >>
> >>
> >> --
> >> To unsubscribe from this list: send the line "unsubscribe netfilter" in
> >> the body of a message to majordomo@vger.kernel.org
> >> More majordomo info at http://vger.kernel.org/majordomo-info.html
> >
> >
> >
> >
> > --
> > Ray Patrick Soucy
> > Network Engineer
> > University of Maine System
> >
> > T: 207-561-3526
> > F: 207-561-3531
> >
> > MaineREN, Maine's Research and Education Network
> > www.maineren.net
>
>
>
next prev parent reply other threads:[~2013-10-01 16:47 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-19 18:43 traffic shape per ip binary
2013-09-19 20:34 ` Andrew Beverley
[not found] ` <CALFTrnNDLHW0NDJVE_sKRjP7DMsnfKXcuiEXado+p6nYUJpUbA@mail.gmail.com>
2013-09-20 13:17 ` Ray Soucy
2013-10-01 16:47 ` Bob Miller [this message]
2013-10-01 16:44 ` Bob Miller
2013-10-01 16:50 ` Andrew Beverley
2013-10-01 17:21 ` Bob Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1380646062.2712.298.camel@worklian \
--to=bob@computerisms.ca \
--cc=netfilter@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.