Hello.

Thank you very much, Tom.

Just one correction, not related to the patch itself, but to the example
(should anyone be interested).

When you have NAT on the exit interface, upload is also affected and
filters in tcfilters based on source also won't work. My bad.

What would work:

1) Forget the tcfilters file in this case
2) Use MARK in forward chain to control upload and CONNMARK to control
download in /etc/shorewall/mangle file, like so:

#ACTION            SOURCE             DEST        PROTO    DPORT (...)

# limit uploads based on source, since we have NAT on the exit interface,
# tcfilters won't work
MARK(10):F         10.100.100.0/24    enp1s0

# limit downloads of connections started by LAN users to the Internet
# this only works with the aforementioned conntrack filter action when
# setting up mirred ifb, as it restores the connmark to the mark
# and LAN users' download traffic will get the 11:100 class (defined in
# tcclasses) applied
CONNMARK(11):F     10.100.100.0/24    enp1s0


(this, of course, will only fully work in shorewall 5.2.7)

Best regards.


On 08/07/20 15:55, Tom Eastep wrote:
> Hi Rodrigo,
>
> On 7/7/20 12:14 PM, Rodrigo Araujo wrote:
>> Hello.
>>
>> This is more like a pull request. If the users mailing list is not the
>> appropriate, I apologize and please tell me where should I submit it.
> Normally, proposed patches are submitted via the shorewall-devel mailing
> list.
>> One big problem when using ifb (redirected) interfaces for download QoS
>> control and NAT is that you can't usually create tcfilters based on a
>> internal destination address. That's because when packets enter the
>> outside interface, they are redirected to the ifb interface before
>> reverse NAT or any other netfilter hooks.
>>
>> However, fairly recent kernels (at least the one that comes with
>> RHEL/CentOS 7, which has now a few years) have a tc filter action named
>> connmark that helps to create a workaround, but shorewall doesn't
>> support it.
>>
>> Using the following (crude) patch I was able to take advantage of that
>> feature:
>>
>> --- /root/Tc.pm.bkp    2020-07-07 17:26:27.329581191 +0100
>> +++ /usr/lib/perl5/site_perl/Shorewall/Tc.pm    2020-07-07
>> 17:28:14.249592180 +0100
>> @@ -1865,7 +1865,7 @@
>>          for my $rdev ( @{$devref->{redirected}} ) {
>>          my $phyrdev = physical_name( $rdev );
>>          emit ( "run_tc qdisc add dev $phyrdev handle ffff: ingress" );
>> -        emit( "run_tc filter add dev $phyrdev parent ffff: protocol all
>> u32 match u32 0 0 action mirred egress redirect dev $device > /dev/null" );
>> +        emit( "run_tc filter add dev $phyrdev parent ffff: protocol all
>> u32 match u32 0 0 action connmark action mirred egress redirect dev
>> $device > /dev/null" );
>>          }
>>  
>>          for my $class ( @tcclasses ) {
>>
>>
>> Of course this should be optional. My suggestion is to have a new
>> possible OPTION in tcdevices named "connmark", only valid when
>> REDIRECTED INTERFACES is not empty. If present, the mirred filter is
>> generated as above suggested, and if not present it stays as the current
>> behaviour.
>>
>> Perhaps some extra code to determine if the tc filter action connmark is
>> supported and set a new capability would be nice, but since it's already
>> optional and should fail anyway if not supported, I don't think that
>> would be really necessary.Please improve as needed - my proposed patch
>> (against shorewall 5.2.5-2, and already with the option parsing) is
>> attached in this message.
>>
>> A minimal example configuration using this suggested feature follows.
>> For this scenario, there is a single 1 Gbps Internet connection. LAN
>> users shouldn't use more than 50 mbps for upload and 100 for download.
>> The rest should be available to our servers, who can also "borrow"
>> bandwidth from the LAN network when it's not in use.
>> Let's suppose that 10.100.100.0/24 corresponds to the lan network.
>>
>> Shorewall configuration files:
>>
>>
>> /etc/shorewall/zones:
>> #ZONE        TYPE        OPTIONS        IN_OPTIONS    OUT_OPTIONS
>> fw           firewall
>> net          ipv4
>> lan          ipv4        routeback
>> srv         ipv4        routeback
>>
>> /etc/shorewall/interfaces:
>> #ZONE        INTERFACE        OPTIONS
>> net          enp1s0
>> lan          enp2s0
>> srv          enp3s0
>> # our ifb interface, shouldn't be necessary to declare but doesn't hurt
>> -            ifb0
>>
>>
>> /etc/shorewall/policy:
>> #SOURCE    DEST    POLICY        LOGLEVEL    RATE    CONNLIMIT
>> $FW        all     ACCEPT
>> lan        net     ACCEPT
>> srv        net     ACCEPT
>>
>>
>> /etc/shorewall/rules:
>> #ACTION         SOURCE      DEST    PROTO   DPORT   SPORT  
>> ORIGDEST        RATE    USER    MARK    CONNLIMIT       TIME    HEADERS
>> SWITCH  HELPER
>> ?SECTION NEW
>> ACCEPT          lan         $FW     tcp     22
>> (...)
>>
>>
>> /etc/shorewall/snat:
>> #ACTION       SOURCE      DEST    PROTO    PORT        IPSEC    MARK   
>> USER    SWITCH    ORIGDEST    PROBABILITY
>> MASQUERADE    -           enp1s0
>>
>>
>> /etc/shorewall/shorewall.conf:
>> (...)
>> TC_ENABLED=Internal
>>
>>
>> /etc/shorewall/tcdevices:
>> #NUMBER:        IN-BANDWITH     OUT-BANDWIDTH   OPTIONS         REDIRECTED
>> #INTERFACE                                                      INTERFACES
>> ## net upload
>> 10:enp1s0       -               1000mbit         htb
>> ## net download
>> 11:ifb0         -               1000mbit         htb,connmark   enp1s0
>>
>>
>> /etc/shorewall/tcclasses:
>> #INTERFACE        MARK      RATE               CEIL       PRIO    OPTIONS
>>
>> 10:5000           111       500kbit            full       10     
>> tcp-ack,tos-minimize-delay
>> 11:5000           110       500kbit            full       10     
>> tcp-ack,tos-minimize-delay
>>
>> 10:1000           100       full-50500         full       20      default
>> 11:1000           101       full-100500        full       20      default
>>
>> 10:50             10        50mbit             50mbit     101    
>> flow=nfct-src
>> 11:100            11        100mbit            100mbit    101     flow=dst
>>
>>
>> /etc/shorewall/tcfilters:
>> #INTERFACE:    SOURCE         DEST        PROTO    DEST    SOURCE  
>> TOS        LENGTH    PRIORITY
>> #CLASS                                   PORT(S)  PORT(S)
>> ## limit LAN upload - works
>> 10:50          10.100.100.0/24
>> ## limit LAN download - DOESN'T WORK BECAUSE OF MASQUERADE ON enp1s0
>> !!!! (snat file)
>> #11:100        -              10.100.100.0/24
>>
>>
>> /etc/shorewall/mangle:
>> #ACTION            SOURCE             DEST        PROTO    DPORT   
>> SPORT    USER    TEST    LENGTH    TOS    CONNBYTES    HELPER   
>> PROBABILITY    DSCP    SWITCH
>> ## limit downloads of connections started by LAN users to the Internet
>> ## this only works with the aforementioned conntrack filter action when
>> setting up mirred ifb, as it restores the connmark to the mark
>> ## and LAN users' download traffic will get the 11:100 class (defined in
>> tcclasses) applied
>> CONNMARK(11)       10.100.100.0/24    -
> In order for this to work with Shorewall's Multi-ISP facility, you
> probably would want:
>
> CONNMARK(11):T        10.100.100.0/24 { TEST=!0x/0xff }
>
> See below.
>
>>
>> Only problem I see is when using more than one Internet provider, having
>> configured them in the /etc/shorewall/providers. Perhaps in that case
>> one is able to use xmark masks to have the best of both worlds? Any ideas?
> The Shorewall TC code uses the low-order TC_BITS bits of the fwmark and
> masks off the left-most bits. So the fact that the 'connmark' tc filler
> action restores the entire connmark is fine. In the case of multiple
> providers, the provider-generator PREROUTING rules will re-restore the
> provider field from the connection mark into the packet mark.
>
>> Anyway, in hope that you also find this a useful feature... is there any
>> chance that shorewall officially supports this in a near future release? :)
>>
> I'll schedule it for 5.2.7.
>
> Thanks,
>
> -Tom
>
>
> _______________________________________________
> Shorewall-users mailing list
> Shorewall-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/shorewall-users

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Shorewall-users mailing list
Shorewall-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/shorewall-users

Reply via email to