[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20201105102602.109991-1-desired.mta@gmail.com>
Date: Thu, 5 Nov 2020 12:26:04 +0200
From: Motiejus Jakštys <desired.mta@...il.com>
To: netdev@...r.kernel.org, kuba@...nel.org
Cc: trivial@...nel.org,
Motiejus Jakštys <desired.mta@...il.com>
Subject: [PATCH] Documentation: tproxy: more gentle intro (re-post #2)
Clarify tproxy odcumentation, so it's easier to read/understand without
a-priori in-kernel transparent proxying knowledge.
Remove a reference to linux 2.2 and cosmetic Sphinx changes and address
comments from kuba@.
Sorry for re-posting, I realized I left a gap just after sending.
Signed-off-by: Motiejus Jakštys <desired.mta@...il.com>
---
Documentation/networking/tproxy.rst | 120 +++++++++++++++-------------
1 file changed, 64 insertions(+), 56 deletions(-)
diff --git a/Documentation/networking/tproxy.rst b/Documentation/networking/tproxy.rst
index 00dc3a1a66b4..d2673de0e408 100644
--- a/Documentation/networking/tproxy.rst
+++ b/Documentation/networking/tproxy.rst
@@ -1,42 +1,45 @@
.. SPDX-License-Identifier: GPL-2.0
-=========================
-Transparent proxy support
-=========================
+==========================
+Transparent proxy (TPROXY)
+==========================
-This feature adds Linux 2.2-like transparent proxy support to current kernels.
-To use it, enable the socket match and the TPROXY target in your kernel config.
-You will need policy routing too, so be sure to enable that as well.
+TPROXY enables forwarding and intercepting packets that were destined for other
+endpoints, without using NAT chain or REDIRECT targets.
-From Linux 4.18 transparent proxy support is also available in nf_tables.
+Intercepting non-local packets
+==============================
-1. Making non-local sockets work
-================================
+To identify packets with destination address matching a local socket on your
+box, set the packet mark to a certain value:
-The idea is that you identify packets with destination address matching a local
-socket on your box, set the packet mark to a certain value::
+.. code-block:: sh
- # iptables -t mangle -N DIVERT
- # iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
- # iptables -t mangle -A DIVERT -j MARK --set-mark 1
- # iptables -t mangle -A DIVERT -j ACCEPT
+ iptables -t mangle -N DIVERT
+ iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
+ iptables -t mangle -A DIVERT -j MARK --set-mark 1
+ iptables -t mangle -A DIVERT -j ACCEPT
-Alternatively you can do this in nft with the following commands::
+Alternatively in nft:
- # nft add table filter
- # nft add chain filter divert "{ type filter hook prerouting priority -150; }"
- # nft add rule filter divert meta l4proto tcp socket transparent 1 meta mark set 1 accept
+.. code-block:: sh
-And then match on that value using policy routing to have those packets
-delivered locally::
+ nft add table filter
+ nft add chain filter divert "{ type filter hook prerouting priority -150; }"
+ nft add rule filter divert meta l4proto tcp socket transparent 1 meta mark set 1 accept
- # ip rule add fwmark 1 lookup 100
- # ip route add local 0.0.0.0/0 dev lo table 100
+Then match on that value using policy routing to deliver those packets locally:
-Because of certain restrictions in the IPv4 routing output code you'll have to
-modify your application to allow it to send datagrams _from_ non-local IP
-addresses. All you have to do is enable the (SOL_IP, IP_TRANSPARENT) socket
-option before calling bind::
+.. code-block:: sh
+
+ ip rule add fwmark 1 lookup 100
+ ip route add local 0.0.0.0/0 dev lo table 100
+
+Because of certain restrictions in the IPv4 routing application will need to be
+modified to allow it to send datagrams *from* non-local IP addresses. Enable
+the ``SOL_IP``, ``IP_TRANSPARENT`` socket options before calling ``bind``:
+
+.. code-block:: c
fd = socket(AF_INET, SOCK_STREAM, 0);
/* - 8< -*/
@@ -51,9 +54,22 @@ option before calling bind::
A trivial patch for netcat is available here:
http://people.netfilter.org/hidden/tproxy/netcat-ip_transparent-support.patch
+Kernel configuration
+====================
-2. Redirecting traffic
-======================
+To use tproxy you'll need to have the following modules compiled for iptables:
+
+- ``NETFILTER_XT_MATCH_POLICY``
+- ``NETFILTER_XT_MATCH_SOCKET``
+- ``NETFILTER_XT_TARGET_TPROXY``
+
+For nf_tables:
+
+- ``NFT_TPROXY``
+- ``NFT_SOCKET``
+
+Redirecting traffic
+===================
Transparent proxying often involves "intercepting" traffic on a router. This is
usually done with the iptables REDIRECT target; however, there are serious
@@ -63,47 +79,39 @@ acceptable in certain situations. (Think of proxying UDP for example: you won't
be able to find out the original destination address. Even in case of TCP
getting the original destination address is racy.)
-The 'TPROXY' target provides similar functionality without relying on NAT. Simply
-add rules like this to the iptables ruleset above::
+The ``TPROXY`` target provides similar functionality without relying on NAT.
+Simply add rules like this to the iptables ruleset:
- # iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY \
+.. code-block:: sh
+
+ iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY \
--tproxy-mark 0x1/0x1 --on-port 50080
Or the following rule to nft:
-# nft add rule filter divert tcp dport 80 tproxy to :50080 meta mark set 1 accept
+.. code-block:: sh
+
+ nft add rule filter divert tcp dport 80 tproxy to :50080 meta mark set 1 accept
-Note that for this to work you'll have to modify the proxy to enable (SOL_IP,
-IP_TRANSPARENT) for the listening socket.
+Note that for this to work you'll have to modify the proxy to enable
+(``SOL_IP``, ``IP_TRANSPARENT``) for the listening socket.
As an example implementation, tcprdr is available here:
https://git.breakpoint.cc/cgit/fw/tcprdr.git/
This tool is written by Florian Westphal and it was used for testing during the
nf_tables implementation.
-3. Iptables and nf_tables extensions
-====================================
-
-To use tproxy you'll need to have the following modules compiled for iptables:
-
- - NETFILTER_XT_MATCH_SOCKET
- - NETFILTER_XT_TARGET_TPROXY
-
-Or the floowing modules for nf_tables:
- - NFT_SOCKET
- - NFT_TPROXY
-
-4. Application support
+Application support
======================
-4.1. Squid
-----------
+Squid
+-----
+
+Squid 3.1+ has built-in support for TPROXY. To use it, pass
+``--enable-linux-netfilter`` to configure and set the 'tproxy' option on the
+HTTP listener you redirect traffic to with the TPROXY iptables target.
-Squid 3.HEAD has support built-in. To use it, pass
-'--enable-linux-netfilter' to configure and set the 'tproxy' option on
-the HTTP listener you redirect traffic to with the TPROXY iptables
-target.
+For more information please consult the `Squid wiki`_.
-For more information please consult the following page on the Squid
-wiki: http://wiki.squid-cache.org/Features/Tproxy4
+.. _`Squid wiki`: http://wiki.squid-cache.org/Features/Tproxy4
--
2.28.0
Powered by blists - more mailing lists