]> Cypherpunks.ru repositories - govpn.git/commitdiff
Merge branch 'develop' 4.2
authorSergey Matveev <stargrave@stargrave.org>
Sun, 15 Nov 2015 15:20:39 +0000 (18:20 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sun, 15 Nov 2015 15:20:39 +0000 (18:20 +0300)
Signed-off-by: Sergey Matveev <stargrave@stargrave.org>
13 files changed:
VERSION
doc/about.ru.texi
doc/download.texi
doc/faq.ru.texi [new file with mode: 0644]
doc/faq.texi [new file with mode: 0644]
doc/govpn.texi
doc/identity.texi
doc/news.texi
doc/verifier.texi
src/govpn/cmd/govpn-server/common.go
src/govpn/cmd/govpn-server/tcp.go
src/govpn/cmd/govpn-verifier/main.go
src/govpn/identify.go

diff --git a/VERSION b/VERSION
index 7d5c902e777905446c67de7e52a945b88fd2038c..bf77d549685a9e09678fbbda05a071b312cf2de3 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-4.1
+4.2
index 3b2fda693f9235cecc521199c6e24de0c39fd430..31386a5f7d3ae84aace61737289fc20f49922200 100644 (file)
@@ -1,4 +1,4 @@
-@node About RU
+@node О демоне
 @unnumbered Подробнее о демоне GoVPN
 
 GoVPN это простой демон виртуальных частных сетей, код которого нацелен
@@ -9,23 +9,26 @@ GoVPN это простой демон виртуальных частных с
 Свободное программное обеспечение, копилефт: лицензировано под условиями
 @url{https://www.gnu.org/licenses/gpl-3.0.ru.html, GPLv3+}.
 @item
-Быстрый сильный аутентифицируемый по парольной фразе несбалансированный
¿Ñ\80оÑ\82окол Ñ\81оглаÑ\81ованиÑ\8f ÐºÐ»Ñ\8eÑ\87ей Ñ\81 Ð´Ð²Ñ\83Ñ\81Ñ\82оÑ\80онней Ð°Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86ией Ñ\81Ñ\82оÑ\80он Ð¸
½Ñ\83левÑ\8bм Ð½ÐµÑ\80азглаÑ\88ением (PAKE DH A-EKE (Diffie-Hellman Augmented
-Encrypted Key Exchange)).
+Быстрый сильный @ref{PAKE, аутентифицируемый по парольной фразе}
½ÐµÑ\81баланÑ\81иÑ\80ованнÑ\8bй Ð¿Ñ\80оÑ\82окол @ref{Handshake, Ñ\81оглаÑ\81ованиÑ\8f ÐºÐ»Ñ\8eÑ\87ей} Ñ\81
´Ð²Ñ\83Ñ\81Ñ\82оÑ\80онней Ð°Ñ\83Ñ\82енÑ\82иÑ\84икаÑ\86ией Ñ\81Ñ\82оÑ\80он Ð¸ Ð½Ñ\83левÑ\8bм Ð½ÐµÑ\80азглаÑ\88ением (PAKE DH
+A-EKE (Diffie-Hellman Augmented Encrypted Key Exchange)).
 @item
-Несбалансированные аутентификационные токены устойчивые к внесетевым
-(offline) атакам по словарю. Используют усиленный по CPU и памяти
-алгоритм хэширования. Злоумышленник не может замаскироваться под
-клиента даже скомпрометировав базу данных токенов сервера.
+@ref{Verifier structure, Несбалансированные аутентификационные токены}
+устойчивые к внесетевым (offline) атакам по словарю. Используют
+усиленный по CPU и памяти алгоритм хэширования. Злоумышленник не может
+замаскироваться под клиента даже скомпрометировав базу данных токенов
+сервера.
 @item
-Зашифрованный и аутентифицируемый транспортный протокол передачи данных
-с 128-бит порогом безопасности и современной криптографией.
+Зашифрованный и аутентифицируемый @ref{Transport, транспортный протокол}
+передачи данных с 128-бит @ref{Developer, порогом безопасности} и
+современной криптографией.
 @item
 Цензуроустойчивые сообщения транспорта и рукопожатия: неотличимые от
 шума с опциональным скрытием размеров сообщений.
 @item
-Свойство совершенной прямой секретности (perfect forward secrecy).
+Свойство @url{https://ru.wikipedia.org/wiki/Perfect_forward_secrecy,
+совершенной прямой секретности} (perfect forward secrecy).
 @item
 Защита от атак повторного воспроизведения (replay) (используя
 одноразовые MAC).
@@ -33,29 +36,33 @@ Encrypted Key Exchange)).
 Встроенные функции пересогласования ключей (ротация сессионных ключей) и 
 сердцебиения (heartbeat).
 @item
-Возможность скрывать размеры пакетов путём зашумления данных.
+Возможность скрывать размеры пакетов путём @ref{Noise, зашумления} данных.
 @item
 Возможность скрывать временные характеристики полезной нагрузки путём
-постоянного по скорости трафика.
+@ref{CPR, постоянного по скорости} трафика.
 @item
 Совместимость с @url{http://egd.sourceforge.net/, EGD} (демон сборки
 энтропии) генераторами псевдослучайных чисел.
 @item
 Поддержка нескольких клиентов одновременно с специфичной для каждого
-конфигурацией. Клиенты имеют заранее установленный идентификатор,
-невидимый третьим лицам (они анонимны для них).
+конфигурацией. Клиенты имеют заранее установленный @ref{Identity,
¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80}, Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñ\8bй Ñ\82Ñ\80еÑ\82Ñ\8cим Ð»Ð¸Ñ\86ам (они Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñ\8b Ð´Ð»Ñ\8f Ð½Ð¸Ñ\85).
 @item
-Использует TAP низлежащие сетевые интерфейсы.
+Использует @url{https://ru.wikipedia.org/wiki/TUN/TAP, TAP} низлежащие
+сетевые интерфейсы.
 @item
-Может работать поверх UDP, TCP и HTTP прокси для доступа к серверу.
+Может работать поверх @ref{Network, UDP и TCP} или HTTP @ref{Proxy,
+прокси} для доступа к серверу.
 @item
 Полностью IPv4 и IPv6 совместимый.
 @item
-Опциональный встроенный HTTP-сервер для получения статистики о
-подключённых клиентах в режиме реального времени в JSON формате.
+Опциональный встроенный HTTP-сервер для получения @ref{Stats,
+статистики} о подключённых клиентах в режиме реального времени в
+@url{http://json.org/, JSON} формате.
 @item
-Написан на языке Go с простым кодом, ориентированным на лёгкость чтения
-и анализа.
+Написан на языке @url{http://golang.org/, Go} с простым кодом,
¾Ñ\80иенÑ\82иÑ\80ованнÑ\8bм Ð½Ð° Ð»Ñ\91гкоÑ\81Ñ\82Ñ\8c Ñ\87Ñ\82ениÑ\8f Ð¸ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°.
 @item
-Поддержка GNU/Linux и FreeBSD.
+Поддержка @url{https://www.gnu.org/, GNU}/Linux и
+@url{http://www.freebsd.org/, FreeBSD}.
 @end itemize
index 41a2c4dccb4bb4dfca406645086e952459c58afe..94c6a222e9e71b72d1c1a75c1cf2283cde250521 100644 (file)
@@ -6,6 +6,10 @@ You can obtain releases source code prepared tarballs from the links below:
 @multitable {XXXXX} {XXXX KiB} {link sign} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
 @headitem Version @tab Size @tab Tarball @tab SHA256 checksum
 
+@item 4.1 @tab 227 KiB
+@tab @url{download/govpn-4.1.tar.xz, link} @url{download/govpn-4.1.tar.xz.sig, sign}
+@tab @code{fbc7a730afe96384827dc1e1402c53165710ade5113d90531427c39172e40aca}
+
 @item 4.0 @tab 183 KiB
 @tab @url{download/govpn-4.0.tar.xz, link} @url{download/govpn-4.0.tar.xz.sig, sign}
 @tab @code{a791c3569c01dea8b18aa2f21d27b797ded76f2c33a8d96c2db864a9abf2615b}
diff --git a/doc/faq.ru.texi b/doc/faq.ru.texi
new file mode 100644 (file)
index 0000000..2023b76
--- /dev/null
@@ -0,0 +1,86 @@
+@node ЧАВО
+@unnumbered Часто задаваемые вопросы
+
+@table @asis
+
+@item Почему вы не используете TLS?
+Это сложный протокол. Он использует Аутентификацию-затем-Шифрование
+порядок использования алгоритмов -- это не безопасно. Более того, его
+библиотеки огромный и сложны для чтения, ревью и анализа.
+
+@item Почему вы не используете SSH?
+Его первые версии использовали Аутентификацию-и-Шифрование порядок,
+однако более поздние поддерживают даже ChaCha20-Poly1305 алгоритм. Его
+исходный код не тривиален и достаточно большой для чтения и ревью.
+OpenSSH не поддерживает сильные протоколы аутентификации по паролю с
+нулевым неразглашением.
+
+@item Почему вы не используете IPsec?
+Это достаточно хороший протокол, поддерживаемый большинством ОС. Но в
+нём нет сильного протокола аутентификации по паролю с нулевым
+неразглашением и, снова, его код сложно читать.
+
+@item Почему вы не используете XXX?
+По тем же самым причинам: большинство ПО не предоставляют сильных
+протоколов аутентификации, высокой криптографической безопасности и,
+большая часть, написана на C -- на нём сложно правильно писать.
+
+@item Почему GoVPN написан на Go?
+Go очень легко читается, поддаётся ревью и поддержке. Он усложняет
+написание сложного кода. Он предоставляет всё что нужно для C языка:
+проверки границ массивов, сборщик мусора и конкурентные примитивы. Он
+обеспечивает меньшую производительность (хотя на моём ноутбуке даёт
+более чем 750 Mbps пропускной способности), но большую надёжность и
+гораздо меньше строк кода.
+
+@item Почему вы аутентифицируете по парольной фразе?
+Человек способ запоминать достаточно длинные парольные фразы (не
+пароли): 100-200 символов, что даёт возможность использовать её как
+высокоэнтропийный ключ. Вам нужно доверять только себе, не аппаратному
+токену или другому устройству хранения. Это удобно.
+
+@item Почему вся настройка сети делается вручную?
+Потому-что существует так много вариантов использования, конфигураций и
+установок, что или я поддерживаю их всех, или использую громоздкие
+протоколы типы PPP, или просто даю право выбора администратору. VPN это
+всего-лишь прослойка.
+
+@item Почему нет поддержки OS X или Windows?
+Любые проприетарные системы с закрытым исходным кодом не дают
+возможности управлять компьютером. Вы не можете безопасно использовать
+всё что касается криптографии без контроля над нижестоящим
+вычислительным устройством. Выбирайте другую операционную систему.
+
+@item Что вы подразумеваете под совершенной прямой секретностью?
+Что вы не можете дешифровать ранее перехваченный трафик если ваши
+долгоживущие ключи будут скомпрометированы. Это свойство работает на
+уровне сессии: оно не спасёт если сессионный ключ скомпрометирован из
+памяти.
+
+@item Что вы подразумеваете когда говорите что клиенты анонимны?
+Что третьей лицо не может отличить одного клиента от другого, смотря на
+трафик (транспортный или рукопожатия).
+
+@item Что вы подразумеваете под цензуроустойчивостью?
+Невозможность определить GoVPN ли это трафик или просто
+@code{cat /dev/urandom | nc somehost}. Если вы не можете отличить один
+вид трафика от другого, то при цензуре ваше единственный вариант это
+заблокировать все его виды.
+
+@item Когда я должен использовать @ref{Noise, noise} опцию?
+В большинстве случаев она вам не нужна без включённого
+@ref{CPR, постоянного по скорости трафика} (CPR). Без CPR и шума, в
+GoVPN трафике (так же как и в TLS, IPsec, SSH и других VPN протоколах)
+утекает информация о размерах и временных характеристиках пакетов
+нижележащего уровня. Вы можете делать анализ трафика и предполагать что
+происходить в сети. Без CPR опции вы можете только сказать в online ли
+кто или нет -- ни больше, ни меньше.
+
+@item Могу ли я сделать DoS (отказ в обслуживании) демона?
+Каждый транспортный пакет первым делом аутентифицируется очень быстрым
+UMAC алгоритмом -- в большинстве случаев потребление ресурсов TCP/UDP
+слоёв будет выше чем проверка UMAC. Каждое сообщение рукопожатия
+обрабатывается только если зашифрованный @ref{Identity, идентификатор}
+клиента найден: он использует быстрый PRP без потребления энтропии.
+
+@end table
diff --git a/doc/faq.texi b/doc/faq.texi
new file mode 100644 (file)
index 0000000..a3269f3
--- /dev/null
@@ -0,0 +1,83 @@
+@node FAQ
+@unnumbered Frequently Asked Questions
+
+@table @asis
+
+@item Why do not you use TLS?
+It is complicated protocol. It uses Authenticate-then-Encrypt ordering
+of algorithms -- it is not secure. Moreover its libraries are huge and
+hard to read, review and analyze.
+
+@item Why do not you use SSH?
+Its first protocol versions used A-a-E ordering, however later ones
+supports even ChaCha20-Poly1305 algorithms. But its source code is not
+so trivial and rather big to read and review. OpenSSH does not support
+strong zero-knowledge password authentication.
+
+@item Why do not you use IPsec?
+It is rather good protocol, supported by all modern OSes. But it lacks
+strong zero-knowledge password authentication and, again, its code is
+hard to read.
+
+@item Why do not you use XXX?
+For the same reasons: most of software do not provide strong password
+authentication, high cryptographic protocol security, and most of this
+software is written in C -- it is hard to write right on it.
+
+@item Why GoVPN is written on Go?
+Go is very easy to read, review and support. It makes complex code
+writing a harder task. It provides everything needed to the C language:
+array bounds checking, garbage collection and concurrency primitives. It
+provides lesser performance (however my setup on the notebook gives more
+than 750 Mbps of throughput), but higher reliability and much fewer
+lines of code.
+
+@item Why do you authenticate with passphrases?
+Human is capable of memorizing rather long passphrases (not passwords):
+100-200 characters, that gives ability to use it as a high-entropy key.
+You need to trust only yourself, not hardware token or some other
+storage device. It is convenient.
+
+@item Why all network configuration must be done manually?
+Because there are so many use-cases and setups, so many various
+protocols, that either I support all of them, or use complicated
+protocol setups like PPP, or just give right of the choice to the
+administrator. VPN is only just a layer.
+
+@item Why there is no either OS X or Windows support?
+Any closed source proprietary systems do not give ability to control the
+computer. You can not securely use cryptography-related stuff without
+controlling the underlying computing device. Choose another operating
+system.
+
+@item What do you mean by perfect forward secrecy?
+You can not decrypt previously saved traffic by compromising long-lived
+keys. PFS property is per-session level: it won't protect from leaking
+the session key from the memory.
+
+@item What do you mean by saying that clients are anonymous?
+That third-party can not differentiate one client from another looking
+at the traffic (transport and handshake).
+
+@item What do you mean by censorship resistance?
+Unability to distinguish either is it GoVPN-traffic is passing by, or
+just @code{cat /dev/urandom | nc somehost}. If you can not differentiate
+one kind of traffic from another, then your only option is to forbid all
+kinds of it.
+
+@item When should I use @ref{Noise, noise} option?
+In most cases you won't need it without @ref{CPR, constant packer rate}
+turned on. Without CPR and noise options GoVPN traffic (like TLS, IPsec,
+SSH and other VPN protocols) leaks underlying interface's packets
+timestamps and sizes. You can run traffic analysis and predict what is
+going on in the network. With CPR option enabled you can tell either
+somebody is online, or not -- nothing less, nothing more.
+
+@item Can I DoS (denial of service) the daemon?
+Each transport packet is authenticated first with the very fast UMAC
+algorithm -- in most cases resource consumption of TCP/UDP layers will
+be higher then UMAC verifying. Each handshake message is processed only
+when an encrypted client's @ref{Identity, identity} is found: it uses
+fast PRP without any entropy usage.
+
+@end table
index c31b59e2006160fbedf043e63c8d32ca226bd8b2..ca719eaffb4d7679cf451b18c1ea7e0985a50208 100644 (file)
@@ -25,7 +25,9 @@ A copy of the license is included in the section entitled "Copying conditions".
 @include about.texi
 
 @menu
-* Подробнее о демоне: About RU.
+* About (russian): О демоне.
+* Frequently Asked Questions: FAQ.
+* Часто задаваемые вопросы: ЧАВО.
 * News::
 * Installation::
 * Precautions::
@@ -39,6 +41,8 @@ A copy of the license is included in the section entitled "Copying conditions".
 @end menu
 
 @include about.ru.texi
+@include faq.texi
+@include faq.ru.texi
 @include news.texi
 @include installation.texi
 @include precautions.texi
index 7e33b330254a60894680793506661008453154ed..3153abd9489ef509a4b8a63606b8b6b62b92e8d2 100644 (file)
@@ -4,4 +4,4 @@
 Client's identity is 128-bit string. It is not secret, so can be
 transmitted and stored in the clear. However handshake applies PRP on it
 to make DPI and deanonymization much harder to success. It is used as a
-salt in verifier.
+salt in @ref{Verifier}.
index c2d06b89b094afa5294fd166583a6d38ef4a72b2..e5a334b5f861faa2dfac6e352741495e14dcc3a7 100644 (file)
@@ -3,6 +3,12 @@
 
 @table @strong
 
+@item Release 4.2
+@itemize
+@item Fixed non-critical bug when server may fail if up-script is not
+executed successfully.
+@end itemize
+
 @item Release 4.1
 @itemize
 @item @url{https://password-hashing.net/#argon2, Argon2d} is used instead
index 07ba19826e5ccf2fb40f89ff819d472f6817a3b1..74c61496e1d133f6334b02d58152c4a089769d52 100644 (file)
@@ -15,11 +15,8 @@ $argon2d$m=4096,t=128,p=1$bwR5VjeCYIQaa8SeaI3rqg
 @end example
 
 First line is the verifier for the server side. Second line is for the
-client -- it lacks generated public key. However you can server's one
-on the client side too.
-
-Store @code{$argon2d...u10} string on the server's side in corresponding
-@code{verifier} configuration file's field.
+client -- it lacks generated public key. However you can use server's
+one on the client side too.
 
 You can check passphrase against verifier by specifying @code{-verifier}
 option with the path to verifier file:
index f2cc0d324096cb0a0e6037af401624701d36557b..6560cfe1cb8fd01290cc7294febe2546e78326f6 100644 (file)
@@ -20,6 +20,7 @@ package main
 
 import (
        "bytes"
+       "log"
        "sync"
        "time"
 
@@ -68,6 +69,7 @@ Processor:
 func callUp(peerId *govpn.PeerId) (string, error) {
        result, err := govpn.ScriptCall(confs[*peerId].Up, "")
        if err != nil {
+               log.Println("Script", confs[*peerId].Up, "call failed", err)
                return "", err
        }
        sepIndex := bytes.Index(result, []byte{'\n'})
index 437b5005aa8ca11b085419e484bf218108941c3a..dcd9606871894b23eb782c2d8c5100277feaf86f 100644 (file)
@@ -117,11 +117,13 @@ func handleTCP(conn net.Conn) {
                } else {
                        ifaceName, err := callUp(peer.Id)
                        if err != nil {
+                               peer = nil
                                break
                        }
                        tap, err = govpn.TAPListen(ifaceName)
                        if err != nil {
                                log.Println("Unable to create TAP:", err)
+                               peer = nil
                                break
                        }
                        ps = &PeerState{
index 1757e1e183976a6e16b36dbb3c6cf21373689b0e..97c43339d2eb24eb0868cadec4f19006131b8119 100644 (file)
@@ -55,6 +55,9 @@ func main() {
        if err != nil {
                log.Fatalln("Can not decode verifier", err)
        }
+       if v.Pub == nil {
+               log.Fatalln("Verifier does not contain public key")
+       }
        pub := *v.Pub
        v.PasswordApply(govpn.StringFromFile(*keyPath))
        fmt.Println(subtle.ConstantTimeCompare(v.Pub[:], pub[:]) == 1)
index 54c87d31e0117a300bab5a6b21fc4edd5aec1f01..b028b393f0bfce87c2d3fc6ad219378e4c6b7b83 100644 (file)
@@ -37,6 +37,10 @@ func (id PeerId) String() string {
        return hex.EncodeToString(id[:])
 }
 
+func (id PeerId) MarshalJSON() ([]byte, error) {
+       return []byte(`"` + id.String() + `"`), nil
+}
+
 type CipherCache struct {
        c map[PeerId]*xtea.Cipher
        l sync.RWMutex