how to set smtp-client -> submission_relay_host for IPv4 only?

PGNet Dev pgnet.dev at gmail.com
Fri Oct 16 20:32:07 EEST 2020


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.


More information about the dovecot mailing list