1 #ifndef _NF_TPROXY_H_ 2 #define _NF_TPROXY_H_ 3 4 #include <net/tcp.h> 5 6 enum nf_tproxy_lookup_t { 7 NF_TPROXY_LOOKUP_LISTENER, 8 NF_TPROXY_LOOKUP_ESTABLISHED, 9 }; 10 11 static inline bool nf_tproxy_sk_is_transparent(struct sock *sk) 12 { 13 if (inet_sk_transparent(sk)) 14 return true; 15 16 sock_gen_put(sk); 17 return false; 18 } 19 20 static inline void nf_tproxy_twsk_deschedule_put(struct inet_timewait_sock *tw) 21 { 22 local_bh_disable(); 23 inet_twsk_deschedule_put(tw); 24 local_bh_enable(); 25 } 26 27 /* assign a socket to the skb -- consumes sk */ 28 static inline void nf_tproxy_assign_sock(struct sk_buff *skb, struct sock *sk) 29 { 30 skb_orphan(skb); 31 skb->sk = sk; 32 skb->destructor = sock_edemux; 33 } 34 35 __be32 nf_tproxy_laddr4(struct sk_buff *skb, __be32 user_laddr, __be32 daddr); 36 37 /** 38 * nf_tproxy_handle_time_wait4 - handle IPv4 TCP TIME_WAIT reopen redirections 39 * @net: The network namespace. 40 * @skb: The skb being processed. 41 * @laddr: IPv4 address to redirect to or zero. 42 * @lport: TCP port to redirect to or zero. 43 * @sk: The TIME_WAIT TCP socket found by the lookup. 44 * 45 * We have to handle SYN packets arriving to TIME_WAIT sockets 46 * differently: instead of reopening the connection we should rather 47 * redirect the new connection to the proxy if there's a listener 48 * socket present. 49 * 50 * nf_tproxy_handle_time_wait4() consumes the socket reference passed in. 51 * 52 * Returns: the listener socket if there's one, the TIME_WAIT socket if 53 * no such listener is found, or NULL if the TCP header is incomplete. 54 */ 55 struct sock * 56 nf_tproxy_handle_time_wait4(struct net *net, struct sk_buff *skb, 57 __be32 laddr, __be16 lport, struct sock *sk); 58 59 /* 60 * This is used when the user wants to intercept a connection matching 61 * an explicit iptables rule. In this case the sockets are assumed 62 * matching in preference order: 63 * 64 * - match: if there's a fully established connection matching the 65 * _packet_ tuple, it is returned, assuming the redirection 66 * already took place and we process a packet belonging to an 67 * established connection 68 * 69 * - match: if there's a listening socket matching the redirection 70 * (e.g. on-port & on-ip of the connection), it is returned, 71 * regardless if it was bound to 0.0.0.0 or an explicit 72 * address. The reasoning is that if there's an explicit rule, it 73 * does not really matter if the listener is bound to an interface 74 * or to 0. The user already stated that he wants redirection 75 * (since he added the rule). 76 * 77 * Please note that there's an overlap between what a TPROXY target 78 * and a socket match will match. Normally if you have both rules the 79 * "socket" match will be the first one, effectively all packets 80 * belonging to established connections going through that one. 81 */ 82 struct sock * 83 nf_tproxy_get_sock_v4(struct net *net, struct sk_buff *skb, 84 const u8 protocol, 85 const __be32 saddr, const __be32 daddr, 86 const __be16 sport, const __be16 dport, 87 const struct net_device *in, 88 const enum nf_tproxy_lookup_t lookup_type); 89 90 const struct in6_addr * 91 nf_tproxy_laddr6(struct sk_buff *skb, const struct in6_addr *user_laddr, 92 const struct in6_addr *daddr); 93 94 /** 95 * nf_tproxy_handle_time_wait6 - handle IPv6 TCP TIME_WAIT reopen redirections 96 * @skb: The skb being processed. 97 * @tproto: Transport protocol. 98 * @thoff: Transport protocol header offset. 99 * @net: Network namespace. 100 * @laddr: IPv6 address to redirect to. 101 * @lport: TCP port to redirect to or zero. 102 * @sk: The TIME_WAIT TCP socket found by the lookup. 103 * 104 * We have to handle SYN packets arriving to TIME_WAIT sockets 105 * differently: instead of reopening the connection we should rather 106 * redirect the new connection to the proxy if there's a listener 107 * socket present. 108 * 109 * nf_tproxy_handle_time_wait6() consumes the socket reference passed in. 110 * 111 * Returns: the listener socket if there's one, the TIME_WAIT socket if 112 * no such listener is found, or NULL if the TCP header is incomplete. 113 */ 114 struct sock * 115 nf_tproxy_handle_time_wait6(struct sk_buff *skb, int tproto, int thoff, 116 struct net *net, 117 const struct in6_addr *laddr, 118 const __be16 lport, 119 struct sock *sk); 120 121 struct sock * 122 nf_tproxy_get_sock_v6(struct net *net, struct sk_buff *skb, int thoff, 123 const u8 protocol, 124 const struct in6_addr *saddr, const struct in6_addr *daddr, 125 const __be16 sport, const __be16 dport, 126 const struct net_device *in, 127 const enum nf_tproxy_lookup_t lookup_type); 128 129 #endif /* _NF_TPROXY_H_ */ 130