Tor 0.4.9.3-alpha-dev
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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
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
101router_orport_seems_reachable(const or_options_t *options,
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/** See if we currently believe our ORPort to be unreachable. If so, return 1
134 * else return 0. */
135static int
137{
139 const or_options_t *options = get_options();
140
141 if (!me)
142 return 0;
143
144 /* Doesn't check our IPv6 address, see #34065. */
145 if (routerset_contains_router(options->ExcludeNodes, me, -1) &&
146 options->StrictNodes) {
147 /* If we've excluded ourself, and StrictNodes is set, we can't test
148 * ourself. */
149#define SELF_EXCLUDED_WARN_INTERVAL 3600
150 static ratelim_t warning_limit=RATELIM_INIT(SELF_EXCLUDED_WARN_INTERVAL);
151 log_fn_ratelim(&warning_limit, LOG_WARN, LD_CIRC,
152 "Can't perform self-tests for this relay: we have "
153 "listed ourself in ExcludeNodes, and StrictNodes is set. "
154 "We cannot learn whether we are usable, and will not "
155 "be able to advertise ourself.");
156 return 0;
157 }
158 return 1;
159}
160
161/**
162 * Return true if we have configured an ORPort for the given family that
163 * we would like to advertise.
164 *
165 * Like other self-testing functions, this function looks at our most
166 * recently built descriptor.
167 **/
168static bool
170{
172
173 if (!me)
174 return false;
175
177 if (router_get_orport(me, &ap, family) < 0) {
178 return false;
179 }
180 return true;
181}
182
183/** Allocate and return a new extend_info_t that can be used to build
184 * a circuit to or through the router <b>r</b>, using an address from
185 * <b>family</b> (if available).
186 *
187 * Clients don't have routerinfos, so this function should only be called on a
188 * server.
189 *
190 * If the requested address is not available, returns NULL. */
191static extend_info_t *
193{
194 extend_info_t *info;
196
197 if (BUG(!r)) {
198 return NULL;
199 }
200
201 /* Relays always assume that the first hop is reachable. They ignore
202 * ReachableAddresses. */
203 tor_assert_nonfatal(router_or_conn_should_skip_reachable_address_check(
204 get_options(), 0));
205
206 const ed25519_public_key_t *ed_id_key;
207 if (r->cache_info.signing_key_cert)
208 ed_id_key = &r->cache_info.signing_key_cert->signing_key;
209 else
210 ed_id_key = NULL;
211
212 if (router_get_orport(r, &ap, family) < 0) {
213 /* We don't have an ORPort for the requested family. */
214 return NULL;
215 }
216 info = extend_info_new(r->nickname, r->cache_info.identity_digest,
217 ed_id_key,
219 &ap.addr, ap.port,
220 /* TODO-324: Should self-test circuits use
221 * congestion control? */
222 NULL, false);
223
224 return info;
225}
226
227/** Launch a self-testing circuit to one of our ORPorts, using an address from
228 * <b>family</b> (if available). The circuit can be used to test reachability
229 * or bandwidth. <b>me</b> is our own routerinfo.
230 *
231 * Logs an info-level status message. If <b>orport_reachable</b> is false,
232 * call it a reachability circuit. Otherwise, call it a bandwidth circuit.
233 *
234 * See router_do_reachability_checks() for details. */
235static void
237 int family,
238 int orport_reachable)
239{
240 extend_info_t *ei = extend_info_from_router(me, family);
241 int ipv6_flags = (family == AF_INET6 ? CIRCLAUNCH_IS_IPV6_SELFTEST : 0);
242
243 /* If we're trying to test IPv6, but we don't have an IPv6 ORPort, ei will
244 * be NULL. */
245 if (ei) {
246 const char *family_name = fmt_af_family(family);
247 const tor_addr_port_t *ap = extend_info_get_orport(ei, family);
248 if (BUG(!ap)) {
249 /* Not much we can do here to recover apart from screaming loudly. */
250 extend_info_free(ei);
251 return;
252 }
253 log_info(LD_CIRC, "Testing %s of my %s ORPort: %s.",
254 !orport_reachable ? "reachability" : "bandwidth",
255 family_name, fmt_addrport_ap(ap));
256
257 if (!orport_reachable) {
258 /* Only log if we are actually doing a reachability test to learn if our
259 * ORPort is reachable. Else, this prints a log notice if we are simply
260 * opening a bandwidth testing circuit even though we are reachable. */
261 inform_testing_reachability(&ap->addr, ap->port);
262 }
263
267 ipv6_flags);
268 extend_info_free(ei);
269 }
270}
271
272/** Some time has passed, or we just got new directory information. See if we
273 * currently believe our ORPort to be unreachable. If so, launch a new test
274 * for it.
275 *
276 * For ORPort, we simply try making a circuit that ends at ourselves. Success
277 * is noticed in onionskin_answer().
278 */
279void
281{
283 const or_options_t *options = get_options();
284 int orport_reachable_v4 =
285 router_orport_seems_reachable(options, AF_INET);
286 int orport_reachable_v6 =
287 router_orport_seems_reachable(options, AF_INET6);
288
290 bool need_testing = !circuit_enough_testing_circs();
291 /* At the moment, tor relays believe that they are reachable when they
292 * receive any create cell on an inbound connection, if the address
293 * family is correct.
294 */
295 if (!orport_reachable_v4 || need_testing) {
296 router_do_orport_reachability_checks(me, AF_INET, orport_reachable_v4);
297 }
298 if (!orport_reachable_v6 || need_testing) {
299 router_do_orport_reachability_checks(me, AF_INET6, orport_reachable_v6);
300 }
301 }
302}
303
304/** Log a message informing the user that we are testing a port for
305 * reachability, if we have not already logged such a message.
306 *
307 * Calls to router_reset_reachability() will reset our view of whether we have
308 * logged this message for a given port. */
309static void
310inform_testing_reachability(const tor_addr_t *addr, uint16_t port)
311{
313 return;
314
315 bool *have_informed_ptr;
316 if (tor_addr_family(addr) == AF_INET) {
317 have_informed_ptr = &have_informed_testing_or_port_ipv4;
318 } else {
319 have_informed_ptr = &have_informed_testing_or_port_ipv6;
320 }
321
322 if (*have_informed_ptr) {
323 /* We already told the user that we're testing this port; no need to
324 * do it again. */
325 return;
326 }
327
328 char addr_buf[TOR_ADDRPORT_BUF_LEN];
329 strlcpy(addr_buf, fmt_addrport(addr, port), sizeof(addr_buf));
330
331 const char *afname = fmt_af_family(tor_addr_family(addr));
332
334 "CHECKING_REACHABILITY ORADDRESS=%s",
335 addr_buf);
336
337 log_notice(LD_OR, "Now checking whether %s ORPort %s is reachable... "
338 "(this may take up to %d minutes -- look for log "
339 "messages indicating success)",
340 afname, addr_buf,
342
343 *have_informed_ptr = true;
344}
345
346/**
347 * Return true if this module knows of no reason why we shouldn't publish
348 * a server descriptor.
349 **/
350static bool
352{
353 return options->PublishServerDescriptor_ != NO_DIRINFO &&
354 router_all_orports_seem_reachable(options);
355}
356
357/** Annotate that we found our ORPort reachable with a given address
358 * family. */
359void
360router_orport_found_reachable(int family)
361{
363 const or_options_t *options = get_options();
364 const char *reachable_reason = "ORPort found reachable";
365 bool *can_reach_ptr;
366 if (family == AF_INET) {
367 can_reach_ptr = &can_reach_or_port_ipv4;
368 } else if (family == AF_INET6) {
369 can_reach_ptr = &can_reach_or_port_ipv6;
370 } else {
372 return;
373 }
374 if (!*can_reach_ptr && me) {
376 if (router_get_orport(me, &ap, family) < 0) {
377 return;
378 }
379 char *address = tor_strdup(fmt_addrport_ap(&ap));
380
381 *can_reach_ptr = true;
382
383 log_notice(LD_OR,"Self-testing indicates your ORPort %s is reachable from "
384 "the outside. Excellent.%s",
385 address,
386 ready_to_publish(options) ?
387 " Publishing server descriptor." : "");
388
389 /* Make sure our descriptor is marked to publish the IPv6 if it is now
390 * reachable. This can change at runtime. */
391 if (family == AF_INET6) {
392 mark_my_descriptor_if_omit_ipv6_changes(reachable_reason, false);
393 } else {
394 mark_my_descriptor_dirty(reachable_reason);
395 }
396 /* This is a significant enough change to upload immediately,
397 * at least in a test network */
398 if (options->TestingTorNetwork == 1) {
399 reschedule_descriptor_update_check();
400 }
402 "REACHABILITY_SUCCEEDED ORADDRESS=%s",
403 address);
404 tor_free(address);
405 }
406}
407
408/** We have enough testing circuits open. Send a bunch of "drop"
409 * cells down each of them, to exercise our bandwidth.
410 *
411 * May use IPv4 and IPv6 testing circuits (if available). */
412void
413router_perform_bandwidth_test(int num_circs, time_t now)
414{
415 int num_cells = (int)(get_options()->BandwidthRate * 10 /
417 int max_cells = num_cells < CIRCWINDOW_START ?
418 num_cells : CIRCWINDOW_START;
419 int cells_per_circuit = max_cells / num_circs;
420 origin_circuit_t *circ = NULL;
421
422 log_notice(LD_OR,"Performing bandwidth self-test...done.");
423 while ((circ = circuit_get_next_by_purpose(circ,
425 /* dump cells_per_circuit drop cells onto this circ */
426 int i = cells_per_circuit;
427 if (circ->base_.state != CIRCUIT_STATE_OPEN)
428 continue;
429 circ->base_.timestamp_dirty = now;
430 while (i-- > 0) {
431 if (relay_send_command_from_edge(0, TO_CIRCUIT(circ),
432 RELAY_COMMAND_DROP,
433 NULL, 0, circ->cpath->prev)<0) {
434 return; /* stop if error */
435 }
436 }
437 }
438}
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)
Header file for circuitlist.c.
#define CIRCUIT_STATE_OPEN
Definition circuitlist.h:32
#define CIRCUIT_PURPOSE_TESTING
int circuit_enough_testing_circs(void)
origin_circuit_t * circuit_launch_by_extend_info(uint8_t purpose, extend_info_t *extend_info, int flags)
Header file for circuituse.c.
#define CIRCLAUNCH_NEED_CAPACITY
Definition circuituse.h:43
#define CIRCLAUNCH_IS_IPV6_SELFTEST
Definition circuituse.h:51
#define CIRCLAUNCH_IS_INTERNAL
Definition circuituse.h:46
const or_options_t * get_options(void)
Definition config.c:948
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:267
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:528
#define TO_CIRCUIT(x)
Definition or.h:947
#define TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT
Definition or.h:495
#define CIRCWINDOW_START
Definition or.h:442
Origin circuit structure.
Header file for relay.c.
Header for feature/relay/relay_periodic.c.
void mark_my_descriptor_if_omit_ipv6_changes(const char *reason, bool omit_ipv6)
Definition router.c:2540
void mark_my_descriptor_dirty(const char *reason)
Definition router.c:2601
const routerinfo_t * router_get_my_routerinfo(void)
Definition router.c:1817
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:192
static int router_should_check_reachability(void)
Definition selftest.c:136
static bool ready_to_publish(const or_options_t *options)
Definition selftest.c:351
static bool have_informed_testing_or_port_ipv4
Definition selftest.c:61
static bool have_orport_for_family(int family)
Definition selftest.c:169
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:280
void router_perform_bandwidth_test(int num_circs, time_t now)
Definition selftest.c:413
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:310
void router_reset_reachability(void)
Definition selftest.c:68
static void router_do_orport_reachability_checks(const routerinfo_t *me, int family, int orport_reachable)
Definition selftest.c:236
Header file for selftest.c.
uint8_t state
Definition circuit_st.h:111
time_t timestamp_dirty
Definition circuit_st.h:198
struct crypt_path_t * prev
dirinfo_type_t PublishServerDescriptor_
uint64_t BandwidthRate
struct routerset_t * ExcludeNodes
crypt_path_t * cpath
struct curve25519_public_key_t * onion_curve25519_pkey
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