[ 
https://issues.apache.org/jira/browse/HADOOP-20029?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Wei-Chiu Chuang updated HADOOP-20029:
-------------------------------------
        Parent:     (was: HADOOP-11890)
    Issue Type: Bug  (was: Sub-task)

> NFS gateway export rules do not support IPv6 clients or IPv6 entries
> --------------------------------------------------------------------
>
>                 Key: HADOOP-20029
>                 URL: https://issues.apache.org/jira/browse/HADOOP-20029
>             Project: Hadoop Common
>          Issue Type: Bug
>            Reporter: Siyao Meng
>            Assignee: Siyao Meng
>            Priority: Major
>              Labels: ipv6
>
> {{NfsExports}}, which checks {{nfs.exports.allowed.hosts}} for the NFS 
> gateway, only understands IPv4 ("only support IPv4 now"). On trunk:
> [NfsExports.java:69|https://github.com/apache/hadoop/blob/9ede2e95c6fb577d7ae8664833d5e151cbfc47c9/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/NfsExports.java#L69]
> *1. An IPv4 CIDR rule breaks requests from IPv6 clients.* 
> {{CIDRMatch.isIncluded}} calls commons-net {{SubnetInfo.isInRange(address)}} 
> with the client's address. For an IPv6 address commons-net 3.9.0 throws:
> {noformat}
> java.lang.IllegalArgumentException: Could not parse [2001:db8:0:0:0:0:0:10]
> {noformat}
> The exception is not caught in {{getAccessPrivilege}}, so it escapes the 
> MOUNT and NFS3 request handlers ({{RpcProgramMountd.mnt}}, 
> {{RpcProgramNfs3.checkAccessPrivilege}}) and the request gets no reply. This 
> affects dual-stack gateways too, as soon as any IPv4 CIDR rule is configured. 
> The default, {{* rw}}, is not affected.
> *2. IPv6 entries make the whole export list invalid.* An IPv6 address 
> ({{2001:db8::10}}) or CIDR ({{2001:db8::/32}}) matches neither CIDR pattern, 
> has no regex characters, and fails {{HOSTNAME_FORMAT}} because of the colons, 
> so {{getMatch}} throws {{Invalid hostname provided}}. {{getInstance}} logs 
> the error and returns null, and the gateway then denies every client, IPv4 
> included.
> *3. Exact and regex matches see the expanded form.* The client address comes 
> from {{InetAddress.getHostAddress()}}, for example {{2001:db8:0:0:0:0:0:10}}, 
> so an exact entry would need to use that spelling.
> I checked 1 and 2 with commons-net 3.9.0 (the version in 
> {{hadoop-project/pom.xml}}) and the patterns copied from trunk's 
> {{NfsExports}}.
> *Proposed fix:*
> * In {{CIDRMatch}}, return false for an IPv6 client instead of calling 
> {{isInRange}}.
> * Accept IPv6 literals (bare or bracketed) as exact matches, compared by 
> address, not by string.
> * Accept IPv6 CIDR entries with a prefix-bit match. HADOOP-19962 added the 
> same kind of matching to {{MachineList}}, and the code could be shared.
> * Add tests for IPv4 and IPv6 clients against IPv4 and IPv6 rules.
> HDFS-17981 made the gateway's bind address configurable, so it can now listen 
> on IPv6; this issue covers access control.
> POC: 
> https://github.com/smengcl/hadoop/commit/0c318dd55ed0fae55bd8b6fed555f2063afb4225



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to