1 /* Copyright (c) 2001 Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
5 /* See LICENSE for licensing information */
9 * \brief Relay self-testing
11 * Relays need to make sure that their own ports are reachable, and estimate
12 * their own bandwidth, before publishing.
15 #include "core/or/or.h"
17 #include "app/config/config.h"
19 #include "core/mainloop/connection.h"
20 #include "core/mainloop/mainloop.h"
21 #include "core/mainloop/netstatus.h"
23 #include "core/or/circuitbuild.h"
24 #include "core/or/circuitlist.h"
25 #include "core/or/circuituse.h"
26 #include "core/or/crypt_path_st.h"
27 #include "core/or/extendinfo.h"
28 #include "core/or/extend_info_st.h"
29 #include "core/or/origin_circuit_st.h"
30 #include "core/or/relay.h"
32 #include "feature/control/control_events.h"
34 #include "feature/dirauth/authmode.h"
36 #include "feature/dirclient/dirclient.h"
37 #include "feature/dircommon/directory.h"
39 #include "feature/nodelist/authority_cert_st.h"
40 #include "feature/nodelist/routerinfo.h"
41 #include "feature/nodelist/routerinfo_st.h"
42 #include "feature/nodelist/routerlist.h" // but...
43 #include "feature/nodelist/routerset.h"
44 #include "feature/nodelist/torcert.h"
46 #include "feature/relay/relay_periodic.h"
47 #include "feature/relay/router.h"
48 #include "feature/relay/selftest.h"
50 static bool have_orport_for_family(int family
);
51 static void inform_testing_reachability(const tor_addr_t
*addr
,
54 /** Whether we can reach our IPv4 ORPort from the outside. */
55 static bool can_reach_or_port_ipv4
= false;
56 /** Whether we can reach our IPv6 ORPort from the outside. */
57 static bool can_reach_or_port_ipv6
= false;
59 /** Has informed_testing_reachable logged a message about testing our IPv4
61 static bool have_informed_testing_or_port_ipv4
= false;
62 /** Has informed_testing_reachable logged a message about testing our IPv6
64 static bool have_informed_testing_or_port_ipv6
= false;
66 /** Forget what we have learned about our reachability status. */
68 router_reset_reachability(void)
70 can_reach_or_port_ipv4
= can_reach_or_port_ipv6
= false;
71 have_informed_testing_or_port_ipv4
=
72 have_informed_testing_or_port_ipv6
= false;
75 /** Return 1 if we won't do reachability checks, because:
76 * - AssumeReachable is set, or
77 * - the network is disabled.
78 * Otherwise, return 0.
81 router_reachability_checks_disabled(const or_options_t
*options
)
83 return options
->AssumeReachable
||
87 /** Return 0 if we need to do an ORPort reachability check, because:
88 * - no reachability check has been done yet, or
89 * - we've initiated reachability checks, but none have succeeded.
90 * Return 1 if we don't need to do an ORPort reachability check, because:
91 * - we've seen a successful reachability check, or
92 * - AssumeReachable is set, or
93 * - the network is disabled.
95 * If `family'`is AF_INET or AF_INET6, return true only when we should skip
96 * the given family's orport check (Because it's been checked, or because we
97 * aren't checking it.) If `family` is 0, return true if we can skip _all_
101 router_orport_seems_reachable(const or_options_t
*options
,
104 tor_assert_nonfatal(family
== AF_INET
|| family
== AF_INET6
|| family
== 0);
105 int reach_checks_disabled
= router_reachability_checks_disabled(options
);
106 if (reach_checks_disabled
) {
110 // Note that we do a == 1 here, not just a boolean check. This value
111 // is also an autobool, so CFG_AUTO does not mean that we should
112 // assume IPv6 ports are reachable.
113 const bool ipv6_assume_reachable
= (options
->AssumeReachableIPv6
== 1);
115 // Which reachability flags should we look at?
116 const bool checking_ipv4
= (family
== AF_INET
|| family
== 0);
117 const bool checking_ipv6
= (family
== AF_INET6
|| family
== 0);
120 if (have_orport_for_family(AF_INET
) && !can_reach_or_port_ipv4
) {
124 if (checking_ipv6
&& !ipv6_assume_reachable
) {
125 if (have_orport_for_family(AF_INET6
) && !can_reach_or_port_ipv6
) {
133 /** Relay DirPorts are no longer used (though authorities are). In either case,
134 * reachability self test is done anymore, since network re-entry towards an
135 * authority DirPort is not allowed. Thus, consider it always reachable. */
137 router_dirport_seems_reachable(const or_options_t
*options
)
143 /** See if we currently believe our ORPort to be unreachable. If so, return 1
146 router_should_check_reachability(void)
148 const routerinfo_t
*me
= router_get_my_routerinfo();
149 const or_options_t
*options
= get_options();
154 /* Doesn't check our IPv6 address, see #34065. */
155 if (routerset_contains_router(options
->ExcludeNodes
, me
, -1) &&
156 options
->StrictNodes
) {
157 /* If we've excluded ourself, and StrictNodes is set, we can't test
159 #define SELF_EXCLUDED_WARN_INTERVAL 3600
160 static ratelim_t warning_limit
=RATELIM_INIT(SELF_EXCLUDED_WARN_INTERVAL
);
161 log_fn_ratelim(&warning_limit
, LOG_WARN
, LD_CIRC
,
162 "Can't perform self-tests for this relay: we have "
163 "listed ourself in ExcludeNodes, and StrictNodes is set. "
164 "We cannot learn whether we are usable, and will not "
165 "be able to advertise ourself.");
172 * Return true if we have configured an ORPort for the given family that
173 * we would like to advertise.
175 * Like other self-testing functions, this function looks at our most
176 * recently built descriptor.
179 have_orport_for_family(int family
)
181 const routerinfo_t
*me
= router_get_my_routerinfo();
187 if (router_get_orport(me
, &ap
, family
) < 0) {
193 /** Allocate and return a new extend_info_t that can be used to build
194 * a circuit to or through the router <b>r</b>, using an address from
195 * <b>family</b> (if available).
197 * Clients don't have routerinfos, so this function should only be called on a
200 * If the requested address is not available, returns NULL. */
201 static extend_info_t
*
202 extend_info_from_router(const routerinfo_t
*r
, int family
)
204 crypto_pk_t
*rsa_pubkey
;
212 /* Relays always assume that the first hop is reachable. They ignore
213 * ReachableAddresses. */
214 tor_assert_nonfatal(router_or_conn_should_skip_reachable_address_check(
217 const ed25519_public_key_t
*ed_id_key
;
218 if (r
->cache_info
.signing_key_cert
)
219 ed_id_key
= &r
->cache_info
.signing_key_cert
->signing_key
;
223 if (router_get_orport(r
, &ap
, family
) < 0) {
224 /* We don't have an ORPort for the requested family. */
227 rsa_pubkey
= router_get_rsa_onion_pkey(r
->onion_pkey
, r
->onion_pkey_len
);
228 info
= extend_info_new(r
->nickname
, r
->cache_info
.identity_digest
,
230 rsa_pubkey
, r
->onion_curve25519_pkey
,
232 crypto_pk_free(rsa_pubkey
);
236 /** Launch a self-testing circuit to one of our ORPorts, using an address from
237 * <b>family</b> (if available). The circuit can be used to test reachability
238 * or bandwidth. <b>me</b> is our own routerinfo.
240 * Logs an info-level status message. If <b>orport_reachable</b> is false,
241 * call it a reachability circuit. Otherwise, call it a bandwidth circuit.
243 * See router_do_reachability_checks() for details. */
245 router_do_orport_reachability_checks(const routerinfo_t
*me
,
247 int orport_reachable
)
249 extend_info_t
*ei
= extend_info_from_router(me
, family
);
250 int ipv6_flags
= (family
== AF_INET6
? CIRCLAUNCH_IS_IPV6_SELFTEST
: 0);
252 /* If we're trying to test IPv6, but we don't have an IPv6 ORPort, ei will
255 const char *family_name
= fmt_af_family(family
);
256 const tor_addr_port_t
*ap
= extend_info_get_orport(ei
, family
);
257 log_info(LD_CIRC
, "Testing %s of my %s ORPort: %s.",
258 !orport_reachable
? "reachability" : "bandwidth",
259 family_name
, fmt_addrport_ap(ap
));
261 if (!orport_reachable
) {
262 /* Only log if we are actually doing a reachability test to learn if our
263 * ORPort is reachable. Else, this prints a log notice if we are simply
264 * opening a bandwidth testing circuit even though we are reachable. */
265 inform_testing_reachability(&ap
->addr
, ap
->port
);
268 circuit_launch_by_extend_info(CIRCUIT_PURPOSE_TESTING
, ei
,
269 CIRCLAUNCH_NEED_CAPACITY
|
270 CIRCLAUNCH_IS_INTERNAL
|
272 extend_info_free(ei
);
276 /** Some time has passed, or we just got new directory information. See if we
277 * currently believe our ORPort to be unreachable. If so, launch a new test
280 * For ORPort, we simply try making a circuit that ends at ourselves. Success
281 * is noticed in onionskin_answer().
284 router_do_reachability_checks(void)
286 const routerinfo_t
*me
= router_get_my_routerinfo();
287 const or_options_t
*options
= get_options();
288 int orport_reachable_v4
=
289 router_orport_seems_reachable(options
, AF_INET
);
290 int orport_reachable_v6
=
291 router_orport_seems_reachable(options
, AF_INET6
);
293 if (router_should_check_reachability()) {
294 bool need_testing
= !circuit_enough_testing_circs();
295 /* At the moment, tor relays believe that they are reachable when they
296 * receive any create cell on an inbound connection, if the address
299 if (!orport_reachable_v4
|| need_testing
) {
300 router_do_orport_reachability_checks(me
, AF_INET
, orport_reachable_v4
);
302 if (!orport_reachable_v6
|| need_testing
) {
303 router_do_orport_reachability_checks(me
, AF_INET6
, orport_reachable_v6
);
308 /** Log a message informing the user that we are testing a port for
309 * reachability, if we have not already logged such a message.
311 * Calls to router_reset_reachability() will reset our view of whether we have
312 * logged this message for a given port. */
314 inform_testing_reachability(const tor_addr_t
*addr
, uint16_t port
)
316 if (!router_get_my_routerinfo())
319 bool *have_informed_ptr
;
320 if (tor_addr_family(addr
) == AF_INET
) {
321 have_informed_ptr
= &have_informed_testing_or_port_ipv4
;
323 have_informed_ptr
= &have_informed_testing_or_port_ipv6
;
326 if (*have_informed_ptr
) {
327 /* We already told the user that we're testing this port; no need to
332 char addr_buf
[TOR_ADDRPORT_BUF_LEN
];
333 strlcpy(addr_buf
, fmt_addrport(addr
, port
), sizeof(addr_buf
));
335 const char *afname
= fmt_af_family(tor_addr_family(addr
));
337 control_event_server_status(LOG_NOTICE
,
338 "CHECKING_REACHABILITY ORADDRESS=%s",
341 log_notice(LD_OR
, "Now checking whether %s ORPort %s is reachable... "
342 "(this may take up to %d minutes -- look for log "
343 "messages indicating success)",
345 TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT
/60);
347 *have_informed_ptr
= true;
351 * Return true if this module knows of no reason why we shouldn't publish
352 * a server descriptor.
355 ready_to_publish(const or_options_t
*options
)
357 return options
->PublishServerDescriptor_
!= NO_DIRINFO
&&
358 router_all_orports_seem_reachable(options
);
361 /** Annotate that we found our ORPort reachable with a given address
364 router_orport_found_reachable(int family
)
366 const routerinfo_t
*me
= router_get_my_routerinfo();
367 const or_options_t
*options
= get_options();
368 const char *reachable_reason
= "ORPort found reachable";
370 if (family
== AF_INET
) {
371 can_reach_ptr
= &can_reach_or_port_ipv4
;
372 } else if (family
== AF_INET6
) {
373 can_reach_ptr
= &can_reach_or_port_ipv6
;
375 tor_assert_nonfatal_unreached();
378 if (!*can_reach_ptr
&& me
) {
380 if (router_get_orport(me
, &ap
, family
) < 0) {
383 char *address
= tor_strdup(fmt_addrport_ap(&ap
));
385 *can_reach_ptr
= true;
387 log_notice(LD_OR
,"Self-testing indicates your ORPort %s is reachable from "
388 "the outside. Excellent.%s",
390 ready_to_publish(options
) ?
391 " Publishing server descriptor." : "");
393 /* Make sure our descriptor is marked to publish the IPv6 if it is now
394 * reachable. This can change at runtime. */
395 if (family
== AF_INET6
) {
396 mark_my_descriptor_if_omit_ipv6_changes(reachable_reason
, false);
398 mark_my_descriptor_dirty(reachable_reason
);
400 /* This is a significant enough change to upload immediately,
401 * at least in a test network */
402 if (options
->TestingTorNetwork
== 1) {
403 reschedule_descriptor_update_check();
405 control_event_server_status(LOG_NOTICE
,
406 "REACHABILITY_SUCCEEDED ORADDRESS=%s",
412 /** We have enough testing circuits open. Send a bunch of "drop"
413 * cells down each of them, to exercise our bandwidth.
415 * May use IPv4 and IPv6 testing circuits (if available). */
417 router_perform_bandwidth_test(int num_circs
, time_t now
)
419 int num_cells
= (int)(get_options()->BandwidthRate
* 10 /
420 CELL_MAX_NETWORK_SIZE
);
421 int max_cells
= num_cells
< CIRCWINDOW_START
?
422 num_cells
: CIRCWINDOW_START
;
423 int cells_per_circuit
= max_cells
/ num_circs
;
424 origin_circuit_t
*circ
= NULL
;
426 log_notice(LD_OR
,"Performing bandwidth self-test...done.");
427 while ((circ
= circuit_get_next_by_purpose(circ
,
428 CIRCUIT_PURPOSE_TESTING
))) {
429 /* dump cells_per_circuit drop cells onto this circ */
430 int i
= cells_per_circuit
;
431 if (circ
->base_
.state
!= CIRCUIT_STATE_OPEN
)
433 circ
->base_
.timestamp_dirty
= now
;
435 if (relay_send_command_from_edge(0, TO_CIRCUIT(circ
),
437 NULL
, 0, circ
->cpath
->prev
)<0) {
438 return; /* stop if error */