Update Russian translation of TC doc

git-svn-id: https://shorewall.svn.sourceforge.net/svnroot/shorewall/trunk@7085 fbd18981-670d-0410-9b5c-8dc0c1a9a2bb
This commit is contained in:
teastep 2007-08-08 17:10:37 +00:00
parent ad0b2e77ff
commit 0c1263ad9e
2 changed files with 441 additions and 501 deletions

View File

@ -79,232 +79,231 @@
<title>Shorewall-perl - The down side</title>
<para>While there are advantages to using Shorewall-perl, there are also
disadvantages:</para>
disadvantages.</para>
<itemizedlist>
<listitem>
<para>There are a number of incompatibilities between the
Shorewall-perl compiler and the earlier one.</para>
<section>
<title id="Incompatibilities">Incompatibilities</title>
<orderedlist>
<listitem>
<para>The Perl-based compiler requires the following capabilities
in your kernel and iptables.</para>
<para>There are a number of incompatibilities between the Shorewall-perl
compiler and the earlier one.</para>
<itemizedlist>
<listitem>
<para>addrtype match (Restriction relaxed in Shorewall-perl
4.0.1)</para>
</listitem>
<orderedlist>
<listitem>
<para>The Perl-based compiler requires the following capabilities in
your kernel and iptables.</para>
<listitem>
<para>multiport match (will not be relaxed)</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para>addrtype match (Restriction relaxed in Shorewall-perl
4.0.1)</para>
</listitem>
<para>These capabilities are in current distributions.</para>
</listitem>
<listitem>
<para>multiport match (will not be relaxed)</para>
</listitem>
</itemizedlist>
<listitem>
<para>Now that Netfilter has features to deal reasonably with port
lists, I see no reason to duplicate those features in Shorewall.
The Shorewall-shell compiler goes to great pain (in some cases) to
break very long port lists ( &gt; 15 where port ranges in lists
count as two ports) into individual rules. In the new compiler,
I'm avoiding the ugliness required to do that. The new compiler
just generates an error if your list is too long. It will also
produce an error if you insert a port range into a port list and
you don't have extended multiport support.</para>
</listitem>
<para>These capabilities are in current distributions.</para>
</listitem>
<listitem>
<para>BRIDGING=Yes is not supported. The kernel code necessary to
support this option was removed in Linux kernel 2.6.20. <ulink
url="bridge-Shorewall-perl.html">Alternative bridge
support</ulink> is provided by Shorewall-perl.</para>
</listitem>
<listitem>
<para>Now that Netfilter has features to deal reasonably with port
lists, I see no reason to duplicate those features in Shorewall. The
Shorewall-shell compiler goes to great pain (in some cases) to break
very long port lists ( &gt; 15 where port ranges in lists count as
two ports) into individual rules. In the new compiler, I'm avoiding
the ugliness required to do that. The new compiler just generates an
error if your list is too long. It will also produce an error if you
insert a port range into a port list and you don't have extended
multiport support.</para>
</listitem>
<listitem>
<para>The BROADCAST column in the interfaces file is essentially
unused; if you enter anything in this column but '-' or 'detect',
you will receive a warning. This will be relaxed if and when the
addrtype match requirement is relaxed.</para>
</listitem>
<listitem>
<para>BRIDGING=Yes is not supported. The kernel code necessary to
support this option was removed in Linux kernel 2.6.20. <ulink
url="bridge-Shorewall-perl.html">Alternative bridge support</ulink>
is provided by Shorewall-perl.</para>
</listitem>
<listitem>
<para>The 'refresh' command is now similar to restart with the
exceptios that:</para>
<listitem>
<para>The BROADCAST column in the interfaces file is essentially
unused; if you enter anything in this column but '-' or 'detect',
you will receive a warning. This will be relaxed if and when the
addrtype match requirement is relaxed.</para>
</listitem>
<itemizedlist>
<listitem>
<para>The command fails if Shorewall is not running.</para>
</listitem>
<listitem>
<para>The 'refresh' command is now similar to restart with the
exceptios that:</para>
<listitem>
<para>A directory name cannot be specified in the
command.</para>
</listitem>
<itemizedlist>
<listitem>
<para>The command fails if Shorewall is not running.</para>
</listitem>
<listitem>
<para>The refresh command does not alter the Netfilter
configuration except for the static blacklist.</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>A directory name cannot be specified in the
command.</para>
</listitem>
<listitem>
<para>With the shell-based compiler, extension scripts were copied
into the compiled script and executed at run-time. In many cases,
this approach doesn't work with Shorewall Perl because (almost)
the entire ruleset is built by the compiler. As a result,
Shorewall-perl runs many extension scripts at compile-time rather
than at run-time. Because the compiler is written in Perl, your
extension scripts from earlier versions will no longer
work.</para>
<listitem>
<para>The refresh command does not alter the Netfilter
configuration except for the static blacklist.</para>
</listitem>
</itemizedlist>
</listitem>
<para>The following table summarizes when the various extension
scripts are run:<informaltable frame="all">
<tgroup cols="3">
<tbody>
<row>
<entry><emphasis
role="bold">Compile-time</emphasis></entry>
<listitem>
<para>With the shell-based compiler, extension scripts were copied
into the compiled script and executed at run-time. In many cases,
this approach doesn't work with Shorewall Perl because (almost) the
entire ruleset is built by the compiler. As a result, Shorewall-perl
runs many extension scripts at compile-time rather than at run-time.
Because the compiler is written in Perl, your extension scripts from
earlier versions will no longer work.</para>
<entry><emphasis role="bold">Run-time</emphasis></entry>
<para>The following table summarizes when the various extension
scripts are run:<informaltable frame="all">
<tgroup cols="3">
<tbody>
<row>
<entry><emphasis
role="bold">Compile-time</emphasis></entry>
<entry><emphasis
role="bold">Eliminated</emphasis></entry>
</row>
<entry><emphasis role="bold">Run-time</emphasis></entry>
<row>
<entry>initdone</entry>
<entry><emphasis role="bold">Eliminated</emphasis></entry>
</row>
<entry>clear</entry>
<row>
<entry>initdone</entry>
<entry>continue</entry>
</row>
<entry>clear</entry>
<row>
<entry>maclog</entry>
<entry>continue</entry>
</row>
<entry>initdone</entry>
<row>
<entry>maclog</entry>
<entry></entry>
</row>
<entry>initdone</entry>
<row>
<entry>Per-chain (including those associated with
actions)</entry>
<entry></entry>
</row>
<entry>start</entry>
<row>
<entry>Per-chain (including those associated with
actions)</entry>
<entry></entry>
</row>
<entry>start</entry>
<row>
<entry></entry>
<entry></entry>
</row>
<entry>started</entry>
<row>
<entry></entry>
<entry></entry>
</row>
<entry>started</entry>
<row>
<entry></entry>
<entry></entry>
</row>
<entry>stop</entry>
<row>
<entry></entry>
<entry></entry>
</row>
<entry>stop</entry>
<row>
<entry></entry>
<entry></entry>
</row>
<entry>stopped</entry>
<row>
<entry></entry>
<entry></entry>
</row>
<entry>stopped</entry>
<row>
<entry></entry>
<entry></entry>
</row>
<entry>tcclear</entry>
<row>
<entry></entry>
<entry></entry>
</row>
</tbody>
</tgroup>
</informaltable></para>
<entry>tcclear</entry>
<para>Compile-time extension scripts are executed using the Perl
'eval `cat &lt;file&gt;`' mechanism. Be sure that each script
returns a 'true' value; otherwise, the compiler will assume that
the script failed and will abort the compilation.</para>
<entry></entry>
</row>
</tbody>
</tgroup>
</informaltable></para>
<para>When a script is invoked, the <emphasis
role="bold">$chainref</emphasis> scalar variable will hold a
reference to a chain table entry.</para>
<para>Compile-time extension scripts are executed using the Perl
'eval `cat &lt;file&gt;`' mechanism. Be sure that each script
returns a 'true' value; otherwise, the compiler will assume that the
script failed and will abort the compilation.</para>
<simplelist>
<member><emphasis role="bold">$chainref-&gt;{name}</emphasis>
contains the name of the chain</member>
<para>When a script is invoked, the <emphasis
role="bold">$chainref</emphasis> scalar variable will hold a
reference to a chain table entry.</para>
<member><emphasis role="bold">$chainref-&gt;{table}</emphasis>
holds the table name</member>
</simplelist>
<simplelist>
<member><emphasis role="bold">$chainref-&gt;{name}</emphasis>
contains the name of the chain</member>
<para>To add a rule to the chain:</para>
<member><emphasis role="bold">$chainref-&gt;{table}</emphasis>
holds the table name</member>
</simplelist>
<simplelist>
<member>add_rule $chainref, &lt;<replaceable>the
rule</replaceable>&gt;</member>
</simplelist>
<para>To add a rule to the chain:</para>
<para>Where</para>
<simplelist>
<member>add_rule $chainref, &lt;<replaceable>the
rule</replaceable>&gt;</member>
</simplelist>
<simplelist>
<member>&lt;<replaceable>the rule</replaceable>&gt; is a scalar
argument holding the rule text. Do not include "-A
&lt;<replaceable>chain name</replaceable>&gt;"</member>
</simplelist>
<para>Where</para>
<para>Example:</para>
<simplelist>
<member>&lt;<replaceable>the rule</replaceable>&gt; is a scalar
argument holding the rule text. Do not include "-A
&lt;<replaceable>chain name</replaceable>&gt;"</member>
</simplelist>
<simplelist>
<member>add_rule $chainref, '-j ACCEPT';</member>
</simplelist>
<para>Example:</para>
<para>To insert a rule into the chain:</para>
<simplelist>
<member>add_rule $chainref, '-j ACCEPT';</member>
</simplelist>
<simplelist>
<member>insert_rule $chainref,
&lt;<replaceable>rulenum</replaceable>&gt;, &lt;<replaceable>the
rule</replaceable>&gt;</member>
</simplelist>
<para>To insert a rule into the chain:</para>
<para>The log_rule_limit function works like it does in the shell
compiler with two exceptions:</para>
<simplelist>
<member>insert_rule $chainref,
&lt;<replaceable>rulenum</replaceable>&gt;, &lt;<replaceable>the
rule</replaceable>&gt;</member>
</simplelist>
<itemizedlist>
<listitem>
<para>You pass the chain reference rather than the name of the
chain.</para>
</listitem>
<para>The log_rule_limit function works like it does in the shell
compiler with two exceptions:</para>
<listitem>
<para>The commands are 'add' and 'insert' rather than '-A' and
'-I'.</para>
</listitem>
<itemizedlist>
<listitem>
<para>You pass the chain reference rather than the name of the
chain.</para>
</listitem>
<listitem>
<para>There is only a single "pass as-is to iptables" argument
(so you must quote that part</para>
</listitem>
</itemizedlist>
<listitem>
<para>The commands are 'add' and 'insert' rather than '-A' and
'-I'.</para>
</listitem>
<para>Example:</para>
<listitem>
<para>There is only a single "pass as-is to iptables" argument
(so you must quote that part</para>
</listitem>
</itemizedlist>
<programlisting> log_rule_limit
<para>Example:</para>
<programlisting> log_rule_limit
'info' ,
$chainref ,
$chainref-&gt;{name},
@ -314,14 +313,14 @@
'add'
'-p tcp '; </programlisting>
<para>Here is an example of an actual initdone script used with
Shorewall 3.4:<programlisting>run_iptables -t mangle -I PREROUTING -p esp -j MARK --set-mark 0x50
<para>Here is an example of an actual initdone script used with
Shorewall 3.4:<programlisting>run_iptables -t mangle -I PREROUTING -p esp -j MARK --set-mark 0x50
run_iptables -t filter -I INPUT -p udp --dport 1701 -m mark --mark 0x50 -j ACCEPT
run_iptables -t filter -I OUTPUT -p udp --sport 1701 -j ACCEPT
</programlisting></para>
<para>Here is the corresponding script used with
Shorewall-perl:<programlisting>use Shorewall::Chains;
<para>Here is the corresponding script used with
Shorewall-perl:<programlisting>use Shorewall::Chains;
insert_rule $mangle_table-&gt;{PREROUTING}, 1, "-p esp -j MARK --set-mark 0x50";
insert_rule $filter_table-&gt;{INPUT}, 1, "-p udp --dport 1701 -m mark --mark 0x50 -j ACCEPT";
@ -329,188 +328,186 @@ insert_rule $filter_table-&gt;{OUTPUT}, 1, "-p udp --sport 1701 -j ACCEPT";
1;</programlisting></para>
<para>The initdone script is unique because the $chainref variable
is not set before the script is called. The above script
illustrates how the $mangle_table, $filter_table, and $nat_table
references can be used to add or insert rules in arbitrary
chains.</para>
</listitem>
<para>The initdone script is unique because the $chainref variable
is not set before the script is called. The above script illustrates
how the $mangle_table, $filter_table, and $nat_table references can
be used to add or insert rules in arbitrary chains.</para>
</listitem>
<listitem>
<para>The <filename>/etc/shorewall/tos</filename> file now has
zone-independent SOURCE and DEST columns as do all other files
except the rules and policy files.</para>
<listitem>
<para>The <filename>/etc/shorewall/tos</filename> file now has
zone-independent SOURCE and DEST columns as do all other files
except the rules and policy files.</para>
<para>The SOURCE column may be one of the following:</para>
<para>The SOURCE column may be one of the following:</para>
<simplelist>
<member>[<command>all</command>:]&lt;<replaceable>address</replaceable>&gt;[,...]</member>
<simplelist>
<member>[<command>all</command>:]&lt;<replaceable>address</replaceable>&gt;[,...]</member>
<member>[<command>all</command>:]&lt;<replaceable>interface</replaceable>&gt;[:&lt;<replaceable>address</replaceable>&gt;[,...]]</member>
<member>[<command>all</command>:]&lt;<replaceable>interface</replaceable>&gt;[:&lt;<replaceable>address</replaceable>&gt;[,...]]</member>
<member><command>$FW</command>[:&lt;<replaceable>address</replaceable>&gt;[,...]]</member>
</simplelist>
<member><command>$FW</command>[:&lt;<replaceable>address</replaceable>&gt;[,...]]</member>
</simplelist>
<para>The DEST column may be one of the following:</para>
<para>The DEST column may be one of the following:</para>
<simplelist>
<member>[<command>all</command>:]&lt;<replaceable>address</replaceable>&gt;[,...]</member>
<simplelist>
<member>[<command>all</command>:]&lt;<replaceable>address</replaceable>&gt;[,...]</member>
<member>[<command>all</command>:]&lt;<replaceable>interface</replaceable>&gt;[:&lt;<replaceable>address</replaceable>&gt;[,...]]</member>
</simplelist>
<member>[<command>all</command>:]&lt;<replaceable>interface</replaceable>&gt;[:&lt;<replaceable>address</replaceable>&gt;[,...]]</member>
</simplelist>
<para>This is a permanent change. The old zone-based rules have
never worked right and this is a good time to replace them. I've
tried to make the new syntax cover the most common cases without
requiring change to existing files. In particular, it will handle
the tos file released with Shorewall 1.4 and earlier.</para>
</listitem>
<para>This is a permanent change. The old zone-based rules have
never worked right and this is a good time to replace them. I've
tried to make the new syntax cover the most common cases without
requiring change to existing files. In particular, it will handle
the tos file released with Shorewall 1.4 and earlier.</para>
</listitem>
<listitem>
<para>Shorewall-perl insists that ipset names begin with a letter
and be composed of alphanumeric characters and underscores (_).
When used in a Shorewall configuration file, the name must be
preceded by a plus sign (+) as with the shell-based
compiler.</para>
<listitem>
<para>Shorewall-perl insists that ipset names begin with a letter
and be composed of alphanumeric characters and underscores (_). When
used in a Shorewall configuration file, the name must be preceded by
a plus sign (+) as with the shell-based compiler.</para>
<para>Shorewall is now out of the ipset load/reload business. With
scripts generated by the Perl-based Compiler, the Netfilter
ruleset is never cleared. That means that there is no opportunity
for Shorewall to load/reload your ipsets since that cannot be done
while there are any current rules using ipsets.</para>
<para>Shorewall is now out of the ipset load/reload business. With
scripts generated by the Perl-based Compiler, the Netfilter ruleset
is never cleared. That means that there is no opportunity for
Shorewall to load/reload your ipsets since that cannot be done while
there are any current rules using ipsets.</para>
<para>So:</para>
<para>So:</para>
<orderedlist numeration="upperroman">
<listitem>
<para>Your ipsets must be loaded before Shorewall starts. You
are free to try to do that with the following code in
<filename>/etc/shorewall/start</filename>:</para>
<orderedlist numeration="upperroman">
<listitem>
<para>Your ipsets must be loaded before Shorewall starts. You
are free to try to do that with the following code in
<filename>/etc/shorewall/start</filename>:</para>
<programlisting>if [ "$COMMAND" = start ]; then
<programlisting>if [ "$COMMAND" = start ]; then
ipset -U :all: :all:
ipset -F
ipset -X
ipset -R &lt; /etc/shorewall/ipsets
fi</programlisting>
<para>The file <filename>/etc/shorewall/ipsets</filename> will
normally be produced using the <command>ipset -S</command>
command.</para>
<para>The file <filename>/etc/shorewall/ipsets</filename> will
normally be produced using the <command>ipset -S</command>
command.</para>
<para>The above will work most of the time but will fail in a
<command>shorewall stop</command> - <command>shorewall
start</command> sequence if you use ipsets in your
routestopped file (see below).</para>
</listitem>
<para>The above will work most of the time but will fail in a
<command>shorewall stop</command> - <command>shorewall
start</command> sequence if you use ipsets in your routestopped
file (see below).</para>
</listitem>
<listitem>
<para>Your ipsets may not be reloaded until Shorewall is
stopped or cleared.</para>
</listitem>
<listitem>
<para>Your ipsets may not be reloaded until Shorewall is stopped
or cleared.</para>
</listitem>
<listitem>
<para>If you specify ipsets in your routestopped file then
Shorewall must be cleared in order to reload your
ipsets.</para>
</listitem>
</orderedlist>
<listitem>
<para>If you specify ipsets in your routestopped file then
Shorewall must be cleared in order to reload your ipsets.</para>
</listitem>
</orderedlist>
<para>As a consequence, scripts generated by the Perl-based
compiler will ignore <filename>/etc/shorewall/ipsets</filename>
and will issue a warning if you set SAVE_IPSETS=Yes in
<filename>shorewall.conf</filename>.</para>
</listitem>
<para>As a consequence, scripts generated by the Perl-based compiler
will ignore <filename>/etc/shorewall/ipsets</filename> and will
issue a warning if you set SAVE_IPSETS=Yes in
<filename>shorewall.conf</filename>.</para>
</listitem>
<listitem>
<para>Because the configuration files (with the exception of
<filename>/etc/shorewall/params</filename>) are now processed by
the Shorewall-perl compiler rather than by the shell, only the
basic forms of Shell expansion ($variable and ${variable}) are
supported. The more exotic forms such as ${variable:=default} are
not supported. Both variables defined in /etc/shorewall/params and
environmental variables (exported by the shell) can be used in
configuration files.</para>
</listitem>
<listitem>
<para>Because the configuration files (with the exception of
<filename>/etc/shorewall/params</filename>) are now processed by the
Shorewall-perl compiler rather than by the shell, only the basic
forms of Shell expansion ($variable and ${variable}) are supported.
The more exotic forms such as ${variable:=default} are not
supported. Both variables defined in /etc/shorewall/params and
environmental variables (exported by the shell) can be used in
configuration files.</para>
</listitem>
<listitem>
<para>USE_ACTIONS=No is not supported. That option is intended to
minimize Shorewall's footprint in embedded applications. As a
consequence, Default Macros are not supported.</para>
</listitem>
<listitem>
<para>USE_ACTIONS=No is not supported. That option is intended to
minimize Shorewall's footprint in embedded applications. As a
consequence, Default Macros are not supported.</para>
</listitem>
<listitem>
<para>DELAYBLACKLISTLOAD=Yes is not supported. The entire ruleset
is atomically loaded with one execution of
<command>iptables-restore</command>.</para>
</listitem>
<listitem>
<para>DELAYBLACKLISTLOAD=Yes is not supported. The entire ruleset is
atomically loaded with one execution of
<command>iptables-restore</command>.</para>
</listitem>
<listitem>
<para>MAPOLDACTIONS=Yes is not supported. People should have
converted to using macros by now.</para>
</listitem>
<listitem>
<para>MAPOLDACTIONS=Yes is not supported. People should have
converted to using macros by now.</para>
</listitem>
<listitem>
<para>The pre Shorewall-3.0 format of the zones file is not
supported; neither is the
<filename>/etc/shorewall/ipsec</filename> file.</para>
</listitem>
<listitem>
<para>The pre Shorewall-3.0 format of the zones file is not
supported; neither is the <filename>/etc/shorewall/ipsec</filename>
file.</para>
</listitem>
<listitem>
<para>BLACKLISTNEWONLY=No is not permitted with FASTACCEPT=Yes.
This combination doesn't work in previous versions of Shorewall so
the Perl-based compiler simply rejects it.</para>
</listitem>
<listitem>
<para>BLACKLISTNEWONLY=No is not permitted with FASTACCEPT=Yes. This
combination doesn't work in previous versions of Shorewall so the
Perl-based compiler simply rejects it.</para>
</listitem>
<listitem>
<para>Shorewall-perl has a single rule generator that is used for
all rule-oriented files. So it is important that the syntax is
consistent between files.</para>
<listitem>
<para>Shorewall-perl has a single rule generator that is used for
all rule-oriented files. So it is important that the syntax is
consistent between files.</para>
<para>With shorewall-shell, there is a special syntax in the
SOURCE column of /etc/shorewall/masq to designate "all traffic
entering the firewall on this interface except...".</para>
<para>With shorewall-shell, there is a special syntax in the SOURCE
column of /etc/shorewall/masq to designate "all traffic entering the
firewall on this interface except...".</para>
<para>Example:<programlisting>#INTERFACE SOURCE ADDRESSES
<para>Example:<programlisting>#INTERFACE SOURCE ADDRESSES
eth0 eth1!192.168.4.9 ...</programlisting>Shorewall-perl
uses syntax that is consistent with the rest of
Shorewall:<programlisting>#INTERFACE SOURCE ADDRESSES
uses syntax that is consistent with the rest of
Shorewall:<programlisting>#INTERFACE SOURCE ADDRESSES
eth0 eth1:!192.168.4.9 ...</programlisting></para>
</listitem>
</listitem>
<listitem>
<para>The 'allowoutUPnP' built-in action is no longer supported.
In kernel 2.6.14, the Netfilter team have removed support for '-m
owner --owner-cmd' which that action depended on.</para>
</listitem>
<listitem>
<para>The 'allowoutUPnP' built-in action is no longer supported. In
kernel 2.6.14, the Netfilter team have removed support for '-m owner
--owner-cmd' which that action depended on.</para>
</listitem>
<listitem>
<para>The PKTTYPE option is ignored by Shorewall-perl.
Shorewall-perl 4.0.0 requires Address type match. Shorewall-perl
versions 4.0.1 and later will use Address type match if it is
available; otherwise, they will behave as if PKTTYPE=No had been
specified.</para>
</listitem>
<listitem>
<para>The PKTTYPE option is ignored by Shorewall-perl.
Shorewall-perl 4.0.0 requires Address type match. Shorewall-perl
versions 4.0.1 and later will use Address type match if it is
available; otherwise, they will behave as if PKTTYPE=No had been
specified.</para>
</listitem>
<listitem>
<para> Shorewall-perl detects dead policy file entries that result
when an entry is masked by an earlier more general entry.</para>
<listitem>
<para>Shorewall-perl detects dead policy file entries that result
when an entry is masked by an earlier more general entry.</para>
<para>Example:</para>
<para>Example:</para>
<programlisting>#SOURCE DEST POLICY LOG LEVEL
<programlisting>#SOURCE DEST POLICY LOG LEVEL
all all REJECT info
loc net ACCEPT</programlisting>
</listitem>
</orderedlist>
</listitem>
</listitem>
</orderedlist>
</section>
<listitem>
<para>Shorewall-perl is dependent on Perl (see the next section) which
has a large disk footprint. This makes Shorewall-perl less desirable
in an embedded environment.</para>
</listitem>
</itemizedlist>
<section id="PerlDep">
<title>Dependence on Perl</title>
<para>Shorewall-perl is dependent on Perl (see the next section) which
has a large disk footprint. This makes Shorewall-perl less desirable in
an embedded environment.</para>
</section>
</section>
<section id="Prerequisites">

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<article>
<!--$Id$-->
@ -8,23 +7,19 @@
<title>Управление трафиком и шейпинг трафика</title>
<authorgroup>
<author>
<firstname>Tom</firstname>
<author><firstname>Tom</firstname>
<surname>Eastep</surname>
</author>
<surname>Eastep</surname></author>
<author>
<firstname>Arne</firstname>
<author><firstname>Arne</firstname>
<surname>Bernin</surname>
</author>
<surname>Bernin</surname></author>
</authorgroup>
<pubdate><?dbtimestamp format="Y/m/d"?></pubdate>
<copyright>
<year>2001-2006</year>
<year>2001-2007</year>
<holder>Thomas M. Eastep</holder>
</copyright>
@ -42,10 +37,7 @@
</copyright>
<legalnotice>
<para>Этот документ разрешается копировать, распространять и/или изменять при выполнении условий лицензии GNU Free Documentation License версии
1.2 или более поздней, опубликованной Free Software Foundation; без неизменяемых разделов, без текста на верхней обложке, без текста на нижней обложке. Копия лицензии приведена по ссылке
<quote><ulink url="GnuCopyright.htm">GNU Free Documentation
License</ulink></quote>.</para>
<para>Этот документ разрешается копировать, распространять и/или изменять при выполнении условий лицензии GNU Free Documentation License версии 1.2 или более поздней, опубликованной Free Software Foundation; без неизменяемых разделов, без текста на верхней обложке, без текста на нижней обложке. Копия лицензии приведена по ссылке <quote><ulink url="GnuCopyright.htm">GNU Free Documentation License</ulink></quote>.</para>
</legalnotice>
</articleinfo>
@ -60,20 +52,15 @@
<itemizedlist>
<listitem>
<para>LARTC HOWTO: <ulink
url="http://www.lartc.org">http://www.lartc.org</ulink></para>
<para>LARTC HOWTO: <ulink url="http://www.lartc.org">http://www.lartc.org</ulink></para>
</listitem>
<listitem>
<para>Руководство по HTB:
<ulink
url="http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm">http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm</ulink></para>
<para>Руководство по HTB: <ulink url="http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm">http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm</ulink></para>
</listitem>
<listitem>
<para>Некоторые документы с сайта <ulink
url="http://www.netfilter.org/documentation/index.html#documentation-howto">http://www.netfilter.org/documentation/index.html#documentation-howto</ulink>.
Рекомендуем ознакомиться с очень хорошим руководством Оскара Андреассона.</para>
<para>Некоторые документы с сайта <ulink url="http://www.netfilter.org/documentation/index.html#documentation-howto">http://www.netfilter.org/documentation/index.html#documentation-howto</ulink>. Рекомендуем ознакомиться с очень хорошим руководством Оскара Андреассона.</para>
</listitem>
<listitem>
@ -82,26 +69,22 @@
</itemizedlist>
</warning>
<section>
<section id="Intro">
<title>Введение</title>
<para>Начиная с версии 2.5.5 в Shorewall реализована встроенная поддержка управления трафиком и шейпинга трафика. В более ранних версиях эти возможности были ограниченными. Можно было использовать собственный сценарий tcstart (это можно и сейчас), но, за исключением файла tcrules, в файлах конфигурации Shorewall не была предусмотрена возможность определения классов и дисциплин очередей.</para>
<para>До сих пор поддержка управления трафиком является неполной, например, не поддерживаются все опции (и особенно различные алгоритмы очередей) из ядра Linux, но для большинства случаев она будет достаточной. Если у вас уже есть сценарий для управления трафиком, который вы собираетесь использовать и в будущем, то соответствующие инструкции приведены по ссылке <link
linkend="owntcstart"> ниже в этом документе</link>. Для того чтобы это заработало, требуется включить поддержку управления трафиком в ядре и в Shorewall, как описано далее.</para>
<para>До сих пор поддержка управления трафиком является неполной, например, не поддерживаются все опции (и особенно различные алгоритмы очередей) из ядра Linux, но для большинства случаев она будет достаточной. Если у вас уже есть сценарий для управления трафиком, который вы собираетесь использовать и в будущем, то соответствующие инструкции приведены по ссылке <link linkend="owntcstart"> ниже в этом документе</link>. Для того чтобы это заработало, требуется включить поддержку управления трафиком в ядре и в Shorewall, как описано далее.</para>
</section>
<section>
<section id="LinuxTC">
<title>Управление трафиком и шейпинг трафика в Linux</title>
<para>В этом разделе кратко описано, как работает управление трафиком в Linux. Даже если этого должно быть достаточно для настройки управления трафиком в файлах конфигурации Shorewall, мы очень рекомендуем внимательно прочитать руководство
<ulink url="http://lartc.org/howto/">Linux
Advanced Routing and Shaping HOWTO</ulink>. Во время написания этого документа текущей версией была 1.0.0.</para>
<para>В этом разделе кратко описано, как работает управление трафиком в Linux. Даже если этого должно быть достаточно для настройки управления трафиком в файлах конфигурации Shorewall, мы очень рекомендуем внимательно прочитать руководство <ulink url="http://lartc.org/howto/">Linux Advanced Routing and Shaping HOWTO</ulink>. Во время написания этого документа текущей версией была 1.0.0.</para>
<para>Начиная с версии 2.2, в Linux реализованы полные возможности управления трафиком. Предусмотрены различные алгоритмы, которые применяются для приоритизации очередей пакетов, выходящих с интерфейса. Стандартный алгоритм называется pfifo, и, как следует из самого названия, это очередь типа первым пришел - первым ушел. Фактически при этом никакого управления трафиком не происходит, и если какое-то соединение забивает весь канал, то этот алгоритм не сможет этого предотвратить.</para>
<para>Для управления трафиком в Shorewall используются два алгоритма, HTB (иерархический набор маркеров) и SFQ (очередь с равноправным стохастическим упорядочением). SFQ использует простую схему: отслеживаются все соединения (tcp или udp), и трафик распределяется между ними. Обычно это работает хорошо.
HTB позволяет определить набор классов, между которыми распределяется трафик. Для каждого класса можно указать минимальную и максимальную полосу пропускания, а сами классы упорядочить в иерархическую структуру, чтобы классы с меньшим приоритетом получали доступ к каналу только в том случае, если запросы более важных классы удовлетворены. Встроенные функции управления трафиком в Shorewall позволяют определить такие классы и указать для них полосу пропускания. Внутри самих классов используется SFQ, чтобы их различные внутренние потоки данных обрабатывались как равноправные.</para>
<para>Для управления трафиком в Shorewall используются два алгоритма, HTB (иерархический набор маркеров) и SFQ (очередь с равноправным стохастическим упорядочением). SFQ использует простую схему: отслеживаются все соединения (tcp или udp), и трафик распределяется между ними. Обычно это работает хорошо. HTB позволяет определить набор классов, между которыми распределяется трафик. Для каждого класса можно указать минимальную и максимальную полосу пропускания, а сами классы упорядочить в иерархическую структуру, чтобы классы с меньшим приоритетом получали доступ к каналу только в том случае, если запросы более важных классы удовлетворены. Встроенные функции управления трафиком в Shorewall позволяют определить такие классы и указать для них полосу пропускания. Внутри самих классов используется SFQ, чтобы их различные внутренние потоки данных обрабатывались как равноправные.</para>
<para><emphasis role="bold">Управлять можно только исходящим трафиком. Причина этого состоит в том, что входящие пакеты уже пришли на сетевую плату, и нужно решить, что с ними делать</emphasis>. Их можно только сбросить, но особого смысла в этом не будет, поскольку пакет уже пришёл, пройдя через узкое место - входящий канал. Следующим узким местом может быть интерфейс, с которого уходит этот пакет, и именно на нём может образовываться очередь. Поэтому определение очередей для входящих пакетов не будет особенно полезным, эти пакеты просто нужно передать как можно быстрее на исходящий интерфейс.</para>
@ -111,8 +94,7 @@
<para>Если на другом конце канала образуется очередь, а маршрутизатор не поддерживает QoS или биты QoS настроены неверно, то пакеты, для которых важна минимальная задержка, будут ждать в той же очереди, что и менее важные пакеты загрузки по HTTP, и задержка может быть большой.</para>
<para>Управление исходящим трафиком достигается посредством распределения потока пакетов по
<firstterm>классам</firstterm>. Класс связан ровно с одним сетевым интерфейсом и имеет ряд атрибутов:</para>
<para>Управление исходящим трафиком достигается посредством распределения потока пакетов по <firstterm>классам</firstterm>. Класс связан ровно с одним сетевым интерфейсом и имеет ряд атрибутов:</para>
<orderedlist>
<listitem>
@ -128,34 +110,30 @@
</listitem>
<listitem>
<para>MARK - метка. В Netfilter предусмотрены способы
<firstterm>маркировки</firstterm> пакетов. Метки пакетов - это числа. В Shorewall они могут принимать значение от 1 до 255. Метки пакетов присваиваются различным типам пакетов согласно правилам, заданным в файле
<filename>/etc/shorewall/tcrules</filename>. </para>
<para>MARK - метка. В Netfilter предусмотрены способы <firstterm>маркировки</firstterm> пакетов. Метки пакетов - это числа. В Shorewall они могут принимать значение от 1 до 255. Метки пакетов присваиваются различным типам пакетов согласно правилам, заданным в файле <filename>/etc/shorewall/tcrules</filename>.</para>
</listitem>
</orderedlist>
<para>Для каждого интерфейса необходимо задать один класс, который будет <firstterm>классом по умолчанию</firstterm>. К этому классу будут относиться непомеченные данные, то есть пакеты, для которых не задана метка в файле
<filename>/etc/shorewall/tcrules</filename>. </para>
<para>Для каждого интерфейса необходимо задать один класс, который будет <firstterm>классом по умолчанию</firstterm>. К этому классу будут относиться непомеченные данные, то есть пакеты, для которых не задана метка в файле <filename>/etc/shorewall/tcrules</filename>.</para>
<para>Netfilter также поддерживает метки соединений. Метки соединений можно присвоить соединениям в правилах <filename>/etc/shorewall/tcrules</filename>, можно скопировать метку пакета в метку соединения (SAVE), или скопировать метку соединения в метку пакета (RESTORE).</para>
</section>
<section>
<section id="Kernel">
<title>Конфигурация ядра Linux</title>
<para>Для работы требуется ядро не ниже 2.4.18. На рисунке показаны опции ядра, которые необходимо включить. Для встроенной поддержки необходимы опции HTB scheduler, Ingress scheduler,
PRIO pseudoscheduler и SFQ queue. Прочие планировщики или алгоритмы очередей необязательны.</para>
<para>Для работы требуется ядро не ниже 2.4.18. На рисунке показаны опции ядра, которые необходимо включить. Для встроенной поддержки необходимы опции HTB scheduler, Ingress scheduler, PRIO pseudoscheduler и SFQ queue. Прочие планировщики или алгоритмы очередей необязательны.</para>
<para>Также требуются классификаторы u32 и fw из главного меню Networking Options (не показаны).</para>
<para>На следующем рисунке показано, как я настроил QoS у себя в ядре 2.6.13:<graphic align="center" fileref="images/QoS.png" /></para>
<para>На следующем рисунке показано, как я настроил QoS у себя в ядре 2.6.13:<graphic align="center" fileref="images/QoS.png"/></para>
<para>Конфигурация ядра изменилась в 2.6.16 -- вот мои рекомендации.</para>
<graphic align="center" fileref="images/traffic_shaping2.6.png" />
<graphic align="center" fileref="images/traffic_shaping2.6.png"/>
</section>
<section>
<section id="Shorewall">
<title>Включение поддержки TC в Shorewall</title>
<para>Поддержку TC требуется включить независимо от того, применяются ли встроенные функции или вы используете собственный сценарий tcstart.</para>
@ -164,14 +142,11 @@
<itemizedlist>
<listitem>
<para>Задайте <emphasis role="bold">TC_ENABLED</emphasis> равным "Internal" в
/etc/shorewall/shorewall.conf. Если TC_ENABLED=Yes, то Shorewall будет искать внешний
файл tcstart (см. <link linkend="tcstart">далее</link>).</para>
<para>Задайте <emphasis role="bold">TC_ENABLED</emphasis> равным &quot;Internal&quot; в /etc/shorewall/shorewall.conf. Если TC_ENABLED=Yes, то Shorewall будет искать внешний файл tcstart (см. <link linkend="tcstart">далее</link>).</para>
</listitem>
<listitem>
<para>Если задать параметр <emphasis role="bold">CLEAR_TC</emphasis> в
/etc/shorewall/shorewall.conf равным Yes, то при запуске, перезапуске и остановке Shorewall будет сбрасываться текущая конфигурация управления трафиком. Обычно именно это и требуется при работе с встроенными функциями, а также с собственным сценарием tcstart.</para>
<para>Если задать параметр <emphasis role="bold">CLEAR_TC</emphasis> в /etc/shorewall/shorewall.conf равным Yes, то при запуске, перезапуске и остановке Shorewall будет сбрасываться текущая конфигурация управления трафиком. Обычно именно это и требуется при работе с встроенными функциями, а также с собственным сценарием tcstart.</para>
</listitem>
<listitem>
@ -180,7 +155,7 @@
</itemizedlist>
</section>
<section>
<section id="Builtin">
<title>Работа с встроенными функциями управления трафиком и шейпинга</title>
<para>Встроенные в Shorewall функции управления трафиком - это тонкая оболочка для очереди входящих пакетов (ingress qdisc), HTB и SFQ. Эта оболочка позволяет выполнить следующие задачи:</para>
@ -211,17 +186,13 @@
<para>Встроенные в Shorewall функции управления трафиком ограничены десятью (10) устройствами.</para>
</warning>
<para>Больше никаких задач встроенные функции управления трафиком не выполняют. Поэтому, чтобы их использовать, необходимо понимать, как работает HTB и управление трафиком в
Linux, и как работают метки пакетов Netfilter. За дополнительной информацией обратитесь к ссылкам, приведенным в начале этого документа.</para>
<para>Больше никаких задач встроенные функции управления трафиком не выполняют. Поэтому, чтобы их использовать, необходимо понимать, как работает HTB и управление трафиком в Linux, и как работают метки пакетов Netfilter. За дополнительной информацией обратитесь к ссылкам, приведенным в начале этого документа.</para>
<para>Для задания пропускной способности (как устройств, так и классов) используйте kbit или kbps (для килоБАЙТ в секунду) <emphasis role="bold">БЕЗ</emphasis> пробела между числом и единицей измерения (то есть
100kbit <emphasis role="bold">НО НЕ</emphasis> 100 kbit). Можно также использовать mbit, mbps или число (означающее байты), но поддерживаются только целые числа (0.5 использовать <emphasis role="bold">нельзя</emphasis>).</para>
<para>Для задания пропускной способности (как устройств, так и классов) используйте kbit или kbps (для килоБАЙТ в секунду) <emphasis role="bold">БЕЗ</emphasis> пробела между числом и единицей измерения (то есть 100kbit <emphasis role="bold">НО НЕ</emphasis> 100 kbit). Можно также использовать mbit, mbps или число (означающее байты), но поддерживаются только целые числа (0.5 использовать <emphasis role="bold">нельзя</emphasis>).</para>
<para>Для того чтобы правильно настроить устройства, необходимо выяснить фактическую пропускную способность канала в обоих направлениях. Это особенно важно для соединений DSL или любых других, для которых пропускная способность канала не гарантирована. Не верьте числам, которые называет провайдер, но сами измерьте реальную скорость канала. В этом могут помочь различные утилиты в сети, попробуйте поискать "dsl speed test" в google (для Германии можно использовать <ulink
url="http://www.speedcheck.arcor.de/cgi-bin/speedcheck.cgi">arcor speed
check</ulink>). Найдите тест поближе к себе.</para>
<para>Для того чтобы правильно настроить устройства, необходимо выяснить фактическую пропускную способность канала в обоих направлениях. Это особенно важно для соединений DSL или любых других, для которых пропускная способность канала не гарантирована. Не верьте числам, которые называет провайдер, но сами измерьте реальную скорость канала. В этом могут помочь различные утилиты в сети, попробуйте поискать &quot;dsl speed test&quot; в google (для Германии можно использовать <ulink url="http://www.speedcheck.arcor.de/cgi-bin/speedcheck.cgi">arcor speed check</ulink>). Найдите тест поближе к себе.</para>
<section>
<section id="tcdevices">
<title>/etc/shorewall/tcdevices</title>
<para>В этом файле можно задать пропускную способность способность канала для устройств, для которых будет включено управление трафиком. Это означает, что в этом файле необходимо определить параметры для устройства, чтобы для него заработало управление трафиком.</para>
@ -230,20 +201,13 @@
<itemizedlist>
<listitem>
<para>INTERFACE - Имя интерфейса. Интерфейс может быть указан не более одного раза. Использовать псевдоним интерфейса
(например, eth0:0) здесь нельзя, см. <ulink url="FAQ.htm#faq18">FAQ #18</ulink>.
Также нельзя использовать символы подстановки, например, если есть несколько интерфейсов ppp, то все их необходимо здесь перечислить. В версиях Shorewall
до 3.0.8 и 3.2.0 Beta 8, устройство, имя которого указано в столбце, должно было существовать в момент запуска, перезапуска или обновления Shorewall. Начиная с версии 3.0.8 и 3.2.0 Beta 8
Shorewall может определить, существует ли устройство, и настроит его только в том случае, если оно существует. Если оно не существует, то будет показано следующее предупреждение:</para>
<para>INTERFACE - Имя интерфейса. Интерфейс может быть указан не более одного раза. Использовать псевдоним интерфейса (например, eth0:0) здесь нельзя, см. <ulink url="FAQ.htm#faq18">FAQ #18</ulink>. Также нельзя использовать символы подстановки, например, если есть несколько интерфейсов ppp, то все их необходимо здесь перечислить. В версиях Shorewall до 3.0.8 и 3.2.0 Beta 8, устройство, имя которого указано в столбце, должно было существовать в момент запуска, перезапуска или обновления Shorewall. Начиная с версии 3.0.8 и 3.2.0 Beta 8 Shorewall может определить, существует ли устройство, и настроит его только в том случае, если оно существует. Если оно не существует, то будет показано следующее предупреждение:</para>
<para><emphasis role="bold">WARNING: Device &lt;устройство&gt; not
found -- traffic-shaping configuration skipped</emphasis></para>
<para><emphasis role="bold">WARNING: Device &lt;устройство&gt; not found -- traffic-shaping configuration skipped</emphasis></para>
</listitem>
<listitem>
<para>IN-BANDWIDTH - Пропускная способность входящего канала для этого интерфейса.
Обратите внимание, что шейпинг входящего трафика невозможен, так как пакеты уже пришли.
В этом столбце можно задать максимальную скорость, разрешенную для этого интерфейса, при превышении которой пакеты будут отбрасываться. Это полезно главным образом для соединений DSL или кабельных, чтобы избежать очередей в устройствах провайдера. Если не следует отбрасывать никакие пакеты, то укажите значение, превышающее фактическую максимальную скорость канала.</para>
<para>IN-BANDWIDTH - Пропускная способность входящего канала для этого интерфейса. Обратите внимание, что шейпинг входящего трафика невозможен, так как пакеты уже пришли. В этом столбце можно задать максимальную скорость, разрешенную для этого интерфейса, при превышении которой пакеты будут отбрасываться. Это полезно главным образом для соединений DSL или кабельных, чтобы избежать очередей в устройствах провайдера. Если не следует отбрасывать никакие пакеты, то укажите значение, превышающее фактическую максимальную скорость канала (в Shorewall начиная с версии 3.2.6 можно также указать 0).</para>
<para>Для того чтобы определить оптимальное значение, укажите сначала значение, которое заведомо ниже, чем измеренная скорость канала (процентов на 20). Далее, в ходе загрузки файлов, измеряйте время ответа на <emphasis>ping</emphasis> между своей системой и маршрутизатором провайдера и постепенно увеличивайте это значение. Оптимальным будет значение, при превышении которого время ответа на <emphasis>ping</emphasis> будет резко расти.</para>
</listitem>
@ -253,7 +217,7 @@
</listitem>
</itemizedlist>
<example>
<example id="Example0">
<title></title>
<para>Предположим, что вы работаете с PPP по Ethernet (DSL), а интерфейс - это ppp0. Устройство имеет исходящую скорость 500 кбит и входящую - 6000 кбит</para>
@ -263,7 +227,7 @@ ppp0 6000kbit 500kbit</programlisting>
</example>
</section>
<section>
<section id="tcclasses">
<title>/etc/shorewall/tcclasses</title>
<para>В этом файле можно задать классы, по которым будет распределяться исходящий трафик.</para>
@ -274,23 +238,19 @@ ppp0 6000kbit 500kbit</programlisting>
</listitem>
<listitem>
<para>MARK - метка. Должна быть целым числом от 1 до 255.
Эти метки задаются в файле tcrules. Они помечают пакеты, которые тем самым будут отнесены к определенным здесь классам очередей. Одни и те же метки могут использоваться для разных интерфейсов.</para>
<para>MARK - метка. Должна быть целым числом от 1 до 255. Эти метки задаются в файле tcrules. Они помечают пакеты, которые тем самым будут отнесены к определенным здесь классам очередей. Одни и те же метки могут использоваться для разных интерфейсов.</para>
</listitem>
<listitem>
<para>RATE - скорость, то есть минимальная гарантированная пропускная способность, которая должна обеспечиваться для класса, когда возрастает нагрузка на канал. Классы с более высоким приоритетом обслуживаются даже в том случае, если заданы другие классы с гарантированной пропускной способностью, но низшим приоритетом. <emphasis
role="bold">Если сумма значений RATE для всех классов, присвоенных интерфейсу, превышает OUT-BANDWIDTH для интерфейса, то
предел OUT-BANDWIDTH не будет соблюдаться.</emphasis></para>
<para>RATE - скорость, то есть минимальная гарантированная пропускная способность, которая должна обеспечиваться для класса, когда возрастает нагрузка на канал. Классы с более высоким приоритетом обслуживаются даже в том случае, если заданы другие классы с гарантированной пропускной способностью, но низшим приоритетом. <emphasis role="bold">Если сумма значений RATE для всех классов, присвоенных интерфейсу, превышает OUT-BANDWIDTH для интерфейса, то предел OUT-BANDWIDTH не будет соблюдаться.</emphasis></para>
</listitem>
<listitem>
<para>CEIL - ограничение, максимальная полоса пропускания, которая отводится для данного класса, когда канал свободен. Это полезно, если есть трафик, для которого будет выделяться полная скорость канала, если более важные службы (такие как ssh) не используются. Значение "full" означает, что максимальная пропускная способность для класса определяется значением, заданным для интерфейса.</para>
<para>CEIL - ограничение, максимальная полоса пропускания, которая отводится для данного класса, когда канал свободен. Это полезно, если есть трафик, для которого будет выделяться полная скорость канала, если более важные службы (такие как ssh) не используются. Значение &quot;full&quot; означает, что максимальная пропускная способность для класса определяется значением, заданным для интерфейса.</para>
</listitem>
<listitem>
<para>PRIORITY - позволяет указать приоритет для класса.
Пакеты из класса с более высоким приоритетом (то есть меньшим значением) будут обрабатываться раньше, чем пакеты с низшим приоритетом. Здесь можно просто указать значение метки, если метки присваиваются согласно приоритетам.</para>
<para>PRIORITY - позволяет указать приоритет для класса. Пакеты из класса с более высоким приоритетом (то есть меньшим значением) будут обрабатываться раньше, чем пакеты с низшим приоритетом. Здесь можно просто указать значение метки, если метки присваиваются согласно приоритетам.</para>
</listitem>
<listitem>
@ -301,20 +261,15 @@ ppp0 6000kbit 500kbit</programlisting>
<para>default - класс по умолчанию для интерфейса, к которому будет отнесен весь трафик, не отнесенный к другим классам.</para>
<note>
<para>Необходимо указать default ровно для <emphasis
role="bold">одного</emphasis> класса для интерфейса.</para>
<para>Необходимо указать default ровно для <emphasis role="bold">одного</emphasis> класса для интерфейса.</para>
</note>
</listitem>
<listitem>
<para>tos-&lt;имя-tos&gt; - позволяет указать фильтр для заданного &lt;имени-tos&gt;, что в свою очередь позволяет определить значение бит Type Of Service в пакете ip, вследствие чего пакет будет отнесен к этому классу. Учтите, что этот фильтр переопределяет все заданные метки, поэтому, если задать фильтр tos для класса, то все пакеты, имеющие эту метку, войдут в этот класс независимо от того, какая у них уже есть метка. Возможные значения этого параметра:
tos-minimize-delay (16) tos-maximize-throughput (8)
tos-maximize-reliability (4) tos-minimize-cost (2)
tos-normal-service (0)</para>
<para>tos-&lt;имя-tos&gt; - позволяет указать фильтр для заданного &lt;имени-tos&gt;, что в свою очередь позволяет определить значение бит Type Of Service в пакете ip, вследствие чего пакет будет отнесен к этому классу. Учтите, что этот фильтр переопределяет все заданные метки, поэтому, если задать фильтр tos для класса, то все пакеты, имеющие эту метку, войдут в этот класс независимо от того, какая у них уже есть метка. Возможные значения этого параметра: tos-minimize-delay (16) tos-maximize-throughput (8) tos-maximize-reliability (4) tos-minimize-cost (2) tos-normal-service (0)</para>
<note>
<para>Каждая из этих опций применима только для <emphasis
role="bold">одного</emphasis> класса интерфейса.</para>
<para>Каждая из этих опций применима только для <emphasis role="bold">одного</emphasis> класса интерфейса.</para>
</note>
</listitem>
@ -322,8 +277,7 @@ ppp0 6000kbit 500kbit</programlisting>
<para>tcp-ack - эта опция создает фильтр tc и класс, в который помещаются все пакеты tcp ack на этом интерфейсе, размер которых не превышает 64 байта. Это позволяет ускорить загрузку. Ограничение размера пакетов ack 64 байтами служит для того, чтобы исключить из этого класса все приложения (например, p2p), которые помечают каждый пакет как пакет ack. Этому фильтру должны соответствовать только пакеты БЕЗ дополнительной нагрузки, отсюда и ограничение размера. Пакеты большего размера будут отнесены в другие классы.</para>
<note>
<para>Эта опция применима только для одного <emphasis
role="bold">класса</emphasis> интерфейса.</para>
<para>Эта опция применима только для одного <emphasis role="bold">класса</emphasis> интерфейса.</para>
</note>
</listitem>
</itemizedlist>
@ -331,7 +285,7 @@ ppp0 6000kbit 500kbit</programlisting>
</itemizedlist>
</section>
<section>
<section id="tcrules">
<title>/etc/shorewall/tcrules</title>
<para>Классификатор fwmark является удобным средством для классификации пакетов при управлении трафиком. В файле <quote>/etc/shorewall/tcrules</quote> эти метки представлены в виде таблицы. Глубже познакомиться с маркировкой пакетов в Netfilter/Shorewall позволяет <ulink url="PacketMarking.html">этот документ</ulink>.</para>
@ -342,14 +296,11 @@ ppp0 6000kbit 500kbit</programlisting>
<itemizedlist>
<listitem>
<para>MARK или CLASSIFY - MARK задает значение метки, которая присваивается пакету в случае совпадения с правилом. Она должна быть целым числом от 1 до 255.
Вслед за этим значением может идти <quote>:</quote> и одно из значений:
<quote>F</quote>, <quote>P</quote> или "T", которые обозначают соответственно маркировку в цепочках FORWARD, PREROUTING или POSTROUTING. Если эти дополнительные спецификаторы опущены, то цепочка, в которой осуществляется маркировка пакетов, определяется следующим образом:</para>
<para>MARK или CLASSIFY - MARK задает значение метки, которая присваивается пакету в случае совпадения с правилом. Она должна быть целым числом от 1 до 255. Вслед за этим значением может идти <quote>:</quote> и одно из значений: <quote>F</quote>, <quote>P</quote> или &quot;T&quot;, которые обозначают соответственно маркировку в цепочках FORWARD, PREROUTING или POSTROUTING. Если эти дополнительные спецификаторы опущены, то цепочка, в которой осуществляется маркировка пакетов, определяется следующим образом:</para>
<itemizedlist>
<listitem>
<para>Если SOURCE - это
$FW[:&lt;<emphasis>адрес</emphasis>&gt;], то правило вставляется в цепочку OUTPUT.</para>
<para>Если SOURCE - это $FW[:&lt;<emphasis>адрес</emphasis>&gt;], то правило вставляется в цепочку OUTPUT.</para>
</listitem>
<listitem>
@ -358,56 +309,42 @@ ppp0 6000kbit 500kbit</programlisting>
</itemizedlist>
<note>
<para>Спецификатор "T" был добавлен в Shorewall версии 3.3.6 и недоступен в более ранних версиях.</para>
<para>Спецификатор &quot;T&quot; был добавлен в Shorewall версии 3.3.6 и недоступен в более ранних версиях.</para>
</note>
<para>Обычно метка присваивается пакету. Если вслед за меткой указать ":" и "C", то метка будет применяться к соединению. "C" можно сочетать с "F", "P" или "T", чтобы указать, что соединение следует пометить в определенной цепочке (например, "CF", "CP", "CT").</para>
<para>Обычно метка присваивается пакету. Если вслед за меткой указать &quot;:&quot; и &quot;C&quot;, то метка будет применяться к соединению. &quot;C&quot; можно сочетать с &quot;F&quot;, &quot;P&quot; или &quot;T&quot;, чтобы указать, что соединение следует пометить в определенной цепочке (например, &quot;CF&quot;, &quot;CP&quot;, &quot;CT&quot;).</para>
<para>Предусмотрены также следующие специальные значения:</para>
<orderedlist numeration="loweralpha">
<listitem>
<para><emphasis
role="bold">RESTORE</emphasis>[/<emphasis>маска</emphasis>-- восстановить метку пакета из метки соединения, используя маску, если она указана. Ядро и iptables должны поддерживать CONNMARK.</para>
<para><emphasis role="bold">RESTORE</emphasis>[/<emphasis>маска</emphasis>] -- восстановить метку пакета из метки соединения, используя маску, если она указана. Ядро и iptables должны поддерживать CONNMARK.</para>
<para>Как и ранее, можно использовать дополнительные спецификаторы
<emphasis
role="bold">:P</emphasis>, <emphasis role="bold">:F</emphasis>
или <emphasis role="bold">:T</emphasis>.</para>
<para>Как и ранее, можно использовать дополнительные спецификаторы <emphasis role="bold">:P</emphasis>, <emphasis role="bold">:F</emphasis> или <emphasis role="bold">:T</emphasis>.</para>
</listitem>
<listitem>
<para><emphasis
role="bold">SAVE</emphasis>[/<emphasis>маска</emphasis> -- сохранить метку пакета в метке соединения, используя маску, если она указана. Ядро и iptables должны поддерживать CONNMARK.</para>
<para><emphasis role="bold">SAVE</emphasis>[/<emphasis>маска</emphasis>] -- сохранить метку пакета в метке соединения, используя маску, если она указана. Ядро и iptables должны поддерживать CONNMARK.</para>
<para>Как и ранее, можно использовать дополнительные спецификаторы <emphasis
role="bold">:P</emphasis>, <emphasis role="bold">:F</emphasis>
или <emphasis role="bold">:T</emphasis>.</para>
<para>Как и ранее, можно использовать дополнительные спецификаторы <emphasis role="bold">:P</emphasis>, <emphasis role="bold">:F</emphasis> или <emphasis role="bold">:T</emphasis>.</para>
</listitem>
<listitem>
<para><emphasis role="bold">CONTINUE</emphasis> - прекратить обработку дальнейших правил маркировки в таблице.</para>
<para>Как и ранее, можно использовать дополнительные спецификаторы <emphasis
role="bold">:P</emphasis>, <emphasis role="bold">:F</emphasis>
или <emphasis role="bold">:T</emphasis>.</para>
<para>Как и ранее, можно использовать дополнительные спецификаторы <emphasis role="bold">:P</emphasis>, <emphasis role="bold">:F</emphasis> или <emphasis role="bold">:T</emphasis>.</para>
</listitem>
<listitem>
<para><emphasis role="bold">COMMENT</emphasis> (Начиная с
Shorewall версии 3.3.3) -- остальной текст в строке будет добавлен как комментарий в правила Netfilter, генерируемые по следующим записям. Комментарий будет выделен символам "/* ...
*/" в выводе команды
<command>shorewall show
mangle</command></para>
<para><emphasis role="bold">COMMENT</emphasis> (Начиная с Shorewall версии 3.3.3) -- остальной текст в строке будет добавлен как комментарий в правила Netfilter, генерируемые по следующим записям. Комментарий будет выделен символам &quot;/* ... */&quot; в выводе команды <command>shorewall show mangle</command></para>
<para>Для того чтобы комментарий не применялся к последующим строкам, укажите COMMENT в отдельной строке.</para>
</listitem>
</orderedlist>
<para>При работе с CLASSIFY ядро и iptables должны поддерживать CLASSIFY. В этом случае в столбце будет содержаться классификатор (classid) в виде &lt;основной&gt;:&lt;дополнительный&gt;, где &lt;основной&gt; и &lt;дополнительный&gt; должны быть целыми числами. Он соответствует указанию 'class' в следующих модулях управления трафиком:</para>
<para>При работе с CLASSIFY ядро и iptables должны поддерживать CLASSIFY. В этом случае в столбце будет содержаться классификатор (classid) в виде &lt;основной&gt;:&lt;дополнительный&gt;, где &lt;основной&gt; и &lt;дополнительный&gt; должны быть целыми числами. Он соответствует указанию &apos;class&apos; в следующих модулях управления трафиком:</para>
<simplelist>
<member>atm</member>
<simplelist><member>atm</member>
<member>cbq</member>
@ -417,44 +354,35 @@ ppp0 6000kbit 500kbit</programlisting>
<member>htb</member>
<member>prio</member>
</simplelist>
<member>prio</member></simplelist>
<para>В версиях Shorewall до 3.2.3 правила классификации всегда помещались в цепочку POSTROUTING. Начиная с Shorewall
версии 3.2.3 классификация осуществляется в цепочке POSTROUTING, <emphasis
role="bold">кроме тех случаев</emphasis>, когда SOURCE содержит
$FW[:&lt;<emphasis>адрес</emphasis>&gt;], для которых классификация осуществляется в цепочке OUTPUT. При работе со встроенными функциями управления трафиком класс &lt;основной&gt; - это номер устройства (первая запись в файле <filename>/etc/shorewall/tcdevices</filename> - это устройство 1, вторая - устройство 2 и т.д.), а класс &lt;дополнительный&gt; - это значение MARK класса, перед которой стоит число "1" (для MARK со значением 1 &lt;дополнительный&gt; класс - это 11, для MARK со значением 22 -
&lt;дополнительный&gt; класс 122, и т.д.).</para>
<para>В версиях Shorewall до 3.2.3 правила классификации всегда помещались в цепочку POSTROUTING. Начиная с Shorewall версии 3.2.3 классификация осуществляется в цепочке POSTROUTING, <emphasis role="bold">кроме тех случаев</emphasis>, когда SOURCE содержит $FW[:&lt;<emphasis>адрес</emphasis>&gt;], для которых классификация осуществляется в цепочке OUTPUT. При работе со встроенными функциями управления трафиком класс &lt;основной&gt; - это номер устройства (первая запись в файле <filename>/etc/shorewall/tcdevices</filename> - это устройство 1, вторая - устройство 2 и т.д.), а класс &lt;дополнительный&gt; - это значение MARK класса, перед которой стоит число &quot;1&quot; (для MARK со значением 1 &lt;дополнительный&gt; класс - это 11, для MARK со значением 22 - &lt;дополнительный&gt; класс 122, и т.д.).</para>
</listitem>
<listitem>
<para>SOURCE - источник пакета. Это может быть разделенный запятыми список имен интерфейсов, IP-адресов, MAC-адресов и/или подсетей для пакетов, маршрутизируемых по общему пути. Элементы списка могут также включать имя интерфейса, к которому прибавлено ":" и адрес (например,
eth1:192.168.1.0/24). Так, все пакеты для соединений, маскируемых через eth0 с других интерфейсов, можно описать одним правилом с несколькими критериями SOURCE. Однако соединение, пакеты которого приходят на eth0 по другому пути, например, из самой системы файрвола, требуют отдельного правила.</para>
<para>SOURCE - источник пакета. Это может быть разделенный запятыми список имен интерфейсов, IP-адресов, MAC-адресов и/или подсетей для пакетов, маршрутизируемых по общему пути. Элементы списка могут также включать имя интерфейса, к которому прибавлено &quot;:&quot; и адрес (например, eth1:192.168.1.0/24). Так, все пакеты для соединений, маскируемых через eth0 с других интерфейсов, можно описать одним правилом с несколькими критериями SOURCE. Однако соединение, пакеты которого приходят на eth0 по другому пути, например, из самой системы файрвола, требуют отдельного правила.</para>
<para>Поэтому создавайте отдельное правило с $FW для пакетов, исходящих из системы файрвола. В таком правиле столбец MARK не может содержать ":P" или ":F", поскольку маркировка пакетов, исходящих из системы файрвола, всегда осуществляется в цепочке OUTPUT.</para>
<para>Поэтому создавайте отдельное правило с $FW для пакетов, исходящих из системы файрвола. В таком правиле столбец MARK не может содержать &quot;:P&quot; или &quot;:F&quot;, поскольку маркировка пакетов, исходящих из системы файрвола, всегда осуществляется в цепочке OUTPUT.</para>
<para>MAC-адреса необходимо предварять символом "~" и использовать "-" как разделитель.</para>
<para>MAC-адреса необходимо предварять символом &quot;~&quot; и использовать &quot;-&quot; как разделитель.</para>
<para>Пример: ~00-A0-C9-15-39-78</para>
</listitem>
<listitem>
<para>DEST - назначение пакета. Список IP-адресов и/или подсетей, разделенный запятыми. Если ядро и iptables поддерживают iprange, то можно также указывать диапазоны IP-адресов. Элементы списка могут также включать имя интерфейса, к которому прибавлено ":" и адрес (например,
eth1:192.168.1.0/24). Если в столбце MARK указан спецификатор в виде &lt;основной&gt;:&lt;дополнительный&gt;, то столбец может также содержать имя интерфейса.</para>
<para>DEST - назначение пакета. Список IP-адресов и/или подсетей, разделенный запятыми. Если ядро и iptables поддерживают iprange, то можно также указывать диапазоны IP-адресов. Элементы списка могут также включать имя интерфейса, к которому прибавлено &quot;:&quot; и адрес (например, eth1:192.168.1.0/24). Если в столбце MARK указан спецификатор в виде &lt;основной&gt;:&lt;дополнительный&gt;, то столбец может также содержать имя интерфейса.</para>
</listitem>
<listitem>
<para>PROTO - протокол. Должен быть указан как "tcp", "udp", "icmp", "ipp2p",
"ipp2p:udp", "ipp2p:all", число или "all". Для "ipp2p" требуется поддержка ipp2p в ядре и iptables.</para>
<para>PROTO - протокол. Должен быть указан как &quot;tcp&quot;, &quot;udp&quot;, &quot;icmp&quot;, &quot;ipp2p&quot;, &quot;ipp2p:udp&quot;, &quot;ipp2p:all&quot;, число или &quot;all&quot;. Для &quot;ipp2p&quot; требуется поддержка ipp2p в ядре и iptables.</para>
</listitem>
<listitem>
<para>PORT(S) - целевые порты. Список имен портов (из /etc/services), номеров портов или диапазонов портов, разделенный запятыми. Если протокол - это "icmp", то столбец считается целевым типом icmp.</para>
<para>PORT(S) - целевые порты. Список имен портов (из /etc/services), номеров портов или диапазонов портов, разделенный запятыми. Если протокол - это &quot;icmp&quot;, то столбец считается целевым типом icmp.</para>
<para>Если протокол - это ipp2p, то столбец интерпретируется как опция ipp2p без начального "--" (например, "bit" для
bit-torrent). Если PORT не указан, предполагается "ipp2p".</para>
<para>Если протокол - это ipp2p, то столбец интерпретируется как опция ipp2p без начального &quot;--&quot; (например, &quot;bit&quot; для bit-torrent). Если PORT не указан, предполагается &quot;ipp2p&quot;.</para>
<para>Этот поле игнорируется, если PROTOCOL = all, но должно быть указано, если задано любое из последующих полей. В этом случае рекомендуется указывать в этом поле "-"</para>
<para>Этот поле игнорируется, если PROTOCOL = all, но должно быть указано, если задано любое из последующих полей. В этом случае рекомендуется указывать в этом поле &quot;-&quot;</para>
</listitem>
<listitem>
@ -473,7 +401,7 @@ bit-torrent). Если PORT не указан, предполагается "ipp
<programlisting>joe # программа должна выполняться пользователем joe
:kids # программа выполняется участниками группы 'kids'
!:kids # программа выполняется участниками группы 'kids'
+upnpd # программа upnpd (эта функция была удалена из Netfilter в версии ядра 2.6.14). </programlisting>
+upnpd # программа upnpd (эта функция была удалена из Netfilter в версии ядра 2.6.14).</programlisting>
</listitem>
<listitem>
@ -481,23 +409,19 @@ bit-torrent). Если PORT не указан, предполагается "ipp
<para>Здесь:</para>
<simplelist>
<member>! Обратное соответствие (не равно)</member>
<simplelist><member>! Обратное соответствие (не равно)</member>
<member>&lt;значение&gt; Значение метки соединения или пакета.</member>
<member>&lt;маска&gt; Маска, применяемая к метке перед сравнением</member>
<member>:C обозначает метку соединения. Если она не указана, то сравнивается метка пакета.</member>
</simplelist>
<member>:C обозначает метку соединения. Если она не указана, то сравнивается метка пакета.</member></simplelist>
</listitem>
<listitem>
<para>LENGTH - длина пакета (необязательный параметр, начиная с Shorewall версии 3.2.0). Если указано это значение, то сравнивается длина пакета с указанным значением или диапазоном значений. Диапазон задается в виде &lt;мин&gt;:&lt;макс&gt;, где можно опустить или
&lt;мин&gt;, или &lt;макс&gt;, но не оба эти параметра. Если опущен
&lt;мин&gt;, то он считается равным 0, если опущен &lt;макс&gt;, то совпадающим будет любой пакет, длина которого не меньше &lt;мин&gt;.</para>
<para>LENGTH - длина пакета (необязательный параметр, начиная с Shorewall версии 3.2.0). Если указано это значение, то сравнивается длина пакета с указанным значением или диапазоном значений. Диапазон задается в виде &lt;мин&gt;:&lt;макс&gt;, где можно опустить или &lt;мин&gt;, или &lt;макс&gt;, но не оба эти параметра. Если опущен &lt;мин&gt;, то он считается равным 0, если опущен &lt;макс&gt;, то совпадающим будет любой пакет, длина которого не меньше &lt;мин&gt;.</para>
<para>Для этой опции необходима поддержка сравнения длины в iptables. Если значение не указано или задано как "-", то сравнение длины не выполняется.</para>
<para>Для этой опции необходима поддержка сравнения длины в iptables. Если значение не указано или задано как &quot;-&quot;, то сравнение длины не выполняется.</para>
<para>Примеры: 1024, 64:1500, :100</para>
</listitem>
@ -506,8 +430,7 @@ bit-torrent). Если PORT не указан, предполагается "ipp
<para>TOS - тип обслуживания (необязательный параметр, начиная с Shorewall версии 3.2.0 Beta 6). Стандартное имя или число.</para>
<blockquote>
<simplelist>
<member>Minimize-Delay (16)</member>
<simplelist><member>Minimize-Delay (16)</member>
<member>Maximize-Throughput (8)</member>
@ -515,34 +438,33 @@ bit-torrent). Если PORT не указан, предполагается "ipp
<member>Minimize-Cost (2)</member>
<member>Normal-Service (0)</member>
</simplelist>
<member>Normal-Service (0)</member></simplelist>
</blockquote>
</listitem>
</itemizedlist>
<example>
<example id="Example1">
<title></title>
<para>Все пакеты, приходящие на eth1, должны иметь метку 1. Все пакеты, приходящие на eth2 и eth3, должны иметь метку 2. Все пакеты, созданные в системе файрвола, должны иметь метку 3.</para>
<programlisting>#MARK SOURCE DESTINATION PROTOCOL PORT(S)
<programlisting>#MARK SOURCE DESTINATION PROTOCOL PORT(S)
1 eth1 0.0.0.0/0 all
2 eth2 0.0.0.0/0 all
2 eth3 0.0.0.0/0 all
3 $FW 0.0.0.0/0 all</programlisting>
</example>
<example>
<example id="Example2">
<title></title>
<para>Все пакеты GRE (протокол 47), не созданные в системе файрвола и имеющие целевой адрес 155.186.235.151, должны иметь метку 12.</para>
<programlisting>#MARK SOURCE DESTINATION PROTOCOL PORT(S)
<programlisting>#MARK SOURCE DESTINATION PROTOCOL PORT(S)
12 0.0.0.0/0 155.182.235.151 47</programlisting>
</example>
<example>
<example id="Example3">
<title></title>
<para>Все пакеты SSH, приходящие с 192.168.1.0/24 и предназначенные для 155.186.235.151, должны иметь метку 22.</para>
@ -551,7 +473,7 @@ bit-torrent). Если PORT не указан, предполагается "ipp
22 192.168.1.0/24 155.182.235.151 tcp 22</programlisting>
</example>
<example>
<example id="Example4">
<title></title>
<para>Все пакеты SSH, проходящие через первое устройство в файле /etc/shorewall/tcdevices, должны быть отнесены в класс с меткой 10.</para>
@ -562,7 +484,7 @@ bit-torrent). Если PORT не указан, предполагается "ipp
1:110 0.0.0.0/0 0.0.0.0/0 tcp - 22</programlisting>
</example>
<example>
<example id="Example5">
<title></title>
<para>Все пакеты echo ICMP должны иметь метку 1. Весь трафик протоколов p2p должен иметь метку 4.</para>
@ -582,12 +504,12 @@ SAVE 0.0.0.0/0 0.0.0.0/0 all - - -
<para>Последние четыре правила означают следующее:</para>
<blockquote>
<para>"Если пакет не был классифицирован (метка пакета 0), то скопировать метку соединения в метку пакета. Если метка пакета уже задана, то никаких действий более не требуется. Если пакет относится к типу P2P, то задать метку пакета 4. Если метка пакета задана, то сохранить ее в качестве метки соединения."</para>
<para>&quot;Если пакет не был классифицирован (метка пакета 0), то скопировать метку соединения в метку пакета. Если метка пакета уже задана, то никаких действий более не требуется. Если пакет относится к типу P2P, то задать метку пакета 4. Если метка пакета задана, то сохранить ее в качестве метки соединения.&quot;</para>
</blockquote>
</example>
</section>
<section>
<section id="ppp">
<title>Устройства ppp</title>
<para>Если подключение к провайдеру выполняется через ppp/pppoe/pppoa, и вы используете управление трафиком, то необходимо перезапустить управление трафиком shorewall. Причина этого состоит в том, что если соединение ppp перезапускается (обычно это происходит как минимум раз в день), то все фильтры и qdisc <quote>tc</quote>, связанные с этим интерфейсом, будут удалены.</para>
@ -599,48 +521,45 @@ SAVE 0.0.0.0/0 0.0.0.0/0 all - - -
/sbin/shorewall refresh</programlisting>
</section>
<section>
<section id="Real">
<title>Рабочие примеры</title>
<section>
<section id="Wondershaper">
<title>Конфигурация для замены Wondershaper</title>
<para>Встроенные функции управления трафиком позволяют полностью заменить сценарий wondershaper. Примеры файлов конфигурации приведены по адресу
<ulink
url="http://www1.shorewall.net/pub/shorewall/Samples/tc4shorewall/">"http://www1.shorewall.net/pub/shorewall/Samples/tc4shorewall/</ulink>.
Обратите внимание, что эти примеры необходимо настроить, чтобы они работали в вашей среде. В них предполагается, что интерфейс соединения с провайдером - это ppp0 (для DSL), и для другого типа соединения его необходимо изменить. Также требуется изменить параметры в файле tcdevices.wondershaper, чтобы они отвечали фактической скорости канала. Ниже приведены соответствующие строки из файлов конфигурации. В итоге получается точная замена того, что должен делать wondershaper. Но вы можете и вносить улучшения...</para>
<para>Встроенные функции управления трафиком позволяют полностью заменить сценарий wondershaper. Примеры файлов конфигурации приведены по адресу <ulink url="http://www1.shorewall.net/pub/shorewall/Samples/tc4shorewall/">&quot;http://www1.shorewall.net/pub/shorewall/Samples/tc4shorewall/</ulink>. Обратите внимание, что эти примеры необходимо настроить, чтобы они работали в вашей среде. В них предполагается, что интерфейс соединения с провайдером - это ppp0 (для DSL), и для другого типа соединения его необходимо изменить. Также требуется изменить параметры в файле tcdevices.wondershaper, чтобы они отвечали фактической скорости канала. Ниже приведены соответствующие строки из файлов конфигурации. В итоге получается точная замена того, что должен делать wondershaper. Но вы можете и вносить улучшения...</para>
<section>
<section id="realtcd">
<title>Файл tcdevices</title>
<programlisting>#INTERFACE IN-BANDWITH OUT-BANDWIDTH
ppp0 5000kbit 500kbit</programlisting>
</section>
<section>
<section id="realtcc">
<title>Файл tcclasses</title>
<programlisting>#INTERFACE MARK RATE CEIL PRIORITY OPTIONS
<programlisting>#INTERFACE MARK RATE CEIL PRIORITY OPTIONS
ppp0 1 full full 1 tcp-ack,tos-minimize-delay
ppp0 2 9*full/10 9*full/10 2 default
ppp0 3 8*full/10 8*full/10 2</programlisting>
</section>
<section>
<section id="realtcr">
<title>Файл tcrules</title>
<programlisting>#MARK SOURCE DEST PROTO PORT(S) CLIENT USER
<programlisting>#MARK SOURCE DEST PROTO PORT(S) CLIENT USER
# PORT(S)
1:F 0.0.0.0/0 0.0.0.0/0 icmp echo-request
1:F 0.0.0.0/0 0.0.0.0/0 icmp echo-reply
# метка для трафика с низким приоритетом: 3.
# метка для трафика с низким приоритетом:
# mldonkey
3 0.0.0.0/0 0.0.0.0/0 udp - 4666</programlisting>
3 0.0.0.0/0 0.0.0.0/0 udp - 4666</programlisting>
<para>Wondershaper позволяет определить набор хостов и/или портов, которым присваивается низкий приоритет. Для этого в tcrules этим хостам нужно присвоить метку 3 (как это делается в примерах файлов конфигурации).</para>
</section>
<section>
<section id="lowpro">
<title>Присвоение низкого приоритета хостам</title>
<para>Допустим, что в сценарии wondershaper были следующие параметры (только в качестве примера):</para>
@ -657,7 +576,7 @@ NOPRIOHOSTDST=60.0.0.0/24
NOPRIOPORTSRC="6662 6663"
# Низкий приоритет - порты назначения
NOPRIOPORTDST="6662 6663" </programlisting>
NOPRIOPORTDST="6662 6663"</programlisting>
<para>Эти параметры будут отражены следующим образом в файле tcrules:</para>
@ -671,22 +590,21 @@ NOPRIOPORTDST="6662 6663" </programlisting>
</section>
</section>
<section>
<section id="simiple">
<title>Простая конфигурация</title>
<para>Ниже приведен простой пример для общего подключения к Интернет с разных компьютеров. Фактически здесь настроен шейпинг для двух хостов с IP-адресами 192.168.2.23 и
192.168.2.42</para>
<para>Ниже приведен простой пример для общего подключения к Интернет с разных компьютеров. Фактически здесь настроен шейпинг для двух хостов с IP-адресами 192.168.2.23 и 192.168.2.42</para>
<section>
<section id="simpletcd">
<title>Файл tcdevices</title>
<programlisting>#INTERFACE IN-BANDWITH OUT-BANDWIDTH
ppp0 6000kbit 700kbit</programlisting>
<para>Канал имеет нисходящие 6 мбит и исходящие 700 кбит.</para>
<para>Канал имеет входящие 6 мбит и исходящие 700 кбит.</para>
</section>
<section>
<section id="simpletcc">
<title>Файл tcclasses</title>
<programlisting>#INTERFACE MARK RATE CEIL PRIORITY OPTIONS
@ -698,7 +616,7 @@ ppp0 4 90kbit 200kbit 3 default</pro
<para>Добавляется класс для пакетов tcp ack с высоким приоритетом, чтобы ускорить загрузку. Следующие два класса совместно используют большую часть пропускной способности канала для двух хостов, и если соединение свободно, то всю пропускную способность. Так как хосты считаются равноправными, они имеют одинаковый приоритет. Последний класс предназначен для остального трафика.</para>
</section>
<section>
<section id="simpletcr">
<title>Файл tcrules</title>
<programlisting>#MARK SOURCE DEST PROTO PORT(S) CLIENT USER
@ -714,7 +632,33 @@ ppp0 4 90kbit 200kbit 3 default</pro
</section>
</section>
<section>
<section id="Xen">
<title>Замечания для пользователей Xen </title>
<para>Если управление трафиком включено в dom0, но исходящий трафик при этом шейпится неправильно, то причиной этого может быть &quot;выгрузка контрольных сумм&quot; (checksum offloading) в ваших domU. Просмотрите вывод команды &quot;shorewall show tc&quot;. Ниже приведен пример: </para>
<programlisting>class htb 1:130 parent 1:1 leaf 130: prio 3 quantum 1500 rate 76000bit <emphasis role="bold">ceil 230000bit</emphasis> burst 1537b/8 mpu 0b overhead 0b cburst 1614b/8 mpu 0b overhead 0b level 0
Sent 559018700 bytes 75324 pkt (dropped 0, overlimits 0 requeues 0)
<emphasis role="bold">rate 299288bit</emphasis> 3pps backlog 0b 0p requeues 0
lended: 53963 borrowed: 21361 <emphasis role="bold">giants: 90174</emphasis>
tokens: -26688 ctokens: -14783</programlisting>
<para>В приведенном примере легко обнаружить две проблемы:</para>
<orderedlist>
<listitem>
<para>Скорость (299288) заметно превышает установленный предел (230000).</para>
</listitem>
<listitem>
<para>Сообщается о большом числе огромных пакетов (90174). </para>
</listitem>
</orderedlist>
<para>Эта неполадка устраняется выключением &quot;checksum offloading&quot; в domU с помощью программы <command>ethtool</command>. За инструкциями обратитесь к <ulink url="XenMyWay-Routed.html">статье по Xen</ulink>. </para>
</section>
<section id="External">
<title id="tcstart">Применение собственных сценариев tc</title>
<section id="owntcstart">
@ -743,7 +687,7 @@ ppp0 4 90kbit 200kbit 3 default</pro
</orderedlist>
</section>
<section>
<section id="Start">
<title>Управление трафиком, внешнее по отношению к Shorewall</title>
<para>Для того чтобы запустить управление трафиком при поднятии сетевых интерфейсов, необходимо запустить сценарий управления трафиком именно в этот момент. Это зависит от применяемого дистрибутива и здесь не описывается. После этого сделайте следующее:</para>
@ -760,10 +704,9 @@ ppp0 4 90kbit 200kbit 3 default</pro
</section>
</section>
<section>
<section id="Testing">
<title>Инструменты тестирования</title>
<para>Как минимум один пользователь Shorewall посчитал полезными следующие инструменты: <ulink
url="http://e2epi.internet2.edu/network-performance-toolkit.html">http://e2epi.internet2.edu/network-performance-toolkit.html</ulink></para>
<para>Как минимум один пользователь Shorewall посчитал полезными следующие инструменты: <ulink url="http://e2epi.internet2.edu/network-performance-toolkit.html">http://e2epi.internet2.edu/network-performance-toolkit.html</ulink></para>
</section>
</article>