plugins/mod_s2s/s2sout.lib.lua
changeset 7101 5286e79c6829
parent 6920 65344c3bae7a
parent 7095 bee63de49663
child 7564 ab8324d3b899
equal deleted inserted replaced
7093:7aa37d70944b 7101:5286e79c6829
    16 local rfc6724_dest = require "util.rfc6724".destination;
    16 local rfc6724_dest = require "util.rfc6724".destination;
    17 local socket = require "socket";
    17 local socket = require "socket";
    18 local adns = require "net.adns";
    18 local adns = require "net.adns";
    19 local dns = require "net.dns";
    19 local dns = require "net.dns";
    20 local t_insert, t_sort, ipairs = table.insert, table.sort, ipairs;
    20 local t_insert, t_sort, ipairs = table.insert, table.sort, ipairs;
       
    21 local local_addresses = require "util.net".local_addresses;
    21 
    22 
    22 local s2s_destroy_session = require "core.s2smanager".destroy_session;
    23 local s2s_destroy_session = require "core.s2smanager".destroy_session;
    23 
    24 
    24 local log = module._log;
    25 local log = module._log;
    25 
    26 
    26 local anysource = { IPv4 = "0.0.0.0", IPv6 = "::" };
    27 local sources = {};
    27 local function get_sources(addrs)
       
    28 	local sources = {};
       
    29 	for _, IP in ipairs(addrs) do
       
    30 		local sock;
       
    31 		if IP.proto == "IPv4" then
       
    32 			sock = socket.udp();
       
    33 		elseif IP.proto == "IPv6" then
       
    34 			sock = socket.udp6();
       
    35 		end
       
    36 		sock:setpeername(IP.addr, 9);
       
    37 		local localaddr = sock:getsockname() or anysource[IP.proto];
       
    38 		sock:close();
       
    39 		if not sources[localaddr] then
       
    40 			sources[localaddr] = true;
       
    41 			t_insert(sources, new_ip(localaddr, IP.proto));
       
    42 		end
       
    43 	end
       
    44 	return sources;
       
    45 end
       
    46 local has_ipv4, has_ipv6;
    28 local has_ipv4, has_ipv6;
    47 
    29 
    48 local dns_timeout = module:get_option_number("dns_timeout", 15);
    30 local dns_timeout = module:get_option_number("dns_timeout", 15);
    49 dns.settimeout(dns_timeout);
    31 dns.settimeout(dns_timeout);
    50 
    32 
   194 					end
   176 					end
   195 				end
   177 				end
   196 
   178 
   197 				if have_other_result then
   179 				if have_other_result then
   198 					if #IPs > 0 then
   180 					if #IPs > 0 then
   199 						rfc6724_dest(host_session.ip_hosts, get_sources(host_session.ip_hosts));
   181 						rfc6724_dest(host_session.ip_hosts, sources);
   200 						for i = 1, #IPs do
   182 						for i = 1, #IPs do
   201 							IPs[i] = {ip = IPs[i], port = connect_port};
   183 							IPs[i] = {ip = IPs[i], port = connect_port};
   202 						end
   184 						end
   203 						host_session.ip_choice = 0;
   185 						host_session.ip_choice = 0;
   204 						s2sout.try_next_ip(host_session);
   186 						s2sout.try_next_ip(host_session);
   230 					end
   212 					end
   231 				end
   213 				end
   232 
   214 
   233 				if have_other_result then
   215 				if have_other_result then
   234 					if #IPs > 0 then
   216 					if #IPs > 0 then
   235 						rfc6724_dest(host_session.ip_hosts, get_sources(host_session.ip_hosts));
   217 						rfc6724_dest(host_session.ip_hosts, sources);
   236 						for i = 1, #IPs do
   218 						for i = 1, #IPs do
   237 							IPs[i] = {ip = IPs[i], port = connect_port};
   219 							IPs[i] = {ip = IPs[i], port = connect_port};
   238 						end
   220 						end
   239 						host_session.ip_choice = 0;
   221 						host_session.ip_choice = 0;
   240 						s2sout.try_next_ip(host_session);
   222 						s2sout.try_next_ip(host_session);
   318 	if not s2s_sources then
   300 	if not s2s_sources then
   319 		module:log("warn", "s2s not listening on any ports, outgoing connections may fail");
   301 		module:log("warn", "s2s not listening on any ports, outgoing connections may fail");
   320 		return;
   302 		return;
   321 	end
   303 	end
   322 	for source, _ in pairs(s2s_sources) do
   304 	for source, _ in pairs(s2s_sources) do
   323 		if source:find(":") then
   305 		if source == "*" or source == "0.0.0.0" then
       
   306 			for _, addr in ipairs(local_addresses("ipv4", true)) do
       
   307 				sources[#sources + 1] = new_ip(addr, "IPv4");
       
   308 			end
       
   309 		elseif source == "::" then
       
   310 			for _, addr in ipairs(local_addresses("ipv6", true)) do
       
   311 				sources[#sources + 1] = new_ip(addr, "IPv6");
       
   312 			end
       
   313 		else
       
   314 			sources[#sources + 1] = new_ip(source, (source:find(":") and "IPv6") or "IPv4");
       
   315 		end
       
   316 	end
       
   317 	for i = 1,#sources do
       
   318 		if sources[i].proto == "IPv6" then
   324 			has_ipv6 = true;
   319 			has_ipv6 = true;
   325 		else
   320 		elseif sources[i].proto == "IPv4" then
   326 			has_ipv4 = true;
   321 			has_ipv4 = true;
   327 		end
   322 		end
   328 	end
   323 	end
       
   324 	if not (has_ipv4 or has_ipv6)  then
       
   325 		module:log("warn", "No local IPv4 or IPv6 addresses detected, outgoing connections may fail");
       
   326 	end
   329 end);
   327 end);
   330 
   328 
   331 return s2sout;
   329 return s2sout;