commit bd251dc674bead514e7c329076c08a5d8ab676de
parent c1926e0dcec34b4aa522c7ba4fa23ff00f37e486
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date: Mon, 1 Aug 2022 13:28:09 +0200
add guis
Diffstat:
3 files changed, 1569 insertions(+), 0 deletions(-)
diff --git a/guis/gtk.rst b/guis/gtk.rst
@@ -0,0 +1,1562 @@
+.. _The-graphical-configuration-interface:
+
+The graphical configuration interface
+-------------------------------------
+
+.. Inserted from Installation Handbook in original "order".
+
+.. original FIXME said to move to the user's handbook...
+ WGL thinks somewhere else...
+
+If you also would like to use ``gnunet-gtk`` and ``gnunet-setup``
+(highly recommended for beginners), do:
+
+.. _Configuring-your-peer:
+
+Configuring your peer
+~~~~~~~~~~~~~~~~~~~~~
+
+This chapter will describe the various configuration options in GNUnet.
+
+The easiest way to configure your peer is to use the ``gnunet-setup``
+tool. ``gnunet-setup`` is part of the ``gnunet-gtk`` package. You might
+have to install it separately.
+
+Many of the specific sections from this chapter actually are linked from
+within ``gnunet-setup`` to help you while using the setup tool.
+
+While you can also configure your peer by editing the configuration file
+by hand, this is not recommended for anyone except for developers as it
+requires a more in-depth understanding of the configuration files and
+internal dependencies of GNUnet.
+
+.. _Configuring-the-Friend_002dto_002dFriend-_0028F2F_0029-mode:
+
+Configuring the Friend-to-Friend (F2F) mode
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+GNUnet knows three basic modes of operation:
+
+- In standard \"peer-to-peer\" mode, your peer will connect to any
+ peer.
+
+- In the pure \"friend-to-friend\" mode, your peer will ONLY connect to
+ peers from a list of friends specified in the configuration.
+
+- Finally, in mixed mode, GNUnet will only connect to arbitrary peers
+ if it has at least a specified number of connections to friends.
+
+When configuring any of the F2F (\"friend-to-friend\") modes, you first
+need to create a file with the peer identities of your friends. Ask your
+friends to run
+
+::
+
+ $ gnunet-peerinfo -sq
+
+The resulting output of this command needs to be added to your
+``friends`` file, which is simply a plain text file with one line per
+friend with the output from the above command.
+
+You then specify the location of your ``friends`` file in the
+``FRIENDS`` option of the \"topology\" section.
+
+Once you have created the ``friends`` file, you can tell GNUnet to only
+connect to your friends by setting the ``FRIENDS-ONLY`` option (again in
+the \"topology\" section) to YES.
+
+If you want to run in mixed-mode, set \"FRIENDS-ONLY\" to NO and
+configure a minimum number of friends to have (before connecting to
+arbitrary peers) under the \"MINIMUM-FRIENDS\" option.
+
+If you want to operate in normal P2P-only mode, simply set
+``MINIMUM-FRIENDS`` to zero and ``FRIENDS_ONLY`` to NO. This is the
+default.
+
+.. _Configuring-the-hostlist-to-bootstrap:
+
+Configuring the hostlist to bootstrap
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+After installing the software you need to get connected to the GNUnet
+network. The configuration file included in your download is already
+configured to connect you to the GNUnet network. In this section the
+relevant configuration settings are explained.
+
+To get an initial connection to the GNUnet network and to get to know
+peers already connected to the network you can use the so called
+\"bootstrap servers\". These servers can give you a list of peers
+connected to the network. To use these bootstrap servers you have to
+configure the hostlist daemon to activate bootstrapping.
+
+To activate bootstrapping, edit the ``[hostlist]``-section in your
+configuration file. You have to set the argument ``-b`` in the options
+line:
+
+::
+
+ [hostlist]
+ OPTIONS = -b
+
+Additionally you have to specify which server you want to use. The
+default bootstrapping server is \"http://v10.gnunet.org/hostlist\". [^]
+To set the server you have to edit the line \"SERVERS\" in the hostlist
+section. To use the default server you should set the lines to
+
+::
+
+ SERVERS = http://v10.gnunet.org/hostlist [^]
+
+To use bootstrapping your configuration file should include these lines:
+
+::
+
+ [hostlist]
+ OPTIONS = -b
+ SERVERS = http://v10.gnunet.org/hostlist [^]
+
+Besides using bootstrap servers you can configure your GNUnet peer to
+receive hostlist advertisements. Peers offering hostlists to other peers
+can send advertisement messages to peers that connect to them. If you
+configure your peer to receive these messages, your peer can download
+these lists and connect to the peers included. These lists are
+persistent, which means that they are saved to your hard disk regularly
+and are loaded during startup.
+
+To activate hostlist learning you have to add the ``-e`` switch to the
+``OPTIONS`` line in the hostlist section:
+
+::
+
+ [hostlist]
+ OPTIONS = -b -e
+
+Furthermore you can specify in which file the lists are saved. To save
+the lists in the file ``hostlists.file`` just add the line:
+
+::
+
+ HOSTLISTFILE = hostlists.file
+
+Best practice is to activate both bootstrapping and hostlist learning.
+So your configuration file should include these lines:
+
+::
+
+ [hostlist]
+ OPTIONS = -b -e
+ HTTPPORT = 8080
+ SERVERS = http://v10.gnunet.org/hostlist [^]
+ HOSTLISTFILE = $SERVICEHOME/hostlists.file
+
+.. _Configuration-of-the-HOSTLIST-proxy-settings:
+
+Configuration of the HOSTLIST proxy settings
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The hostlist client can be configured to use a proxy to connect to the
+hostlist server. This functionality can be configured in the
+configuration file directly or using the ``gnunet-setup`` tool.
+
+The hostlist client supports the following proxy types at the moment:
+
+- HTTP and HTTP 1.0 only proxy
+
+- SOCKS 4/4a/5/5 with hostname
+
+In addition authentication at the proxy with username and password can
+be configured.
+
+To configure proxy support for the hostlist client in the
+``gnunet-setup`` tool, select the \"hostlist\" tab and select the
+appropriate proxy type. The hostname or IP address (including port if
+required) has to be entered in the \"Proxy hostname\" textbox. If
+required, enter username and password in the \"Proxy username\" and
+\"Proxy password\" boxes. Be aware that this information will be stored
+in the configuration in plain text (TODO: Add explanation and generalize
+the part in Chapter 3.6 about the encrypted home).
+
+To provide these options directly in the configuration, you can enter
+the following settings in the ``[hostlist]`` section of the
+configuration:
+
+::
+
+ # Type of proxy server,
+ # Valid values: HTTP, HTTP_1_0, SOCKS4, SOCKS5, SOCKS4A, SOCKS5_HOSTNAME
+ # Default: HTTP
+ # PROXY_TYPE = HTTP
+
+ # Hostname or IP of proxy server
+ # PROXY =
+ # User name for proxy server
+ # PROXY_USERNAME =
+ # User password for proxy server
+ # PROXY_PASSWORD =
+
+.. _Configuring-your-peer-to-provide-a-hostlist:
+
+Configuring your peer to provide a hostlist
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you operate a peer permanently connected to GNUnet you can configure
+your peer to act as a hostlist server, providing other peers the list of
+peers known to him.
+
+Your server can act as a bootstrap server and peers needing to obtain a
+list of peers can contact it to download this list. To download this
+hostlist the peer uses HTTP. For this reason you have to build your peer
+with libgnurl (or libcurl) and microhttpd support.
+
+To configure your peer to act as a bootstrap server you have to add the
+``-p`` option to ``OPTIONS`` in the ``[hostlist]`` section of your
+configuration file. Besides that you have to specify a port number for
+the http server. In conclusion you have to add the following lines:
+
+::
+
+ [hostlist]
+ HTTPPORT = 12980
+ OPTIONS = -p
+
+If your peer acts as a bootstrap server other peers should know about
+that. You can advertise the hostlist your are providing to other peers.
+Peers connecting to your peer will get a message containing an
+advertisement for your hostlist and the URL where it can be downloaded.
+If this peer is in learning mode, it will test the hostlist and, in the
+case it can obtain the list successfully, it will save it for
+bootstrapping.
+
+To activate hostlist advertisement on your peer, you have to set the
+following lines in your configuration file:
+
+::
+
+ [hostlist]
+ EXTERNAL_DNS_NAME = example.org
+ HTTPPORT = 12981
+ OPTIONS = -p -a
+
+With this configuration your peer will a act as a bootstrap server and
+advertise this hostlist to other peers connecting to it. The URL used to
+download the list will be ``http://example.org:12981/``.
+
+Please notice:
+
+- The hostlist is **not** human readable, so you should not try to
+ download it using your webbrowser. Just point your GNUnet peer to the
+ address!
+
+- Advertising without providing a hostlist does not make sense and will
+ not work.
+
+.. _Configuring-the-datastore:
+
+Configuring the datastore
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The datastore is what GNUnet uses for long-term storage of file-sharing
+data. Note that long-term does not mean 'forever' since content does
+have an expiration date, and of course storage space is finite (and
+hence sometimes content may have to be discarded).
+
+Use the ``QUOTA`` option to specify how many bytes of storage space you
+are willing to dedicate to GNUnet.
+
+In addition to specifying the maximum space GNUnet is allowed to use for
+the datastore, you need to specify which database GNUnet should use to
+do so. Currently, you have the choice between sqLite, MySQL and
+Postgres.
+
+.. _Configuring-the-MySQL-database:
+
+Configuring the MySQL database
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This section describes how to setup the MySQL database for GNUnet.
+
+Note that the mysql plugin does NOT work with mysql before 4.1 since we
+need prepared statements. We are generally testing the code against
+MySQL 5.1 at this point.
+
+.. _Reasons-for-using-MySQL:
+
+Reasons for using MySQL
+~~~~~~~~~~~~~~~~~~~~~~~
+
+- On up-to-date hardware where mysql can be used comfortably, this
+ module will have better performance than the other database choices
+ (according to our tests).
+
+- Its often possible to recover the mysql database from internal
+ inconsistencies. Some of the other databases do not support repair.
+
+.. _Reasons-for-not-using-MySQL:
+
+Reasons for not using MySQL
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Memory usage (likely not an issue if you have more than 1 GB)
+
+- Complex manual setup
+
+.. _Setup-Instructions:
+
+Setup Instructions
+~~~~~~~~~~~~~~~~~~
+
+- In ``gnunet.conf`` set in section ``DATASTORE`` the value for
+ ``DATABASE`` to ``mysql``.
+
+- Access mysql as root:
+
+ .. code-block:: shell
+
+ $ mysql -u root -p
+
+ and issue the following commands, replacing ``$USER`` with the username
+ that will be running ``gnunet-arm`` (so typically \"gnunet\"):
+
+ .. code-block:: mysql
+
+ CREATE DATABASE gnunet;
+ GRANT select,insert,update,delete,create,alter,drop,create temporary tables ON gnunet.* TO $USER@localhost;
+ SET PASSWORD FOR $USER@localhost=PASSWORD('$the_password_you_like');
+ FLUSH PRIVILEGES;
+
+- In the $HOME directory of $USER, create a ``.my.cnf`` file with the
+ following lines
+
+ .. code-block:: conf
+
+ [client]
+ user=$USER
+ password=$the_password_you_like
+
+That's it. Note that ``.my.cnf`` file is a slight security risk unless
+its on a safe partition. The ``$HOME/.my.cnf`` can of course be a
+symbolic link. Luckily $USER has only privileges to mess up GNUnet's
+tables, which should be pretty harmless.
+
+.. _Testing:
+
+Testing
+~~~~~~~
+
+You should briefly try if the database connection works. First, login as
+$USER. Then use:
+
+::
+
+ $ mysql -u $USER
+ mysql> use gnunet;
+
+If you get the message
+
+::
+
+ Database changed
+
+it probably works.
+
+If you get
+
+.. code-block:: none
+
+ ERROR 2002: Can't connect to local MySQL server
+ through socket '/tmp/mysql.sock' (2)
+
+it may be resolvable by
+
+::
+
+ ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
+
+so there may be some additional trouble depending on your mysql setup.
+
+.. _Performance-Tuning:
+
+Performance Tuning
+~~~~~~~~~~~~~~~~~~
+
+For GNUnet, you probably want to set the option
+
+.. todo:: Code block not C, set appropriate language
+
+::
+
+ innodb_flush_log_at_trx_commit = 0
+
+for a rather dramatic boost in MySQL performance. However, this reduces
+the \"safety\" of your database as with this options you may loose
+transactions during a power outage. While this is totally harmless for
+GNUnet, the option applies to all applications using MySQL. So you
+should set it if (and only if) GNUnet is the only application on your
+system using MySQL.
+
+.. _Setup-for-running-Testcases:
+
+Setup for running Testcases
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you want to run the testcases, you must create a second database
+\"gnunetcheck\" with the same username and password. This database will
+then be used for testing (``make check``).
+
+.. _Configuring-the-Postgres-database:
+
+Configuring the Postgres database
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This text describes how to setup the Postgres database for GNUnet.
+
+This Postgres plugin was developed for Postgres 8.3 but might work for
+earlier versions as well.
+
+.. _Reasons-to-use-Postgres:
+
+Reasons to use Postgres
+~~~~~~~~~~~~~~~~~~~~~~~
+
+- Easier to setup than MySQL
+
+- Real database
+
+.. _Reasons-not-to-use-Postgres:
+
+Reasons not to use Postgres
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Quite slow
+
+- Still some manual setup required
+
+.. _Manual-setup-instructions:
+
+Manual setup instructions
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- In ``gnunet.conf`` set in section ``DATASTORE`` the value for
+ ``DATABASE`` to ``postgres``.
+
+- Access Postgres to create a user:
+
+ with Postgres 8.x, use:
+ ::
+
+ # su - postgres
+ $ createuser
+
+ and enter the name of the user running GNUnet for the role
+ interactively. Then, when prompted, do not set it to superuser,
+ allow the creation of databases, and do not allow the creation of
+ new roles.
+
+ with Postgres 9.x, use:
+ ::
+
+ # su - postgres
+ $ createuser -d $GNUNET_USER
+
+ where $GNUNET_USER is the name of the user running GNUnet.
+
+- As that user (so typically as user \"gnunet\"), create a database (or
+ two):
+
+ ::
+
+ $ createdb gnunet
+ # this way you can run "make check"
+ $ createdb gnunetcheck
+
+Now you should be able to start ``gnunet-arm``.
+
+.. _Testing-the-setup-manually:
+
+Testing the setup manually
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You may want to try if the database connection works. First, again login
+as the user who will run ``gnunet-arm``. Then use:
+
+.. code-block:: psql
+
+ $ psql gnunet # or gnunetcheck
+ gnunet=> \dt
+
+If, after you have started ``gnunet-arm`` at least once, you get a
+``gn090`` table here, it probably works.
+
+.. _Configuring-the-datacache:
+
+Configuring the datacache
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The datacache is what GNUnet uses for storing temporary data. This data
+is expected to be wiped completely each time GNUnet is restarted (or the
+system is rebooted).
+
+You need to specify how many bytes GNUnet is allowed to use for the
+datacache using the ``QUOTA`` option in the section ``[dhtcache]``.
+Furthermore, you need to specify which database backend should be used
+to store the data. Currently, you have the choice between sqLite, MySQL
+and Postgres.
+
+.. _Configuring-the-file_002dsharing-service:
+
+Configuring the file-sharing service
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In order to use GNUnet for file-sharing, you first need to make sure
+that the file-sharing service is loaded. This is done by setting the
+``START_ON_DEMAND`` option in section ``[fs]`` to \"YES\".
+Alternatively, you can run
+
+::
+
+ $ gnunet-arm -i fs
+
+to start the file-sharing service by hand.
+
+Except for configuring the database and the datacache the only important
+option for file-sharing is content migration.
+
+Content migration allows your peer to cache content from other peers as
+well as send out content stored on your system without explicit
+requests. This content replication has positive and negative impacts on
+both system performance and privacy.
+
+FIXME: discuss the trade-offs. Here is some older text about it\...
+
+Setting this option to YES allows gnunetd to migrate data to the local
+machine. Setting this option to YES is highly recommended for
+efficiency. Its also the default. If you set this value to YES, GNUnet
+will store content on your machine that you cannot decrypt. While this
+may protect you from liability if the judge is sane, it may not (IANAL).
+If you put illegal content on your machine yourself, setting this option
+to YES will probably increase your chances to get away with it since you
+can plausibly deny that you inserted the content. Note that in either
+case, your anonymity would have to be broken first (which may be
+possible depending on the size of the GNUnet network and the strength of
+the adversary).
+
+.. _Configuring-logging:
+
+Configuring logging
+~~~~~~~~~~~~~~~~~~~
+
+Since version 0.9.0, logging in GNUnet is controlled via the ``-L`` and
+``-l`` options. Using ``-L``, a log level can be specified. With log
+level ``ERROR`` only serious errors are logged. The default log level is
+``WARNING`` which causes anything of concern to be logged. Log level
+``INFO`` can be used to log anything that might be interesting
+information whereas ``DEBUG`` can be used by developers to log debugging
+messages (but you need to run ``./configure`` with
+``--enable-logging=verbose`` to get them compiled). The ``-l`` option is
+used to specify the log file.
+
+Since most GNUnet services are managed by ``gnunet-arm``, using the
+``-l`` or ``-L`` options directly is not possible. Instead, they can be
+specified using the ``OPTIONS`` configuration value in the respective
+section for the respective service. In order to enable logging globally
+without editing the ``OPTIONS`` values for each service, ``gnunet-arm``
+supports a ``GLOBAL_POSTFIX`` option. The value specified here is given
+as an extra option to all services for which the configuration does
+contain a service-specific ``OPTIONS`` field.
+
+``GLOBAL_POSTFIX`` can contain the special sequence \"{}\" which is
+replaced by the name of the service that is being started. Furthermore,
+``GLOBAL_POSTFIX`` is special in that sequences starting with \"$\"
+anywhere in the string are expanded (according to options in ``PATHS``);
+this expansion otherwise is only happening for filenames and then the
+\"$\" must be the first character in the option. Both of these
+restrictions do not apply to ``GLOBAL_POSTFIX``. Note that specifying
+``%`` anywhere in the ``GLOBAL_POSTFIX`` disables both of these
+features.
+
+In summary, in order to get all services to log at level ``INFO`` to
+log-files called ``SERVICENAME-logs``, the following global prefix
+should be used:
+
+::
+
+ GLOBAL_POSTFIX = -l $SERVICEHOME/{}-logs -L INFO
+
+.. _Configuring-the-transport-service-and-plugins:
+
+Configuring the transport service and plugins
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The transport service in GNUnet is responsible to maintain basic
+connectivity to other peers. Besides initiating and keeping connections
+alive it is also responsible for address validation.
+
+The GNUnet transport supports more than one transport protocol. These
+protocols are configured together with the transport service.
+
+The configuration section for the transport service itself is quite
+similar to all the other services
+
+.. code-block:: conf
+
+ START_ON_DEMAND = YES
+ @UNIXONLY@ PORT = 2091
+ HOSTNAME = localhost
+ HOME = $SERVICEHOME
+ CONFIG = $DEFAULTCONFIG
+ BINARY = gnunet-service-transport
+ #PREFIX = valgrind
+ NEIGHBOUR_LIMIT = 50
+ ACCEPT_FROM = 127.0.0.1;
+ ACCEPT_FROM6 = ::1;
+ PLUGINS = tcp udp
+ UNIXPATH = /tmp/gnunet-service-transport.sock
+
+Different are the settings for the plugins to load ``PLUGINS``. The
+first setting specifies which transport plugins to load.
+
+- transport-unix A plugin for local only communication with UNIX domain
+ sockets. Used for testing and available on unix systems only. Just
+ set the port
+
+ ::
+
+ [transport-unix]
+ PORT = 22086
+ TESTING_IGNORE_KEYS = ACCEPT_FROM;
+
+- transport-tcp A plugin for communication with TCP. Set port to 0 for
+ client mode with outbound only connections
+
+ ::
+
+ [transport-tcp]
+ # Use 0 to ONLY advertise as a peer behind NAT (no port binding)
+ PORT = 2086
+ ADVERTISED_PORT = 2086
+ TESTING_IGNORE_KEYS = ACCEPT_FROM;
+ # Maximum number of open TCP connections allowed
+ MAX_CONNECTIONS = 128
+
+- transport-udp A plugin for communication with UDP. Supports peer
+ discovery using broadcasts.
+
+ ::
+
+ [transport-udp]
+ PORT = 2086
+ BROADCAST = YES
+ BROADCAST_INTERVAL = 30 s
+ MAX_BPS = 1000000
+ TESTING_IGNORE_KEYS = ACCEPT_FROM;
+
+- transport-http HTTP and HTTPS support is split in two part: a client
+ plugin initiating outbound connections and a server part accepting
+ connections from the client. The client plugin just takes the maximum
+ number of connections as an argument.
+
+ ::
+
+ [transport-http_client]
+ MAX_CONNECTIONS = 128
+ TESTING_IGNORE_KEYS = ACCEPT_FROM;
+
+ ::
+
+ [transport-https_client]
+ MAX_CONNECTIONS = 128
+ TESTING_IGNORE_KEYS = ACCEPT_FROM;
+
+ The server has a port configured and the maximum number of
+ connections. The HTTPS part has two files with the certificate key
+ and the certificate file.
+
+ The server plugin supports reverse proxies, so a external hostname
+ can be set using the ``EXTERNAL_HOSTNAME`` setting. The webserver
+ under this address should forward the request to the peer and the
+ configure port.
+
+ ::
+
+ [transport-http_server]
+ EXTERNAL_HOSTNAME = fulcrum.net.in.tum.de/gnunet
+ PORT = 1080
+ MAX_CONNECTIONS = 128
+ TESTING_IGNORE_KEYS = ACCEPT_FROM;
+
+ ::
+
+ [transport-https_server]
+ PORT = 4433
+ CRYPTO_INIT = NORMAL
+ KEY_FILE = https.key
+ CERT_FILE = https.cert
+ MAX_CONNECTIONS = 128
+ TESTING_IGNORE_KEYS = ACCEPT_FROM;
+
+- transport-wlan
+
+ The next section describes how to setup the WLAN plugin, so here only
+ the settings. Just specify the interface to use:
+
+ ::
+
+ [transport-wlan]
+ # Name of the interface in monitor mode (typically monX)
+ INTERFACE = mon0
+ # Real hardware, no testing
+ TESTMODE = 0
+ TESTING_IGNORE_KEYS = ACCEPT_FROM;
+
+.. _Configuring-the-WLAN-transport-plugin:
+
+Configuring the WLAN transport plugin
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The wlan transport plugin enables GNUnet to send and to receive data on
+a wlan interface. It has not to be connected to a wlan network as long
+as sender and receiver are on the same channel. This enables you to get
+connection to GNUnet where no internet access is possible, for example
+during catastrophes or when censorship cuts you off from the internet.
+
+.. _Requirements-for-the-WLAN-plugin:
+
+Requirements for the WLAN plugin
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+- wlan network card with monitor support and packet injection (see
+ `aircrack-ng.org <http://www.aircrack-ng.org/>`__)
+
+- Linux kernel with mac80211 stack, introduced in 2.6.22, tested with
+ 2.6.35 and 2.6.38
+
+- Wlantools to create the a monitor interface, tested with airmon-ng of
+ the aircrack-ng package
+
+.. _Configuration:
+
+Configuration
+^^^^^^^^^^^^^
+
+There are the following options for the wlan plugin (they should be like
+this in your default config file, you only need to adjust them if the
+values are incorrect for your system)
+
+::
+
+ # section for the wlan transport plugin
+ [transport-wlan]
+ # interface to use, more information in the
+ # "Before starting GNUnet" section of the handbook.
+ INTERFACE = mon0
+ # testmode for developers:
+ # 0 use wlan interface,
+ #1 or 2 use loopback driver for tests 1 = server, 2 = client
+ TESTMODE = 0
+
+.. _Before-starting-GNUnet:
+
+Before starting GNUnet
+^^^^^^^^^^^^^^^^^^^^^^
+
+Before starting GNUnet, you have to make sure that your wlan interface
+is in monitor mode. One way to put the wlan interface into monitor mode
+(if your interface name is wlan0) is by executing:
+
+::
+
+ sudo airmon-ng start wlan0
+
+Here is an example what the result should look like:
+
+::
+
+ Interface Chipset Driver
+ wlan0 Intel 4965 a/b/g/n iwl4965 - [phy0]
+ (monitor mode enabled on mon0)
+
+The monitor interface is mon0 is the one that you have to put into the
+configuration file.
+
+.. _Limitations-and-known-bugs:
+
+Limitations and known bugs
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Wlan speed is at the maximum of 1 Mbit/s because support for choosing
+the wlan speed with packet injection was removed in newer kernels.
+Please pester the kernel developers about fixing this.
+
+The interface channel depends on the wlan network that the card is
+connected to. If no connection has been made since the start of the
+computer, it is usually the first channel of the card. Peers will only
+find each other and communicate if they are on the same channel.
+Channels must be set manually, e.g. by using:
+
+::
+
+ iwconfig wlan0 channel 1
+
+.. _Configuring-HTTP_0028S_0029-reverse-proxy-functionality-using-Apache-or-nginx:
+
+Configuring HTTP(S) reverse proxy functionality using Apache or nginx
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The HTTP plugin supports data transfer using reverse proxies. A reverse
+proxy forwards the HTTP request he receives with a certain URL to
+another webserver, here a GNUnet peer.
+
+So if you have a running Apache or nginx webserver you can configure it
+to be a GNUnet reverse proxy. Especially if you have a well-known
+website this improves censorship resistance since it looks as normal
+surfing behaviour.
+
+To do so, you have to do two things:
+
+- Configure your webserver to forward the GNUnet HTTP traffic
+
+- Configure your GNUnet peer to announce the respective address
+
+As an example we want to use GNUnet peer running:
+
+- HTTP server plugin on ``gnunet.foo.org:1080``
+
+- HTTPS server plugin on ``gnunet.foo.org:4433``
+
+- A apache or nginx webserver on
+ `http://www.foo.org:80/ <http://www.foo.org/>`__
+
+- A apache or nginx webserver on https://www.foo.org:443/
+
+And we want the webserver to accept GNUnet traffic under
+``http://www.foo.org/bar/``. The required steps are described here:
+
+.. _Reverse-Proxy-_002d-Configure-your-Apache2-HTTP-webserver:
+
+Reverse Proxy - Configure your Apache2 HTTP webserver
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+First of all you need mod_proxy installed.
+
+Edit your webserver configuration. Edit ``/etc/apache2/apache2.conf`` or
+the site-specific configuration file.
+
+In the respective ``server config``,\ ``virtual host`` or ``directory``
+section add the following lines:
+
+::
+
+ ProxyTimeout 300
+ ProxyRequests Off
+ <Location /bar/ >
+ ProxyPass http://gnunet.foo.org:1080/
+ ProxyPassReverse http://gnunet.foo.org:1080/
+ </Location>
+
+.. _Reverse-Proxy-_002d-Configure-your-Apache2-HTTPS-webserver:
+
+Reverse Proxy - Configure your Apache2 HTTPS webserver
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+We assume that you already have an HTTPS server running, if not please
+check how to configure a HTTPS host. An uncomplicated to use example is
+the example configuration file for Apache2/HTTPD provided in
+``apache2/sites-available/default-ssl``.
+
+In the respective HTTPS ``server config``,\ ``virtual host`` or
+``directory`` section add the following lines:
+
+::
+
+ SSLProxyEngine On
+ ProxyTimeout 300
+ ProxyRequests Off
+ <Location /bar/ >
+ ProxyPass https://gnunet.foo.org:4433/
+ ProxyPassReverse https://gnunet.foo.org:4433/
+ </Location>
+
+More information about the apache mod_proxy configuration can be found
+in the `Apache
+documentation <http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass>`__.
+
+.. _Reverse-Proxy-_002d-Configure-your-nginx-HTTPS-webserver:
+
+Reverse Proxy - Configure your nginx HTTPS webserver
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Since nginx does not support chunked encoding, you first of all have to
+install the ``chunkin``
+`module <http://wiki.nginx.org/HttpChunkinModule>`__.
+
+To enable chunkin add:
+
+.. code-block:: nginx
+
+ chunkin on;
+ error_page 411 = @my_411_error;
+ location @my_411_error {
+ chunkin_resume;
+ }
+
+Edit your webserver configuration. Edit ``/etc/nginx/nginx.conf`` or the
+site-specific configuration file.
+
+In the ``server`` section add:
+
+.. code-block:: nginx
+
+ location /bar/ {
+ proxy_pass http://gnunet.foo.org:1080/;
+ proxy_buffering off;
+ proxy_connect_timeout 5; # more than http_server
+ proxy_read_timeout 350; # 60 default, 300s is GNUnet's idle timeout
+ proxy_http_version 1.1; # 1.0 default
+ proxy_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504;
+ }
+
+.. _Reverse-Proxy-_002d-Configure-your-nginx-HTTP-webserver:
+
+Reverse Proxy - Configure your nginx HTTP webserver
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Edit your webserver configuration. Edit ``/etc/nginx/nginx.conf`` or the
+site-specific configuration file.
+
+In the ``server`` section add:
+
+.. code-block:: nginx
+
+ ssl_session_timeout 6m;
+ location /bar/
+ {
+ proxy_pass https://gnunet.foo.org:4433/;
+ proxy_buffering off;
+ proxy_connect_timeout 5; # more than http_server
+ proxy_read_timeout 350; # 60 default, 300s is GNUnet's idle timeout
+ proxy_http_version 1.1; # 1.0 default
+ proxy_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504;
+ }
+
+.. _Reverse-Proxy-_002d-Configure-your-GNUnet-peer:
+
+Reverse Proxy - Configure your GNUnet peer
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To have your GNUnet peer announce the address, you have to specify the
+``EXTERNAL_HOSTNAME`` option in the ``[transport-http_server]`` section:
+
+::
+
+ [transport-http_server]
+ EXTERNAL_HOSTNAME = http://www.foo.org/bar/
+
+and/or ``[transport-https_server]`` section:
+
+::
+
+ [transport-https_server]
+ EXTERNAL_HOSTNAME = https://www.foo.org/bar/
+
+Now restart your webserver and your peer\...
+
+.. _Blacklisting-peers:
+
+Blacklisting peers
+~~~~~~~~~~~~~~~~~~
+
+Transport service supports to deny connecting to a specific peer of to a
+specific peer with a specific transport plugin using the blacklisting
+component of transport service. With blacklisting it is possible to deny
+connections to specific peers of to use a specific plugin to a specific
+peer. Peers can be blacklisted using the configuration or a blacklist
+client can be asked.
+
+To blacklist peers using the configuration you have to add a section to
+your configuration containing the peer id of the peer to blacklist and
+the plugin if required.
+
+Examples:
+
+To blacklist connections to P565\... on peer AG2P\... using tcp add:
+
+.. todo:: too long?
+.. todo:: verify whether these still produce errors in pdf output
+
+::
+
+ [transport-blacklist AG2PHES1BARB9IJCPAMJTFPVJ5V3A72S3F2A8SBUB8DAQ2V0O3V8G6G2JU56FHGFOHMQVKBSQFV98TCGTC3RJ1NINP82G0RC00N1520]
+ P565723JO1C2HSN6J29TAQ22MN6CI8HTMUU55T0FUQG4CMDGGEQ8UCNBKUMB94GC8R9G4FB2SF9LDOBAJ6AMINBP4JHHDD6L7VD801G = tcp
+
+To blacklist connections to P565\... on peer AG2P\... using all plugins
+add:
+
+::
+
+ [transport-blacklist-AG2PHES1BARB9IJCPAMJTFPVJ5V3A72S3F2A8SBUB8DAQ2V0O3V8G6G2JU56FHGFOHMQVKBSQFV98TCGTC3RJ1NINP82G0RC00N1520]
+ P565723JO1C2HSN6J29TAQ22MN6CI8HTMUU55T0FUQG4CMDGGEQ8UCNBKUMB94GC8R9G4FB2SF9LDOBAJ6AMINBP4JHHDD6L7VD801G =
+
+You can also add a blacklist client using the blacklist API. On a
+blacklist check, blacklisting first checks internally if the peer is
+blacklisted and if not, it asks the blacklisting clients. Clients are
+asked if it is OK to connect to a peer ID, the plugin is omitted.
+
+On blacklist check for (peer, plugin)
+
+- Do we have a local blacklist entry for this peer and this plugin?
+
+- YES: disallow connection
+
+- Do we have a local blacklist entry for this peer and all plugins?
+
+- YES: disallow connection
+
+- Does one of the clients disallow?
+
+- YES: disallow connection
+
+.. _Configuration-of-the-HTTP-and-HTTPS-transport-plugins:
+
+Configuration of the HTTP and HTTPS transport plugins
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The client parts of the http and https transport plugins can be
+configured to use a proxy to connect to the hostlist server. This
+functionality can be configured in the configuration file directly or
+using the gnunet-setup tool.
+
+Both the HTTP and HTTPS clients support the following proxy types at the
+moment:
+
+- HTTP 1.1 proxy
+
+- SOCKS 4/4a/5/5 with hostname
+
+In addition authentication at the proxy with username and password can
+be configured.
+
+To configure proxy support for the clients in the gnunet-setup tool,
+select the \"transport\" tab and activate the respective plugin. Now you
+can select the appropriate proxy type. The hostname or IP address
+(including port if required) has to be entered in the \"Proxy hostname\"
+textbox. If required, enter username and password in the \"Proxy
+username\" and \"Proxy password\" boxes. Be aware that these information
+will be stored in the configuration in plain text.
+
+To configure these options directly in the configuration, you can
+configure the following settings in the ``[transport-http_client]`` and
+``[transport-https_client]`` section of the configuration:
+
+::
+
+ # Type of proxy server,
+ # Valid values: HTTP, SOCKS4, SOCKS5, SOCKS4A, SOCKS5_HOSTNAME
+ # Default: HTTP
+ # PROXY_TYPE = HTTP
+
+ # Hostname or IP of proxy server
+ # PROXY =
+ # User name for proxy server
+ # PROXY_USERNAME =
+ # User password for proxy server
+ # PROXY_PASSWORD =
+
+.. _Configuring-the-GNU-Name-System:
+
+Configuring the GNU Name System
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. _Configuring-system_002dwide-DNS-interception:
+
+Configuring system-wide DNS interception
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Before you install GNUnet, make sure you have a user and group 'gnunet'
+as well as an empty group 'gnunetdns'.
+
+When using GNUnet with system-wide DNS interception, it is absolutely
+necessary for all GNUnet service processes to be started by
+``gnunet-service-arm`` as user and group 'gnunet'. You also need to be
+sure to run ``make install`` as root (or use the ``sudo`` option to
+configure) to grant GNUnet sufficient privileges.
+
+With this setup, all that is required for enabling system-wide DNS
+interception is for some GNUnet component (VPN or GNS) to request it.
+The ``gnunet-service-dns`` will then start helper programs that will
+make the necessary changes to your firewall (``iptables``) rules.
+
+Note that this will NOT work if your system sends out DNS traffic to a
+link-local IPv6 address, as in this case GNUnet can intercept the
+traffic, but not inject the responses from the link-local IPv6 address.
+Hence you cannot use system-wide DNS interception in conjunction with
+link-local IPv6-based DNS servers. If such a DNS server is used, it will
+bypass GNUnet's DNS traffic interception.
+
+Using the GNU Name System (GNS) requires two different configuration
+steps. First of all, GNS needs to be integrated with the operating
+system. Most of this section is about the operating system level
+integration.
+
+The remainder of this chapter will detail the various methods for
+configuring the use of GNS with your operating system.
+
+At this point in time you have different options depending on your OS:
+
+- Use the gnunet-gns-proxy This approach works for all operating
+ systems and is likely the easiest. However, it enables GNS only for
+ browsers, not for other applications that might be using DNS, such as
+ SSH. Still, using the proxy is required for using HTTP with GNS and
+ is thus recommended for all users. To do this, you simply have to run
+ the ``gnunet-gns-proxy-setup-ca`` script as the user who will run the
+ browser (this will create a GNS certificate authority (CA) on your
+ system and import its key into your browser), then start
+ ``gnunet-gns-proxy`` and inform your browser to use the Socks5 proxy
+ which ``gnunet-gns-proxy`` makes available by default on port 7777.
+
+- Use a nsswitch plugin (recommended on GNU systems) This approach has
+ the advantage of offering fully personalized resolution even on
+ multi-user systems. A potential disadvantage is that some
+ applications might be able to bypass GNS.
+
+- Use a W32 resolver plugin (recommended on W32) This is currently the
+ only option on W32 systems.
+
+- Use system-wide DNS packet interception This approach is recommended
+ for the GNUnet VPN. It can be used to handle GNS at the same time;
+ however, if you only use this method, you will only get one root zone
+ per machine (not so great for multi-user systems).
+
+You can combine system-wide DNS packet interception with the nsswitch
+plugin. The setup of the system-wide DNS interception is described here.
+All of the other GNS-specific configuration steps are described in the
+following sections.
+
+.. _Configuring-the-GNS-nsswitch-plugin:
+
+Configuring the GNS nsswitch plugin
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The Name Service Switch (NSS) is a facility in Unix-like operating
+systems (in most cases provided by the GNU C Library) that provides a
+variety of sources for common configuration databases and name
+resolution mechanisms. A superuser (system administrator) usually
+configures the operating system's name services using the file
+``/etc/nsswitch.conf``.
+
+GNS provides a NSS plugin to integrate GNS name resolution with the
+operating system's name resolution process. To use the GNS NSS plugin
+you have to either
+
+- install GNUnet as root or
+
+- compile GNUnet with the ``--with-sudo=yes`` switch.
+
+Name resolution is controlled by the *hosts* section in the NSS
+configuration. By default this section first performs a lookup in the
+``/etc/hosts`` file and then in DNS. The nsswitch file should contain a
+line similar to:
+
+::
+
+ hosts: files dns [NOTFOUND=return] mdns4_minimal mdns4
+
+Here the GNS NSS plugin can be added to perform a GNS lookup before
+performing a DNS lookup. The GNS NSS plugin has to be added to the
+\"hosts\" section in ``/etc/nsswitch.conf`` file before DNS related
+plugins:
+
+::
+
+ ...
+ hosts: files gns [NOTFOUND=return] dns mdns4_minimal mdns4
+ ...
+
+The ``NOTFOUND=return`` will ensure that if a ``.gnu`` name is not found
+in GNS it will not be queried in DNS.
+
+.. _GNS-Proxy-Setup:
+
+GNS Proxy Setup
+^^^^^^^^^^^^^^^
+
+When using the GNU Name System (GNS) to browse the WWW, there are
+several issues that can be solved by adding the GNS Proxy to your setup:
+
+- If the target website does not support GNS, it might assume that it
+ is operating under some name in the legacy DNS system (such as
+ example.com). It may then attempt to set cookies for that domain, and
+ the web server might expect a ``Host: example.com`` header in the
+ request from your browser. However, your browser might be using
+ ``example.gnu`` for the ``Host`` header and might only accept (and
+ send) cookies for ``example.gnu``. The GNS Proxy will perform the
+ necessary translations of the hostnames for cookies and HTTP headers
+ (using the LEHO record for the target domain as the desired
+ substitute).
+
+- If using HTTPS, the target site might include an SSL certificate
+ which is either only valid for the LEHO domain or might match a TLSA
+ record in GNS. However, your browser would expect a valid certificate
+ for ``example.gnu``, not for some legacy domain name. The proxy will
+ validate the certificate (either against LEHO or TLSA) and then
+ on-the-fly produce a valid certificate for the exchange, signed by
+ your own CA. Assuming you installed the CA of your proxy in your
+ browser's certificate authority list, your browser will then trust
+ the HTTPS/SSL/TLS connection, as the hostname mismatch is hidden by
+ the proxy.
+
+- Finally, the proxy will in the future indicate to the server that it
+ speaks GNS, which will enable server operators to deliver GNS-enabled
+ web sites to your browser (and continue to deliver legacy links to
+ legacy browsers)
+
+.. _Setup-of-the-GNS-CA:
+
+Setup of the GNS CA
+^^^^^^^^^^^^^^^^^^^
+
+First you need to create a CA certificate that the proxy can use. To do
+so use the provided script gnunet-gns-proxy-ca:
+
+::
+
+ $ gnunet-gns-proxy-setup-ca
+
+This will create a personal certification authority for you and add this
+authority to the firefox and chrome database. The proxy will use the
+this CA certificate to generate ``*.gnu`` client certificates on the
+fly.
+
+Note that the proxy uses libcurl. Make sure your version of libcurl uses
+GnuTLS and NOT OpenSSL. The proxy will **not** work with libcurl
+compiled against OpenSSL.
+
+You can check the configuration your libcurl was build with by running:
+
+::
+
+ curl --version
+
+the output will look like this (without the linebreaks):
+
+::
+
+ gnurl --version
+ curl 7.56.0 (x86_64-unknown-linux-gnu) libcurl/7.56.0 \
+ GnuTLS/3.5.13 zlib/1.2.11 libidn2/2.0.4
+ Release-Date: 2017-10-08
+ Protocols: http https
+ Features: AsynchDNS IDN IPv6 Largefile NTLM SSL libz \
+ TLS-SRP UnixSockets HTTPS-proxy
+
+.. _Testing-the-GNS-setup:
+
+Testing the GNS setup
+^^^^^^^^^^^^^^^^^^^^^
+
+Now for testing purposes we can create some records in our zone to test
+the SSL functionality of the proxy:
+
+::
+
+ $ gnunet-identity -C test
+ $ gnunet-namestore -a -e "1 d" -n "homepage" \
+ -t A -V 131.159.74.67 -z test
+ $ gnunet-namestore -a -e "1 d" -n "homepage" \
+ -t LEHO -V "gnunet.org" -z test
+
+At this point we can start the proxy. Simply execute
+
+::
+
+ $ gnunet-arm -i gns-proxy
+
+To run the proxy at all times in the future, you should change your
+configuration as follows:
+
+::
+
+ $ gnunet-config -s gns-proxy -o AUTOSTART -V YES
+
+Configure your browser to use this SOCKSv5 proxy using ``localhost`` on
+port 7777. If you use ``Firefox`` (or one of its derivatives/forks such
+as Icecat) you also have to go to ``about:config`` and set the key
+``network.proxy.socks_remote_dns`` to ``true``.
+
+When you visit ``https://homepage.test/``, you should get to the
+``https://gnunet.org/`` frontpage and the browser (with the correctly
+configured proxy) should give you a valid SSL certificate for
+``homepage.gnu`` and no warnings. It should look like this:
+
+.. todo:: Image missing, does it no longer exist?
+
+.. _Migrating-existing-DNS-zones-into-GNS:
+
+Migrating existing DNS zones into GNS
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To migrate an existing zone into GNS use the Ascension tool.
+
+Ascension transfers entire zones into GNS by doing incremental zone
+transfers and then adding the records to GNS.
+
+Compared to the gnunet-zoneimport tool it strictly uses AXFR or IXFR
+depending on whether or not there exists a SOA record for the zone. If
+that is the case it will take the serial as a reference point and
+request the zone. The server will either answer the IXFR request with a
+correct incremental zone or with the entire zone, which depends on the
+server configuration.
+
+You can find the source code here:
+``https://git.gnunet.org/ascension.git/``
+
+The software can be installed into a Python virtual environment like
+this:
+
+::
+
+ $ python3 -m venv .venv
+ $ source .venv/bin/activate
+ $ python3 setup.py install
+
+Or installed globally like this:
+
+::
+
+ $ sudo python3 setup.py install
+
+Pip will then install all the necessary requirements that are needed to
+run Ascension. For development purposes a virtual environment should
+suffice. Keeping a virtual environment helps with keeping things tidy
+and prevents breaking of Ascension through a future Python update.
+
+The advantage of using a virtual environment is, that all the
+dependencies can be installed separately in different versions without
+touching your systems Python installation and its dependencies.
+
+Another way to install Ascension on Debian is to install the
+python3-ascension package. It can be found within the above mentioned
+Ascension git repository. This also adds a system user called ascension
+and runs a GNUnet peer in the background. Please note: This only works
+if a recent version of GNUnet is installed on your system. The version
+number of Ascension is chosen according to the required feature level of
+GNUnet: Ascension 0.11.5 is only compatible with GNUnet 0.11.5 or later
+and so on. As Debian's packages for GNUnet are outdated even in
+experimental, you will need to install GNUnet manually See `Installing
+GNUnet <#Installing-GNUnet>`__.
+
+Please check See `Migrating an existing DNS zone into
+GNS <#Migrating-an-existing-DNS-zone-into-GNS>`__, for usage manual of
+the tool.
+
+.. _Configuring-the-GNUnet-VPN:
+
+Configuring the GNUnet VPN
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Before configuring the GNUnet VPN, please make sure that system-wide DNS
+interception is configured properly as described in the section on the
+GNUnet DNS setup. see `Configuring the GNU Name
+System <#Configuring-the-GNU-Name-System>`__, if you haven't done so
+already.
+
+The default options for the GNUnet VPN are usually sufficient to use
+GNUnet as a Layer 2 for your Internet connection. However, what you
+always have to specify is which IP protocol you want to tunnel: IPv4,
+IPv6 or both. Furthermore, if you tunnel both, you most likely should
+also tunnel all of your DNS requests. You theoretically can tunnel
+\"only\" your DNS traffic, but that usually makes little sense.
+
+The other options as shown on the gnunet-setup tool are:
+
+.. _IPv4-address-for-interface:
+
+IPv4 address for interface
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This is the IPv4 address the VPN interface will get. You should pick a
+'private' IPv4 network that is not yet in use for you system. For
+example, if you use ``10.0.0.1/255.255.0.0`` already, you might use
+``10.1.0.1/255.255.0.0``. If you use ``10.0.0.1/255.0.0.0`` already,
+then you might use ``192.168.0.1/255.255.0.0``. If your system is not in
+a private IP-network, using any of the above will work fine. You should
+try to make the mask of the address big enough (``255.255.0.0`` or, even
+better, ``255.0.0.0``) to allow more mappings of remote IP Addresses
+into this range. However, even a ``255.255.255.0`` mask will suffice for
+most users.
+
+.. _IPv6-address-for-interface:
+
+IPv6 address for interface
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The IPv6 address the VPN interface will get. Here you can specify any
+non-link-local address (the address should not begin with ``fe80:``). A
+subnet Unique Local Unicast (``fd00::/8`` prefix) that you are currently
+not using would be a good choice.
+
+.. _Configuring-the-GNUnet-VPN-DNS:
+
+Configuring the GNUnet VPN DNS
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To resolve names for remote nodes, activate the DNS exit option.
+
+.. _Configuring-the-GNUnet-VPN-Exit-Service:
+
+Configuring the GNUnet VPN Exit Service
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If you want to allow other users to share your Internet connection (yes,
+this may be dangerous, just as running a Tor exit node) or want to
+provide access to services on your host (this should be less dangerous,
+as long as those services are secure), you have to enable the GNUnet
+exit daemon.
+
+You then get to specify which exit functions you want to provide. By
+enabling the exit daemon, you will always automatically provide exit
+functions for manually configured local services (this component of the
+system is under development and not documented further at this time). As
+for those services you explicitly specify the target IP address and
+port, there is no significant security risk in doing so.
+
+Furthermore, you can serve as a DNS, IPv4 or IPv6 exit to the Internet.
+Being a DNS exit is usually pretty harmless. However, enabling IPv4 or
+IPv6-exit without further precautions may enable adversaries to access
+your local network, send spam, attack other systems from your Internet
+connection and do other mischiefs that will appear to come from your
+machine. This may or may not get you into legal trouble. If you want to
+allow IPv4 or IPv6-exit functionality, you should strongly consider
+adding additional firewall rules manually to protect your local network
+and to restrict outgoing TCP traffic (e.g. by not allowing access to
+port 25). While we plan to improve exit-filtering in the future, you're
+currently on your own here. Essentially, be prepared for any kind of
+IP-traffic to exit the respective TUN interface (and GNUnet will enable
+IP-forwarding and NAT for the interface automatically).
+
+Additional configuration options of the exit as shown by the
+gnunet-setup tool are:
+
+.. _IP-Address-of-external-DNS-resolver:
+
+IP Address of external DNS resolver
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If DNS traffic is to exit your machine, it will be send to this DNS
+resolver. You can specify an IPv4 or IPv6 address.
+
+.. _IPv4-address-for-Exit-interface:
+
+IPv4 address for Exit interface
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This is the IPv4 address the Interface will get. Make the mask of the
+address big enough (255.255.0.0 or, even better, 255.0.0.0) to allow
+more mappings of IP addresses into this range. As for the VPN interface,
+any unused, private IPv4 address range will do.
+
+.. _IPv6-address-for-Exit-interface:
+
+IPv6 address for Exit interface
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The public IPv6 address the interface will get. If your kernel is not a
+very recent kernel and you are willing to manually enable IPv6-NAT, the
+IPv6 address you specify here must be a globally routed IPv6 address of
+your host.
+
+Suppose your host has the address ``2001:4ca0::1234/64``, then using
+``2001:4ca0::1:0/112`` would be fine (keep the first 64 bits, then
+change at least one bit in the range before the bitmask, in the example
+above we changed bit 111 from 0 to 1).
+
+You may also have to configure your router to route traffic for the
+entire subnet (``2001:4ca0::1:0/112`` for example) through your computer
+(this should be automatic with IPv6, but obviously anything can be
+disabled).
+
+.. _Bandwidth-Configuration:
+
+Bandwidth Configuration
+~~~~~~~~~~~~~~~~~~~~~~~
+
+You can specify how many bandwidth GNUnet is allowed to use to receive
+and send data. This is important for users with limited bandwidth or
+traffic volume.
+
+.. _Configuring-NAT:
+
+Configuring NAT
+~~~~~~~~~~~~~~~
+
+Most hosts today do not have a normal global IP address but instead are
+behind a router performing Network Address Translation (NAT) which
+assigns each host in the local network a private IP address. As a
+result, these machines cannot trivially receive inbound connections from
+the Internet. GNUnet supports NAT traversal to enable these machines to
+receive incoming connections from other peers despite their limitations.
+
+In an ideal world, you can press the \"Attempt automatic configuration\"
+button in gnunet-setup to automatically configure your peer correctly.
+Alternatively, your distribution might have already triggered this
+automatic configuration during the installation process. However,
+automatic configuration can fail to determine the optimal settings,
+resulting in your peer either not receiving as many connections as
+possible, or in the worst case it not connecting to the network at all.
+
+To manually configure the peer, you need to know a few things about your
+network setup. First, determine if you are behind a NAT in the first
+place. This is always the case if your IP address starts with \"10.*\"
+or \"192.168.*\". Next, if you have control over your NAT router, you
+may choose to manually configure it to allow GNUnet traffic to your
+host. If you have configured your NAT to forward traffic on ports 2086
+(and possibly 1080) to your host, you can check the \"NAT ports have
+been opened manually\" option, which corresponds to the \"PUNCHED_NAT\"
+option in the configuration file. If you did not punch your NAT box, it
+may still be configured to support UPnP, which allows GNUnet to
+automatically configure it. In that case, you need to install the
+\"upnpc\" command, enable UPnP (or PMP) on your NAT box and set the
+\"Enable NAT traversal via UPnP or PMP\" option (corresponding to
+\"ENABLE_UPNP\" in the configuration file).
+
+Some NAT boxes can be traversed using the autonomous NAT traversal
+method. This requires certain GNUnet components to be installed with
+\"SUID\" privileges on your system (so if you're installing on a system
+you do not have administrative rights to, this will not work). If you
+installed as 'root', you can enable autonomous NAT traversal by checking
+the \"Enable NAT traversal using ICMP method\". The ICMP method requires
+a way to determine your NAT's external (global) IP address. This can be
+done using either UPnP, DynDNS, or by manual configuration. If you have
+a DynDNS name or know your external IP address, you should enter that
+name under \"External (public) IPv4 address\" (which corresponds to the
+\"EXTERNAL_ADDRESS\" option in the configuration file). If you leave the
+option empty, GNUnet will try to determine your external IP address
+automatically (which may fail, in which case autonomous NAT traversal
+will then not work).
+
+Finally, if you yourself are not behind NAT but want to be able to
+connect to NATed peers using autonomous NAT traversal, you need to check
+the \"Enable connecting to NATed peers using ICMP method\" box.
+
+.. _Peer-configuration-for-distributors-_0028e_002eg_002e-Operating-Systems_0029:
+
+Peer configuration for distributors (e.g. Operating Systems)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The \"GNUNET_DATA_HOME\" in \"[PATHS]\" in ``/etc/gnunet.conf`` should
+be manually set to \"/var/lib/gnunet/data/\" as the default
+\"~/.local/share/gnunet/\" is probably not that appropriate in this
+case. Similarly, distributors may consider pointing
+\"GNUNET_RUNTIME_DIR\" to \"/var/run/gnunet/\" and \"GNUNET_HOME\" to
+\"/var/lib/gnunet/\". Also, should a distributor decide to override
+system defaults, all of these changes should be done in a custom
+``/etc/gnunet.conf`` and not in the files in the ``config.d/``
+directory.
+
+Given the proposed access permissions, the \"gnunet-setup\" tool must be
+run as use \"gnunet\" (and with option \"-c /etc/gnunet.conf\" so that
+it modifies the system configuration). As always, gnunet-setup should be
+run after the GNUnet peer was stopped using \"gnunet-arm -e\".
+Distributors might want to include a wrapper for gnunet-setup that
+allows the desktop-user to \"sudo\" (e.g. using gtksudo) to the
+\"gnunet\" user account and then runs \"gnunet-arm -e\",
+\"gnunet-setup\" and \"gnunet-arm -s\" in sequence.
diff --git a/guis/index.rst b/guis/index.rst
@@ -0,0 +1,6 @@
+GUIs
+====
+
+.. toctree::
+
+ gtk
diff --git a/index.rst b/index.rst
@@ -9,3 +9,4 @@ Welcome to GNUnet’s documentation!
man_developers/index
livingstandards
gana
+ guis/index