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