Tor 0.4.9.1-alpha-dev
selftest.c
Go to the documentation of this file.
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 */
6
7/**
8 * \file selftest.c
9 * \brief Relay self-testing
10 *
11 * Relays need to make sure that their own ports are reachable, and estimate
12 * their own bandwidth, before publishing.
13 */
14
15#include "core/or/or.h"
16
17#include "app/config/config.h"
18
22
24#include "core/or/circuitlist.h"
25#include "core/or/circuituse.h"
27#include "core/or/extendinfo.h"
30#include "core/or/relay.h"
31
33
35
38
42#include "feature/nodelist/routerlist.h" // but...
45
49
50static bool have_orport_for_family(int family);
51static void inform_testing_reachability(const tor_addr_t *addr,
52 uint16_t port);
53
54/** Whether we can reach our IPv4 ORPort from the outside. */
55static bool can_reach_or_port_ipv4 = false;
56/** Whether we can reach our IPv6 ORPort from the outside. */
57static bool can_reach_or_port_ipv6 = false;
58
59/** Has informed_testing_reachable logged a message about testing our IPv4
60 * ORPort? */
62/** Has informed_testing_reachable logged a message about testing our IPv6
63 * ORPort? */
65
66/** Forget what we have learned about our reachability status. */
67void
69{
73}
74
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.
79 */
80static int
82{
83 return options->AssumeReachable ||
85}
86
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.
94
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_
98 * orport checks.
99 */
100int
102 int family)
103{
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) {
107 return true;
108 }
109
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);
114
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);
118
119 if (checking_ipv4) {
121 return false;
122 }
123 }
124 if (checking_ipv6 && !ipv6_assume_reachable) {
126 return false;
127 }
128 }
129
130 return true;
131}
132
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. */
136int
138{
139 (void) options;
140 return 1;
141}
142
143/** See if we currently believe our ORPort to be unreachable. If so, return 1
144 * else return 0. */
145static int
147{
149 const or_options_t *options = get_options();
150
151 if (!me)
152 return 0;
153
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
158 * ourself. */
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.");
166 return 0;
167 }
168 return 1;
169}
170
171/**
172 * Return true if we have configured an ORPort for the given family that
173 * we would like to advertise.
174 *
175 * Like other self-testing functions, this function looks at our most
176 * recently built descriptor.
177 **/
178static bool
180{
182
183 if (!me)
184 return false;
185
187 if (router_get_orport(me, &ap, family) < 0) {
188 return false;
189 }
190 return true;
191}
192
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).
196 *
197 * Clients don't have routerinfos, so this function should only be called on a
198 * server.
199 *
200 * If the requested address is not available, returns NULL. */
201static extend_info_t *
203{
204 extend_info_t *info;
206
207 if (BUG(!r)) {
208 return NULL;
209 }
210
211 /* Relays always assume that the first hop is reachable. They ignore
212 * ReachableAddresses. */
213 tor_assert_nonfatal(router_or_conn_should_skip_reachable_address_check(
214 get_options(), 0));
215
216 const ed25519_public_key_t *ed_id_key;
217 if (r->cache_info.signing_key_cert)
218 ed_id_key = &r->cache_info.signing_key_cert->signing_key;
219 else
220 ed_id_key = NULL;
221
222 if (router_get_orport(r, &ap, family) < 0) {
223 /* We don't have an ORPort for the requested family. */
224 return NULL;
225 }
226 info = extend_info_new(r->nickname, r->cache_info.identity_digest,
227 ed_id_key,
229 &ap.addr, ap.port,
230 /* TODO-324: Should self-test circuits use
231 * congestion control? */
232 NULL, false);
233
234 return info;
235}
236
237/** Launch a self-testing circuit to one of our ORPorts, using an address from
238 * <b>family</b> (if available). The circuit can be used to test reachability
239 * or bandwidth. <b>me</b> is our own routerinfo.
240 *
241 * Logs an info-level status message. If <b>orport_reachable</b> is false,
242 * call it a reachability circuit. Otherwise, call it a bandwidth circuit.
243 *
244 * See router_do_reachability_checks() for details. */
245static void
247 int family,
248 int orport_reachable)
249{
250 extend_info_t *ei = extend_info_from_router(me, family);
251 int ipv6_flags = (family == AF_INET6 ? CIRCLAUNCH_IS_IPV6_SELFTEST : 0);
252
253 /* If we're trying to test IPv6, but we don't have an IPv6 ORPort, ei will
254 * be NULL. */
255 if (ei) {
256 const char *family_name = fmt_af_family(family);
257 const tor_addr_port_t *ap = extend_info_get_orport(ei, family);
258 if (BUG(!ap)) {
259 /* Not much we can do here to recover apart from screaming loudly. */
260 extend_info_free(ei);
261 return;
262 }
263 log_info(LD_CIRC, "Testing %s of my %s ORPort: %s.",
264 !orport_reachable ? "reachability" : "bandwidth",
265 family_name, fmt_addrport_ap(ap));
266
267 if (!orport_reachable) {
268 /* Only log if we are actually doing a reachability test to learn if our
269 * ORPort is reachable. Else, this prints a log notice if we are simply
270 * opening a bandwidth testing circuit even though we are reachable. */
271 inform_testing_reachability(&ap->addr, ap->port);
272 }
273
277 ipv6_flags);
278 extend_info_free(ei);
279 }
280}
281
282/** Some time has passed, or we just got new directory information. See if we
283 * currently believe our ORPort to be unreachable. If so, launch a new test
284 * for it.
285 *
286 * For ORPort, we simply try making a circuit that ends at ourselves. Success
287 * is noticed in onionskin_answer().
288 */
289void
291{
293 const or_options_t *options = get_options();
294 int orport_reachable_v4 =
295 router_orport_seems_reachable(options, AF_INET);
296 int orport_reachable_v6 =
297 router_orport_seems_reachable(options, AF_INET6);
298
300 bool need_testing = !circuit_enough_testing_circs();
301 /* At the moment, tor relays believe that they are reachable when they
302 * receive any create cell on an inbound connection, if the address
303 * family is correct.
304 */
305 if (!orport_reachable_v4 || need_testing) {
306 router_do_orport_reachability_checks(me, AF_INET, orport_reachable_v4);
307 }
308 if (!orport_reachable_v6 || need_testing) {
309 router_do_orport_reachability_checks(me, AF_INET6, orport_reachable_v6);
310 }
311 }
312}
313
314/** Log a message informing the user that we are testing a port for
315 * reachability, if we have not already logged such a message.
316 *
317 * Calls to router_reset_reachability() will reset our view of whether we have
318 * logged this message for a given port. */
319static void
320inform_testing_reachability(const tor_addr_t *addr, uint16_t port)
321{
323 return;
324
325 bool *have_informed_ptr;
326 if (tor_addr_family(addr) == AF_INET) {
327 have_informed_ptr = &have_informed_testing_or_port_ipv4;
328 } else {
329 have_informed_ptr = &have_informed_testing_or_port_ipv6;
330 }
331
332 if (*have_informed_ptr) {
333 /* We already told the user that we're testing this port; no need to
334 * do it again. */
335 return;
336 }
337
338 char addr_buf[TOR_ADDRPORT_BUF_LEN];
339 strlcpy(addr_buf, fmt_addrport(addr, port), sizeof(addr_buf));
340
341 const char *afname = fmt_af_family(tor_addr_family(addr));
342
344 "CHECKING_REACHABILITY ORADDRESS=%s",
345 addr_buf);
346
347 log_notice(LD_OR, "Now checking whether %s ORPort %s is reachable... "
348 "(this may take up to %d minutes -- look for log "
349 "messages indicating success)",
350 afname, addr_buf,
352
353 *have_informed_ptr = true;
354}
355
356/**
357 * Return true if this module knows of no reason why we shouldn't publish
358 * a server descriptor.
359 **/
360static bool
362{
363 return options->PublishServerDescriptor_ != NO_DIRINFO &&
364 router_all_orports_seem_reachable(options);
365}
366
367/** Annotate that we found our ORPort reachable with a given address
368 * family. */
369void
371{
373 const or_options_t *options = get_options();
374 const char *reachable_reason = "ORPort found reachable";
375 bool *can_reach_ptr;
376 if (family == AF_INET) {
377 can_reach_ptr = &can_reach_or_port_ipv4;
378 } else if (family == AF_INET6) {
379 can_reach_ptr = &can_reach_or_port_ipv6;
380 } else {
382 return;
383 }
384 if (!*can_reach_ptr && me) {
386 if (router_get_orport(me, &ap, family) < 0) {
387 return;
388 }
389 char *address = tor_strdup(fmt_addrport_ap(&ap));
390
391 *can_reach_ptr = true;
392
393 log_notice(LD_OR,"Self-testing indicates your ORPort %s is reachable from "
394 "the outside. Excellent.%s",
395 address,
396 ready_to_publish(options) ?
397 " Publishing server descriptor." : "");
398
399 /* Make sure our descriptor is marked to publish the IPv6 if it is now
400 * reachable. This can change at runtime. */
401 if (family == AF_INET6) {
402 mark_my_descriptor_if_omit_ipv6_changes(reachable_reason, false);
403 } else {
404 mark_my_descriptor_dirty(reachable_reason);
405 }
406 /* This is a significant enough change to upload immediately,
407 * at least in a test network */
408 if (options->TestingTorNetwork == 1) {
410 }
412 "REACHABILITY_SUCCEEDED ORADDRESS=%s",
413 address);
414 tor_free(address);
415 }
416}
417
418/** We have enough testing circuits open. Send a bunch of "drop"
419 * cells down each of them, to exercise our bandwidth.
420 *
421 * May use IPv4 and IPv6 testing circuits (if available). */
422void
423router_perform_bandwidth_test(int num_circs, time_t now)
424{
425 int num_cells = (int)(get_options()->BandwidthRate * 10 /
427 int max_cells = num_cells < CIRCWINDOW_START ?
428 num_cells : CIRCWINDOW_START;
429 int cells_per_circuit = max_cells / num_circs;
430 origin_circuit_t *circ = NULL;
431
432 log_notice(LD_OR,"Performing bandwidth self-test...done.");
433 while ((circ = circuit_get_next_by_purpose(circ,
435 /* dump cells_per_circuit drop cells onto this circ */
436 int i = cells_per_circuit;
437 if (circ->base_.state != CIRCUIT_STATE_OPEN)
438 continue;
439 circ->base_.timestamp_dirty = now;
440 while (i-- > 0) {
441 if (relay_send_command_from_edge(0, TO_CIRCUIT(circ),
442 RELAY_COMMAND_DROP,
443 NULL, 0, circ->cpath->prev)<0) {
444 return; /* stop if error */
445 }
446 }
447 }
448}
const char * fmt_addrport(const tor_addr_t *addr, uint16_t port)
Definition: address.c:1199
const char * fmt_af_family(sa_family_t family)
Definition: address.c:1246
static sa_family_t tor_addr_family(const tor_addr_t *a)
Definition: address.h:187
#define TOR_ADDRPORT_BUF_LEN
Definition: address.h:233
Header file for directory authority mode.
Authority certificate structure.
Header file for circuitbuild.c.
origin_circuit_t * circuit_get_next_by_purpose(origin_circuit_t *start, uint8_t purpose)
Definition: circuitlist.c:1804
Header file for circuitlist.c.
#define CIRCUIT_STATE_OPEN
Definition: circuitlist.h:32
#define CIRCUIT_PURPOSE_TESTING
Definition: circuitlist.h:118
int circuit_enough_testing_circs(void)
Definition: circuituse.c:1597
origin_circuit_t * circuit_launch_by_extend_info(uint8_t purpose, extend_info_t *extend_info, int flags)
Definition: circuituse.c:2094
Header file for circuituse.c.
#define CIRCLAUNCH_NEED_CAPACITY
Definition: circuituse.h:43
#define CIRCLAUNCH_IS_IPV6_SELFTEST
Definition: circuituse.h:54
#define CIRCLAUNCH_IS_INTERNAL
Definition: circuituse.h:46
const or_options_t * get_options(void)
Definition: config.c:944
Header file for config.c.
Header file for connection.c.
int control_event_server_status(int severity, const char *format,...)
Header file for control_events.c.
Path structures for origin circuits.
Header file for dirclient.c.
Header file for directory.c.
Extend-info structure.
extend_info_t * extend_info_new(const char *nickname, const char *rsa_id_digest, const ed25519_public_key_t *ed_id, const curve25519_public_key_t *ntor_key, const tor_addr_t *addr, uint16_t port, const protover_summary_flags_t *pv, bool for_exit_use)
Definition: extendinfo.c:33
const tor_addr_port_t * extend_info_get_orport(const extend_info_t *ei, int family)
Definition: extendinfo.c:263
Header for core/or/extendinfo.c.
#define log_fn_ratelim(ratelim, severity, domain, args,...)
Definition: log.h:288
#define LD_OR
Definition: log.h:92
#define LOG_NOTICE
Definition: log.h:50
#define LD_CIRC
Definition: log.h:82
#define LOG_WARN
Definition: log.h:53
Header file for mainloop.c.
#define tor_free(p)
Definition: malloc.h:56
int net_is_disabled(void)
Definition: netstatus.c:25
Header for netstatus.c.
Master header file for Tor-specific functionality.
#define CELL_MAX_NETWORK_SIZE
Definition: or.h:468
#define TO_CIRCUIT(x)
Definition: or.h:848
#define TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT
Definition: or.h:442
#define CIRCWINDOW_START
Definition: or.h:394
Origin circuit structure.
Header file for relay.c.
void reschedule_descriptor_update_check(void)
Header for feature/relay/relay_periodic.c.
void mark_my_descriptor_if_omit_ipv6_changes(const char *reason, bool omit_ipv6)
Definition: router.c:2538
void mark_my_descriptor_dirty(const char *reason)
Definition: router.c:2599
const routerinfo_t * router_get_my_routerinfo(void)
Definition: router.c:1830
Header file for router.c.
int router_get_orport(const routerinfo_t *router, tor_addr_port_t *ap_out, int family)
Definition: routerinfo.c:27
Header file for routerinfo.c.
Router descriptor structure.
Header file for routerlist.c.
int routerset_contains_router(const routerset_t *set, const routerinfo_t *ri, country_t country)
Definition: routerset.c:328
Header file for routerset.c.
static bool can_reach_or_port_ipv6
Definition: selftest.c:57
static extend_info_t * extend_info_from_router(const routerinfo_t *r, int family)
Definition: selftest.c:202
static int router_should_check_reachability(void)
Definition: selftest.c:146
static bool ready_to_publish(const or_options_t *options)
Definition: selftest.c:361
static bool have_informed_testing_or_port_ipv4
Definition: selftest.c:61
int router_orport_seems_reachable(const or_options_t *options, int family)
Definition: selftest.c:101
static bool have_orport_for_family(int family)
Definition: selftest.c:179
static bool have_informed_testing_or_port_ipv6
Definition: selftest.c:64
static bool can_reach_or_port_ipv4
Definition: selftest.c:55
void router_do_reachability_checks(void)
Definition: selftest.c:290
void router_orport_found_reachable(int family)
Definition: selftest.c:370
void router_perform_bandwidth_test(int num_circs, time_t now)
Definition: selftest.c:423
static int router_reachability_checks_disabled(const or_options_t *options)
Definition: selftest.c:81
static void inform_testing_reachability(const tor_addr_t *addr, uint16_t port)
Definition: selftest.c:320
void router_reset_reachability(void)
Definition: selftest.c:68
int router_dirport_seems_reachable(const or_options_t *options)
Definition: selftest.c:137
static void router_do_orport_reachability_checks(const routerinfo_t *me, int family, int orport_reachable)
Definition: selftest.c:246
Header file for selftest.c.
uint8_t state
Definition: circuit_st.h:111
time_t timestamp_dirty
Definition: circuit_st.h:188
struct crypt_path_t * prev
Definition: crypt_path_st.h:79
dirinfo_type_t PublishServerDescriptor_
uint64_t BandwidthRate
struct routerset_t * ExcludeNodes
int AssumeReachableIPv6
crypt_path_t * cpath
struct curve25519_public_key_t * onion_curve25519_pkey
Definition: routerinfo_st.h:46
char * nickname
Definition: routerinfo_st.h:22
char identity_digest[DIGEST_LEN]
struct tor_cert_st * signing_key_cert
Header for torcert.c.
#define tor_assert_nonfatal_unreached()
Definition: util_bug.h:177