bugzilla-daemon at bugzilla.netfilter.org
2009-Apr-01  13:58 UTC
[Bug 589] New: MARK doesn't work properly with incoming traffic
http://bugzilla.netfilter.org/show_bug.cgi?id=589
           Summary: MARK doesn't work properly with incoming traffic
           Product: iptables
           Version: unspecified
          Platform: i386
        OS/Version: Ubuntu
            Status: NEW
          Severity: major
          Priority: P1
         Component: iptables
        AssignedTo: laforge at netfilter.org
        ReportedBy: javier.galvez.guerrero at gmail.com
I want to choose which network interface (between 2 WiFi NICs) to be the
'active' one, so I'm trying to manage it with ip rules, ip routes
and iptables.
What I do is to mark outgoing packets so I can manage which routing table will
be selected. What I've noted is that I also need to manage the response of
this
traffic (such as ACK packets), so I need to mark the incoming traffic according
to the outgoing rules (i.e. redirecting the traffic to the same route tables).
The results show that if I use the TOS target I can properly send and receive
traffic through the network I want, while using the MARK target (the one I'm
really interested) only the outgoing traffic is correctly managed, so the
incoming packets are never received by the local process.
These are the scripts I use to change the ip route tables, ip rules and
iptables rules:
-----------------------------------------------------------------
------------------TOS--------------------------------------------
-----------------------------------------------------------------
#!/bin/sh
task=0
intf=0
show_rules=0
args=$#
# Check for arguments
if test $args -eq 0
then
        task=usage
elif test $args -eq 1
then
        if test $1 = clear
        then
                task=clear
        else
                task=usage
        fi
elif test $args -eq 2
then
        if test $1 = start
        then
                if test $args -eq 2
                then
                        if test $2 = ra0
                        then
                                task=start
                                intf=ra0
                        elif test $2 = ra1
                        then
                                task=start
                                intf=ra1
                        else
                                task=usage
                        fi
                else
                        task=usage
                fi
        elif test $1 = switch
        then
                if test $args -eq 2
                then
                        if test $2 = ra0
                        then
                                task=switch
                                intf=ra0
                        elif test $2 = ra1
                        then
                                task=switch
                                intf=ra1
                        else
                                task=usage
                        fi
                else
                        task=usage
                fi
        elif test $1 = stop
        then
                if test $args -eq 2
                then
                        if test $2 = ra0
                        then
                                task=stop
                                intf=ra0
                        elif test $2 = ra1
                        then
                                task=stop
                                intf=ra1
                        else
                                task=usage
                        fi
                else
                        task=usage
                fi
        else
                task=usage
        fi
fi
if test $task = clear 
then
        sudo ip route flush table 1
        sudo ip route flush table 2
        sudo ip rule del prio 1
        sudo ip rule del prio 1
        sudo iptables -F OUTPUT -t mangle
        sudo iptables -F PREROUTING -t mangle
        sudo iptables -F POSTROUTING -t nat
elif test $task = start
then
        sudo ip route flush table 1
        sudo ip route flush table 2
        sudo ip rule del prio 1
        sudo ip rule del prio 1
        sudo iptables -F OUTPUT -t mangle
        sudo iptables -F POSTROUTING -t nat
        sudo ip rule add from all tos 0x10 table 1 prio 1
        sudo ip rule add from all tos 0x04 table 2 prio 1
        if test $intf = ra0
        then
                sudo ifconfig ra0 up 192.168.0.2/24 netmask 255.255.255.0
                sudo iwconfig ra0 essid mobiptv1
                sudo ifconfig ra1 up
                sudo iptables -t nat -A POSTROUTING -p tcp --dport 8554 -j SNAT
--to-source 192.168.0.2
                sudo iptables -A OUTPUT -t mangle -p tcp --dport 8554 -j TOS
--set-tos 0x10
                sudo iptables -A PREROUTING -t mangle -s 147.83.47.178 -j TOS
--set-tos 0x10
                sudo ip route add default via 192.168.0.1 dev ra0
                sudo ip route add table 1 192.168.0.0/24 dev ra0
                sudo ip route add table 1 default via 192.168.0.1 dev ra0
        elif test $intf = ra1
        then
                sudo ifconfig ra0 up
                sudo ifconfig ra1 up 192.168.1.2/24 netmask 255.255.255.0
                sudo iwconfig ra1 essid mobiptv2
                sudo iptables -t nat -A POSTROUTING -p tcp --dport 8554 -j SNAT
--to-source 192.168.1.2
                sudo iptables -A OUTPUT -t mangle -p tcp --dport 8554 -j TOS
--set-tos 0x04
                sudo iptables -A PREROUTING -t mangle -s 147.83.47.178 -j TOS
--set-tos 0x04
                sudo ip route add default via 192.168.1.1 dev ra1
                sudo ip route add table 2 192.168.1.0/24 dev ra1
                sudo ip route add table 2 default via 192.168.1.1 dev ra1
        fi
elif test $task = switch
then
        if test $intf = ra0
        then
                sudo ifconfig ra0 up 192.168.0.2/24 netmask 255.255.255.0
                sudo iwconfig ra0 essid mobiptv1
                sudo iptables -t nat -R POSTROUTING 1 -p tcp --dport 8554 -j
SNAT --to-source 192.168.0.2
                sudo iptables -R OUTPUT 1 -t mangle -p tcp --dport 8554 -j TOS
--set-tos 0x10
                sudo iptables -R PREROUTING 1 -t mangle -s 147.83.47.178 -j TOS
--set-tos 0x10
                sudo ip route add default via 192.168.0.1 dev ra0
                sudo ip route add table 1 192.168.0.0/24 dev ra0
                sudo ip route add table 1 default via 192.168.0.1 dev ra0
        elif test $intf = ra1
        then
                sudo ifconfig ra1 up 192.168.1.2/24 netmask 255.255.255.0
                sudo iwconfig ra1 essid mobiptv2
                sudo iptables -t nat -R POSTROUTING 1 -p tcp --dport 8554 -j
SNAT --to-source 192.168.1.2
                sudo iptables -R OUTPUT 1 -t mangle -p tcp --dport 8554 -j TOS
--set-tos 0x04
                sudo iptables -R PREROUTING 1 -t mangle -s 147.83.47.178 -j TOS
--set-tos 0x04
                sudo ip route add default via 192.168.1.1 dev ra1
                sudo ip route add table 2 192.168.1.0/24 dev ra1
                sudo ip route add table 2 default via 192.168.1.1 dev ra1
        fi
elif test $task = stop
then
        if test $intf = ra0
        then
                sudo ifconfig ra0 0.0.0.0
        elif test $intf = ra1
        then
                sudo ifconfig ra1 0.0.0.0
        fi
elif test $task = usage
then
        echo Wrong parameters
        echo Usage: $0 [clear/start/switch/stop] [ra0/ra1]
fi
exit
# Show routing setup
if test $show_rules -eq 1 
then
        sudo ip rule show
        sudo ip route show table 1
        sudo ip route show table 2
        sudo iptables --list -t mangle
        sudo iptables --list -t nat 
fi
----------------------------------------------------------------
-----------------------MARK-------------------------------------
----------------------------------------------------------------
#!/bin/sh
task=0
intf=0
show_rules=0
args=$#
# Check for arguments
if test $args -eq 0
then
        task=usage
elif test $args -eq 1
then
        if test $1 = clear
        then
                task=clear
        else
                task=usage
        fi
elif test $args -eq 2
then
        if test $1 = start
        then
                if test $args -eq 2
                then
                        if test $2 = ra0
                        then
                                task=start
                                intf=ra0
                        elif test $2 = ra1
                        then
                                task=start
                                intf=ra1
                        else
                                task=usage
                        fi
                else
                        task=usage
                fi
        elif test $1 = switch
        then
                if test $args -eq 2
                then
                        if test $2 = ra0
                        then
                                task=switch
                                intf=ra0
                        elif test $2 = ra1
                        then
                                task=switch
                                intf=ra1
                        else
                                task=usage
                        fi
                else
                        task=usage
                fi
        elif test $1 = stop
        then
                if test $args -eq 2
                then
                        if test $2 = ra0
                        then
                                task=stop
                                intf=ra0
                        elif test $2 = ra1
                        then
                                task=stop
                                intf=ra1
                        else
                                task=usage
                        fi
                else
                        task=usage
                fi
        else
                task=usage
        fi
fi
if test $task = clear 
then
        sudo ip route flush table 1
        sudo ip route flush table 2
        sudo ip rule del prio 1
        sudo ip rule del prio 1
        sudo iptables -F OUTPUT -t mangle
        sudo iptables -F PREROUTING -t mangle
        sudo iptables -F POSTROUTING -t nat
elif test $task = start
then
        sudo ip route flush table 1
        sudo ip route flush table 2
        sudo ip rule del prio 1
        sudo ip rule del prio 1
        sudo iptables -F OUTPUT -t mangle
        sudo iptables -F POSTROUTING -t nat
        sudo ip rule add from all fwmark 1 table 1 prio 1
        sudo ip rule add from all fwmark 2 table 2 prio 1
        if test $intf = ra0
        then
                sudo ifconfig ra0 up 192.168.0.2/24 netmask 255.255.255.0
                sudo iwconfig ra0 essid mobiptv1
                sudo ifconfig ra1 up
                sudo iptables -t nat -A POSTROUTING -p tcp --dport 8554 -j SNAT
--to-source 192.168.0.2
                sudo iptables -A OUTPUT -t mangle -p tcp --dport 8554 -j MARK
--set-mark 1
                sudo iptables -A PREROUTING -t mangle -s 147.83.47.178 -j MARK
--set-mark 1
                sudo ip route add default via 192.168.0.1 dev ra0
                sudo ip route add table 1 192.168.0.0/24 dev ra0
                sudo ip route add table 1 default via 192.168.0.1 dev ra0
        elif test $intf = ra1
        then
                sudo ifconfig ra0 up
                sudo ifconfig ra1 up 192.168.1.2/24 netmask 255.255.255.0
                sudo iwconfig ra1 essid mobiptv2
                sudo iptables -t nat -A POSTROUTING -p tcp --dport 8554 -j SNAT
--to-source 192.168.1.2
                sudo iptables -A OUTPUT -t mangle -p tcp --dport 8554 -j MARK
--set-mark 2
                sudo iptables -A PREROUTING -t mangle -s 147.83.47.178 -j MARK
--set-mark 2
                sudo ip route add default via 192.168.1.1 dev ra1
                sudo ip route add table 2 192.168.1.0/24 dev ra1
                sudo ip route add table 2 default via 192.168.1.1 dev ra1
        fi
elif test $task = switch
then
        if test $intf = ra0
        then
                sudo ifconfig ra0 up 192.168.0.2/24 netmask 255.255.255.0
                sudo iwconfig ra0 essid mobiptv1
                sudo iptables -t nat -R POSTROUTING 1 -p tcp --dport 8554 -j
SNAT --to-source 192.168.0.2
                sudo iptables -R OUTPUT 1 -t mangle -p tcp --dport 8554 -j MARK
--set-mark 1
                sudo iptables -R PREROUTING 1 -t mangle -s 147.83.47.178 -j
MARK --set-mark 1
                sudo ip route add default via 192.168.0.1 dev ra0
                sudo ip route add table 1 192.168.0.0/24 dev ra0
                sudo ip route add table 1 default via 192.168.0.1 dev ra0
        elif test $intf = ra1
        then
                sudo ifconfig ra1 up 192.168.1.2/24 netmask 255.255.255.0
                sudo iwconfig ra1 essid mobiptv2
                sudo iptables -t nat -R POSTROUTING 1 -p tcp --dport 8554 -j
SNAT --to-source 192.168.1.2
                sudo iptables -R OUTPUT 1 -t mangle -p tcp --dport 8554 -j MARK
--set-mark 2
                sudo iptables -R PREROUTING 1 -t mangle -s 147.83.47.178 -j
MARK --set-mark 2
                sudo ip route add default via 192.168.1.1 dev ra1
                sudo ip route add table 2 192.168.1.0/24 dev ra1
                sudo ip route add table 2 default via 192.168.1.1 dev ra1
        fi
elif test $task = stop
then
        if test $intf = ra0
        then
                sudo ifconfig ra0 0.0.0.0
        elif test $intf = ra1
        then
                sudo ifconfig ra1 0.0.0.0
        fi
elif test $task = usage
then
        echo Wrong parameters
        echo Usage: $0 [clear/start/switch/stop] [ra0/ra1]
fi
exit
# Show routing setup
if test $show_rules -eq 1 
then
        sudo ip rule show
        sudo ip route show table 1
        sudo ip route show table 2
        sudo iptables --list -t mangle
        sudo iptables --list -t nat 
fi
As said before, the configuration is all the same except for the use of the
MARK or the TOS targets, and the first seems to fail only with the incoming
traffic (the packets received from the port 8554 are never received in the
local process), while the second works properly.
-- 
Configure bugmail: http://bugzilla.netfilter.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
bugzilla-daemon at bugzilla.netfilter.org
2009-Apr-01  14:00 UTC
[Bug 589] MARK doesn't work properly with incoming traffic
http://bugzilla.netfilter.org/show_bug.cgi?id=589 ------- Comment #1 from javier.galvez.guerrero at gmail.com 2009-04-01 16:00 ------- Created an attachment (id=297) --> (http://bugzilla.netfilter.org/attachment.cgi?id=297&action=view) Routing setup with TOS -- Configure bugmail: http://bugzilla.netfilter.org/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the assignee for the bug, or are watching the assignee.
bugzilla-daemon at bugzilla.netfilter.org
2009-Apr-01  14:00 UTC
[Bug 589] MARK doesn't work properly with incoming traffic
http://bugzilla.netfilter.org/show_bug.cgi?id=589 ------- Comment #2 from javier.galvez.guerrero at gmail.com 2009-04-01 16:00 ------- Created an attachment (id=298) --> (http://bugzilla.netfilter.org/attachment.cgi?id=298&action=view) Routing setup with MARK -- Configure bugmail: http://bugzilla.netfilter.org/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the assignee for the bug, or are watching the assignee.
bugzilla-daemon at bugzilla.netfilter.org
2009-Apr-01  14:01 UTC
[Bug 589] MARK doesn't work properly with incoming traffic
http://bugzilla.netfilter.org/show_bug.cgi?id=589 ------- Comment #3 from javier.galvez.guerrero at gmail.com 2009-04-01 16:01 ------- BTW, I'm using the 1.4.0 built-in iptables version of Ubuntu 8.10. -- Configure bugmail: http://bugzilla.netfilter.org/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the assignee for the bug, or are watching the assignee.
bugzilla-daemon at bugzilla.netfilter.org
2009-Apr-05  11:48 UTC
[Bug 589] MARK doesn't work properly with incoming traffic
http://bugzilla.netfilter.org/show_bug.cgi?id=589 ------- Comment #4 from jengelh at medozas.de 2009-04-05 13:48 ------- There are lots of pitfalls in your script, some of them are shell script-related, others use-based, e.g. the SNAT rule is run rather unconditionally without an interface, and such use is prone to stuck connections. (How many more invocations of sudo do you need, eh?) -- Configure bugmail: http://bugzilla.netfilter.org/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the assignee for the bug, or are watching the assignee.
bugzilla-daemon at bugzilla.netfilter.org
2009-Apr-05  20:50 UTC
[Bug 589] MARK doesn't work properly with incoming traffic
http://bugzilla.netfilter.org/show_bug.cgi?id=589 ------- Comment #5 from javier.galvez.guerrero at gmail.com 2009-04-05 22:50 ------- (In reply to comment #4)> There are lots of pitfalls in your script, some of them are shell > script-related, others use-based, e.g. the SNAT rule is run rather > unconditionally without an interface, and such use is prone to stuck > connections. > > (How many more invocations of sudo do you need, eh?) >So, do you think the SNAT issue is related to the bug? How would you use the SNAT target in this case? -- Configure bugmail: http://bugzilla.netfilter.org/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the assignee for the bug, or are watching the assignee.
bugzilla-daemon at bugzilla.netfilter.org
2009-Apr-09  13:59 UTC
[Bug 589] MARK doesn't work properly with incoming traffic
http://bugzilla.netfilter.org/show_bug.cgi?id=589
jengelh at medozas.de changed:
           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|laforge at netfilter.org       |jengelh at medozas.de
------- Comment #6 from jengelh at medozas.de  2009-04-09 15:59 -------
Ideally SNAT is used together with the -o option to limit it to a given
interface, otherwise you will be NATing all outgoing connections with the same
address. But since you are in two different networks this would mean that you
are using a mismatching address for at least one network.
-- 
Configure bugmail: http://bugzilla.netfilter.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
You are the assignee for the bug, or are watching the assignee.