On 10/15/20 10:13 PM, Aki Tuomi wrote:
>> I'm asking how/where to 'tell', via config, Dovecot's smtp-CLIENT, that's 
>> making to connection to the submission_relay_host, to use _only_ IPv4.
> 
> There is currently no (other) way to do this than using /etc/hosts or 
> specifying IPv4 address for the relay host.

just a quick look, but looks like the culprit here is the submission code call 
to "net_addr2ip()"

        src/submission/main.c (c)                                               
                                                                                
                                                      
                        ...
193                     static void main_stdio_run(const char *username)
                        {
                                struct mail_storage_service_input input;
                                buffer_t *input_buf;
                                const char *value, *error, *input_base64;

                                i_zero(&input);
                                input.module = input.service = "submission";
                                input.username = username != NULL ? username : 
getenv("USER");
                                if (input.username == NULL && IS_STANDALONE())
                                        input.username = getlogin();
                                if (input.username == NULL)
                                        i_fatal("USER environment missing");
                                if ((value = getenv("IP")) != NULL)
!!!                                     (void)net_addr2ip(value, 
&input.remote_ip);
                                if ((value = getenv("LOCAL_IP")) != NULL)
                                        (void)net_addr2ip(value, 
&input.local_ip);

                                input_base64 = getenv("CLIENT_INPUT");
                                input_buf = input_base64 == NULL ? NULL :
                                        t_base64_decode_str(input_base64);

                                if (client_create_from_input(&input, 
STDIN_FILENO, STDOUT_FILENO,
                                                                input_buf, 
&error) < 0)
                                        i_fatal("%s", error);
                        }
                        ...


which includes ipv6-first code,

        ./src/lib/net.c
                        ...
932                     int net_addr2ip(const char *addr, struct ip_addr *ip)
                        {
                                int ret;

                                if (net_addr2ip_inet4_fast(addr, ip))
                                        return 0;

                                if (strchr(addr, ':') != NULL) {
!!!                                     /* IPv6 */
                                        T_BEGIN {
                                                if (addr[0] == '[') {
                                                        /* allow [ipv6 addr] */
                                                        size_t len = 
strlen(addr);
                                                        if (addr[len-1] == ']')
                                                                addr = 
t_strndup(addr+1, len-2);
                                                }
                                                ret = inet_pton(AF_INET6, addr, 
&ip->u.ip6);
                                        } T_END;
                                        if (ret == 0)
                                                return -1;
                                        ip->family = AF_INET6;
                                } else {
                                        /* IPv4 */
                                        if (inet_aton(addr, &ip->u.ip4) == 0)
                                                return -1;
                                        ip->family = AF_INET;
                                }
                                return 0;
                        }
                        ...


adding a config param, e.g., 

        submission_relay_ip_family = {any:inet6:inet4}

and wrapping the "src/lib/net.c" stanza, above, in 'if' conditionals based on 
its value
should, iiuc, sufficiently instruct Dovecot to relay-submit over the intended 
AF.

and stop causing the 'failed connect' error noise in logs.

Reply via email to