Am 12.11.17 um 10:32 schrieb Antonio Quartulli:
> Hi,
> 
> On 12/11/17 00:07, Arne Schwabe wrote:
>> This can be used to redirect all IPv6 traffic to the tun interface, 
>> effectively black holing the IPv6 traffic. Without ICMPv6 error messages 
>> this will result in timeouts when the server does not send error codes.
>> block-ipv6 allows client side only blocking on all platforms that OpenVPN 
>> supports IPv6. On Android it is only way to do sensible IPv6 blocking on 
>> Android < 5.0 and broken devices (Samsung).
>> ---
>>  doc/openvpn.8         |  17 +++++
>>  src/openvpn/forward.c | 170 
>> ++++++++++++++++++++++++++++++++++++++++++++++++--
>>  src/openvpn/forward.h |   3 +-
>>  src/openvpn/misc.c    |   4 +-
>>  src/openvpn/options.c |  17 +++++
>>  src/openvpn/options.h |   1 +
>>  src/openvpn/proto.h   |  19 ++++++
>>  7 files changed, 224 insertions(+), 7 deletions(-)
>>
>> diff --git a/doc/openvpn.8 b/doc/openvpn.8
>> index a4189ac2..26b5f7de 100644
>> --- a/doc/openvpn.8
>> +++ b/doc/openvpn.8
>> @@ -1232,6 +1232,23 @@ Like \-\-redirect\-gateway, but omit actually 
>> changing the default
>>  gateway.  Useful when pushing private subnets.
>>  .\"*********************************************************
>>  .TP
>> +.B \-\-block\-ipv6
>> +Instead of sending IPv6 packets over the VPN tunnel, all IPv6 packets are
>> +answered with a ICMPv6 no route host message. This options is intended for
>> +cases when IPv6 should be blocked and other options are not available.
>> +
>> +Following config block would send all IPv6 traffic to OpenVPN and answer all
>> +requests with no route to host, effectively blocking IPv6.
>> +
>> +.B \-\-ifconfig-ipv6
>> +fd15:53b6:dead::2/64  fd15:53b6:dead::1
>> +.br
>> +.B \-\-redirect\-gateway
>> +ipv6
>> +.br
>> +.B \-\-block\-ipv6
>> +.\"*********************************************************
>> +.TP
>>  .B \-\-tun\-mtu n
>>  Take the TUN device MTU to be
>>  .B n
>> diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c
>> index 1b7455bb..21cce90b 100644
>> --- a/src/openvpn/forward.c
>> +++ b/src/openvpn/forward.c
>> @@ -1198,7 +1198,7 @@ process_incoming_tun(struct context *c)
>>           * The --passtos and --mssfix options require
>>           * us to examine the IP header (IPv4 or IPv6).
>>           */
>> -        process_ip_header(c, PIPV4_PASSTOS|PIP_MSSFIX|PIPV4_CLIENT_NAT, 
>> &c->c2.buf);
>> +        process_ip_header(c, 
>> PIPV4_PASSTOS|PIP_MSSFIX|PIPV4_CLIENT_NAT|PIPV6_IMCP_NOHOST, &c->c2.buf);
>>  
>>  #ifdef PACKET_TRUNCATION_CHECK
>>          /* if (c->c2.buf.len > 1) --c->c2.buf.len; */
>> @@ -1209,6 +1209,9 @@ process_incoming_tun(struct context *c)
>>                                  &c->c2.n_trunc_pre_encrypt);
>>  #endif
>>  
>> +    }
>> +    if (c->c2.buf.len > 0)
>> +    {
>>          encrypt_sign(c, true);
>>      }
> 
> I might not have a full understanding of this chunk: but could you
> explain how this is related to this patch?

It is similar to what check_ping_send_dowork does. Since you create a
new packet that goes out that is in the buf, it needs to be encryped and
signed.


>> +
>> +    /* IPv6 Header */
>> +    ASSERT(buf_write_prepend(&c->c2.to_tun, &pip6out, sizeof(struct 
>> openvpn_ipv6hdr)));
>> +
> 
> I see lots of asserts here and in other functions below.
> 
> Is it possible that a bridged/routed client could send a malformed IPv6
> packet to convert this ASSERTs into a DoS for the VPN client?

No, should not be, it is basically only to make sure the buf functions
return true.

> 
> Actually, any chance that this function is executed on the server? or is
> this impossible?
I will test, should be possible.

Arne




------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to