On Tue, Jul 10, 2018 at 12:39:54PM +0200, Máté Eckl wrote: > On Mon, Jul 09, 2018 at 05:40:38PM +0200, Pablo Neira Ayuso wrote: > > Hi Máté, > > > > On Thu, Jun 28, 2018 at 06:42:58PM +0200, Máté Eckl wrote: > > > v2: > > > - address or port is now compulsory > > > - nf_defrag_ipv{4,6}_enable called in init > > > - nft_tproxy now selects NF_DEFRAG_IPV4/6 > > > - Add transport header presence test in ipv4 eval (in ipv6 it was > > > already present) > > > - Add check for the case when address is specified but the rule family > > > is not set accordingly > > > > > > -- 8< -- > > > A great portion of the code is taken from xt_TPROXY.c > > > > > > There are some changes compared to the iptables implementation: > > > - tproxy statement is not terminal here > > > > Looks good to me, thanks. > > I don't know how this works yet, but this code will fail to compile once > 'netfilter: nf_tproxy: fix possible non-linear access to transport header' patch > is merged from the nf tree. OK, then we need to wait to propagate that patch to nf-next.git > Also based on the '[PATCH] netfilter: NFT_SOCKET don't use NF_SOCKET_IPV6 > without NF_TABLES_IPV6' thread I might need to change the IS_ENABLED macros to > NF_TABLES_IPV6 in a next version of the patch. Will reply to this in the corresponding thread. > I'll have to change one anyways. So please wait for v4 patch before applying. > > > Please, could you describe how you have tested the nft tproxy > > datapath? Did you run any example configuration to make sure things > > are working? If so, please slightly describe. > > > > Thanks. > > I used the tcprdr [2] as a proxy software at point X, netcat (OpenBSD version > that can handle IPv6) as a server at point Z, and telnet as a clinet at point Y. > See the topology at [1]. > > The config of X was the following: > # ip rule add fwmark 1 lookup 100 > # ip route add local 0.0.0.0/0 dev lo table 100 > # ip -6 rule add fwmark 1 lookup 100 > # ip -6 route add local ::/0 dev lo table 100 > # nft -f testrules > > # cat testrules > table inet x { > chain y { > type filter hook prerouting priority -150; policy accept; > meta l4proto tcp socket transparent 1 mark set 0x00000001 accept > tcp dport http tproxy to :50080 mark set 0x00000001 accept > } > } > > # ./tcprdr -4 -t -T 50080 192.0.2.130 80 > and for ipv6 > # ./tcprdr -6 -t -T 50080 2001:db8:0:1::2 80 > > Commands on Z: > # nc -l -p 80 > and for ipv6 > # nc -6 -l -p 80 > Z also had routes to Y via X. > > Commands on Y: > # telnet 192.0.2.3 80 > # telnet 2001:db8:0:0::3 80 > > I also tried how it works when tproxy target address is specified (tcprdr -L can > be used for it) and protocol-specific cases too. > > Proof at point X: > # ss -tpn > State Recv-Q Send-Q Local Address:Port Peer Address:Port > ESTAB 0 0 192.0.2.3:22 192.0.2.1:45006 users:(("sshd",pid=452,fd=3)) > ESTAB 0 0 [2001:db8::3]:80 [2001:db8::1]:51900 users:(("tcprdr",pid=534,fd=4)) > ESTAB 0 0 [2001:db8::1]:51900 [2001:db8:0:1::2]:80 users:(("tcprdr",pid=534,fd=5)) > > > > Regarding the code, I added some checks to during the debugging which could > occur with a non-nft frontend, but now they are checked. > > [1]: > IPv4: > +---+ .129 .130 +---+ > (proxy) | X |--------------------| Z | (server) > +---+ 192.0.2.128/25 +---+ > | .3 > | > | 192.0.2.0/25 > | > | .1 > +---+ > | Y | (client) > +---+ > > IPv6: > +---+ :1 :2 +---+ > (proxy) | X |--------------------| Z | (server) > +---+ 2001:db8:0:1::/64 +---+ > | :3 > | > | 2001:db8:0:0::/64 > | > | :1 > +---+ > | Y | (client) > +---+ > > X and Z are VirtualBox VMs > > [2]: https://git.breakpoint.cc/cgit/fw/tcprdr.git/ Thanks for explaining. Good to know about this example BTW. Probably we can add this TPROXY demo somewhere in the netfilter tree, this is something that has been always missing. I know of other examples on the Internet, but one from Florian would be definitely better. Florian, do you think it's worth placing this somewhere at netfilter.org? Thanks. -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html