So looks like nftables is my only choice then?

On Friday, March 15, 2019 at 10:30:28 PM UTC+8, Andrei Tudor Călin wrote:
>
> That sounds like something a firewall would do, not your Go program. 
>
> On 3/15/19 3:14 PM, Glen Huang wrote: 
> > Thanks, but if I'm not wrong, that means the three-way handshake has to 
> > complete before I can reject a client? Anyway I can reject them at SYN? 
> > 
> > On Friday, March 15, 2019 at 10:07:57 PM UTC+8, Andrei Tudor Călin 
> wrote: 
> >> 
> >> Here is a rough sketch: 
> >> 
> >> type allowedIPsListener struct { 
> >>         allowed []net.IP 
> >>         inner   net.Listener 
> >> } 
> >> 
> >> func (ln *allowedIPsListener) Accept() (net.Conn, error) { 
> >>         for { 
> >>                 conn, err := ln.inner.Accept() 
> >>                 if err != nil { 
> >>                         return nil, err 
> >>                 } 
> >>                 if !ln.allowed(conn.RemoteAddr()) { 
> >>                         conn.Close() 
> >>                         continue 
> >>                 } 
> >>                 return conn, nil 
> >>         } 
> >> } 
> >> 
> >> func (ln *allowedIPsListener) Close() error { 
> >>         return ln.inner.Close() 
> >> } 
> >> 
> >> func (ln *allowedIPsListener) Addr() net.Addr { 
> >>         return ln.inner.Addr() 
> >> } 
> >> 
> >> func (ln *allowedIPsListener) allowed(addr net.Addr) bool { 
> >>         // TODO: implement 
> >>         return true 
> >> } 
> >> 
> >> Then, to use: 
> >> 
> >> ln, err := net.Listen("tcp", addr) 
> >> if err != nil { 
> >>         log.Fatal(err) 
> >> } 
> >> aln := &allowedIPsListener{allowed: yourListOfIPs, inner: ln} 
> >> tlsln := tls.NewListener(aln, yourTLSConfig) 
> >> 
> >> // use tlsln 
> >> 
> >> On 3/15/19 2:58 PM, Glen Huang wrote: 
> >>> Thanks for the quick reply. 
> >>> 
> >>> I want to use tcp, is it possible to leverage TCPListener or I have to 
> >>> invent my own? It seems I'll face the same issue as I do with tls? 
> >>> 
> >>> On Friday, March 15, 2019 at 9:46:00 PM UTC+8, Andrei Tudor Călin 
> wrote: 
> >>>> 
> >>>> Begin by implementing a `net.Listener` which checks the list of 
> allowed 
> >>>> IPs. 
> >>>> You'll be able to run code before the connection is passed on to 
> >>>> crypto/tls. 
> >>>> Wrap it using https://golang.org/pkg/crypto/tls/#NewListener. 
> >>>> 
> >>>> On 3/15/19 2:10 PM, Glen Huang wrote: 
> >>>>> I'm trying to limit which clients are allowed to connect to my tls 
> >>>> server 
> >>>>> by their IPs. 
> >>>>> 
> >>>>> I know I can do that after Accept, check their IPs and close the 
> >>>> connection 
> >>>>> if they're not whitelisted. But that means the full tls handshake 
> has 
> >> to 
> >>>>> complete before I can do that. 
> >>>>> 
> >>>>> Another option is that I can use nftables to whitelist clients at 
> the 
> >>>>> kernel level. But to do that, I either have to spawn a subprocess to 
> >>>> call 
> >>>>> nft, which is kinda slow or use google/nftables that isn't 
> production 
> >>>> ready 
> >>>>> yet (also missing some features I need). 
> >>>>> 
> >>>>> Is there anyway I can drop the tls connection when a client sends 
> SYN? 
> >>>>> 
> >>>>> Thanks in advance. 
> >>>>> 
> >>>> 
> >>>> -- 
> >>>> Andrei Tudor Călin 
> >>>> 
> >>> 
> >> 
> >> -- 
> >> Andrei Tudor Călin 
> >> 
> > 
>
> -- 
> Andrei Tudor Călin 
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to