четверг, 15 апреля 2021 г.

P2P связь по UDP между 2-мя хостами, находящимися за NAT

Установить P2P связь по UDP между 2-мя хостами, находящимися за NAT-ами, без вмешательства в клиентские / провайдерские маршрутизаторы (UPnP, port forwarding, NAT-PMP) как оказывается, вполне возможно.

При этом на одной стороне у клиентского роутера нет белого IP-адреса, у провайдера Port Restricted Cone NAT (номер внешнего порта на внешнем IP при посылке UDP-датаграммы непредсказуем). На другой стороне клиентский роутер с белым IP и Port Full Cone NAT (номер внешнего порта на внешнем IP при посылке UDP-датаграммы предсказуем).

Упрощенно это работает так:

1) Пиры A и B посылают на STUN-сервер UDP-датаграмму с запросом BindingRequest. В ответ получают свой внешний IP:port

2) Теперь пиры надо "познакомить", т.е. сообщить адрес визави посредством внешнего канала связи.

   Например, вручную введя адрес, или через некий "трекер" или через DHT, как это делают торрент-пиры.

3) Далее пирам надо периодически посылать друг-другу "привет", до тех пор пока не придет ответ.

Как правило, после второй попытки "приветсвия" удается пробиться, за исключением случая Symmetric NAT.

4) NAT может закрыть порт по таймауту, поэтому периодически надо что-то посылать, например пустую датаграмму.


Статья с обзором видов NAT и методов как их пробивать, включая Symmetric NAT: 

1. A New Method for Symmetric NAT Traversal in UDP and TCP

вторник, 18 августа 2020 г.

go-data-routing

 

go-data-routing

The go-data-routing library provides a  #DSL for stream-oriented processing of data. Based on the concepts of #EIP (enterprise integration patterns) and concurrency primitives of #golang.

The motivation for this project is simple: to get an easy and clear way of coding ETL-like programs for parallel processing of data. In my case it was a BFS crawler tuned for extraction of specific metadata, (see a basic version in `example` folder).  

Features

The library provides the following primitives:

  • route (chain of nodes processing messages)
  • node:
    • filter
    • processor -- processes a stream of tasks in parallel
    • wire tap: sends a copy of msg to another route (referenced by name)
    • to: enrich msg on another route (request-reply / enrichment pattern)

All the primitives are accessible through DSL.

Design of node:

  • each node is connected with the next one (if exists) only with 1 channel
  • node owns an input channel
  • output is just a reference to the input of next node
  • node does not close the output channel, instead it just sends a Stop msg to a next node
  • if a node is the last in a chain than an output message being sent is discarded unless it's not a RequestReply

суббота, 29 февраля 2020 г.

go-pool-of-workers

This is a simplistic Go implementation of the pool of workers [1].
When you might need it:
If you want to handle a number/stream of jobs in parallel but with a limited number of goroutines.
All you need is:
  • a job Runner -- a handler for a specific unit of work
  • an optional callback to handle a result of job
Code example:
type Job struct{ result SomeType }

func (r *Job) Run() {
    time.Sleep(200 * time.Millisecond)
    r.result = x
}

func main() {
    p := pool.NewPool(2, 4) // minWorkers, maxWorkers
    p.fnOnResult = func(handledJob Job) {}

    tasks := 10
    for tasksCnt > 0; tasksCnt-- {
        p.Submit(&Job{})
    }
    p.Stop()
}
Design
The key difference from canonical pool [2] is an absence of a common job queue. Instead, there is a common queue of idle workers [1][2].
Features / properties
  • The producer (submitting a job) is unlocked as soon as a idle worker consumes the job, thus potentially reducing the time producer is blocked.
  • Number of workers increases on demand from minWorkers to maxWorkers
  • You may have as many types of jobs as you like
References
  1. Go: Worker Pool vs Pool of Workers
  2. Go by Example: Worker Pools
  3. Handling 1 Million Requests per Minute with Go

суббота, 2 ноября 2019 г.

Рекомендации по безопасной работе в интернете

Рекомендации по безопасности в интернете

Ниже приводятся рекомендации по защите персональных данных и минимизации последствий различных атак.

  1. Двухфакторная авторизация (2FA).
    Используйте двухфакторную авторизацию не на основе SMS, т.к. злоумышленник может перехватить смс-ы (через восстановление сим-карты по подложным документам). Для этого установите на телефон такое приложение как Google Authenticator или Authy. Можно пойти еще дальше и повысить безопасность, используя в качестве второго фактора аппаратный ключ безопасности, например YubiKey. Его сложно подделать. Для выполнения атаки злоумышленнику придется получить физический доступ к ключу.

  2. Google Voice 2FA.
    В некоторых случаях онлайновые сервисы поддерживает только слабый второй фактор на основе SMS. В этих случаях создайте номер телефона Google Voice (который нельзя перенести на SIM-карту) и используйте его.

  3. Сократите свое присутствие в Интернете.
    Уменьшите потребность в бесполезном обмене личной информацией (дата рождения, местоположение, фотографии с геолокационными данными, встроенными в них и т.д.) Все эти практически общедоступные данные могут быть использованы против вас в случае атаки.

  4. Создайте дополнительный адрес электронной почты.
    Вместо того, чтобы связывать все с одним адресом электронной почты, создайте дополнительный адрес для своих критически важных сетевых идентификаторов (банковских счетов, учетных записей социальных сетей, криптообменников и т.д.). Не используйте этот адрес электронной почты для чего-либо еще и держите его в секрете. Защитите этот адрес с помощью аппаратного ключа 2FA.

  5. Автономный менеджер паролей. Используйте менеджер паролей для хранения ваших паролей, а еще лучше -- автономный менеджер паролей, например KeePass.

  6. Для синхронизации файлов между устройствами используйте программы на основе криптографии и peer-to-peer (P2P) протокола, например SyncThing.

  7. Браузерные расширения.
    Браузерные расширения могут перехватывать конфиденциальную информацию и выполнять нежелаемые действия от вашего имени как то: ставить дизлайки, снимать лайки и прочее, поэтому необходимо удалить все расширения, в надежности которых вы не уверены и почистить систему.

  8. При использовании Git / Github настройте цифровую подпись при фиксации коммита в локальный репозиторий.   


пятница, 1 ноября 2019 г.

Pros and cons of different request authorisation methods


In this diagram I recap pros and cons of different request authorisation methods
Diagram 1

https://coggle.it/diagram/XYjL2hz2iucAFw24/t/request-authentication-methods


Request authentication methods


COOKIE
  • Requires CSRF for POSTs (hidden field or cookie)


OAuth Token - cons
  • Redirects are not supported as
  • Token is held in memory
  • Problem with previous auth session in hydra. Logging out requires IDToken
  • Problem with having a planned session expiry, say it, expire within 1h of inactivity, we dont control OAuth token expiration
  • Security policy enforcement is hard to impl.
  • IP-address tracking based
  • Logout some / all  sessions


JWT
  • Any desired custom attribute can be added to token
  • We can control expiration as needed
  • We can "remember" previous sessions and let user to choose
  • User can selectively log out any session / on any device


Remarks
  • Login form needs to be protected by CSRF in any way
  • For REST apps CSRF can be generated once -- on logging in


среда, 1 мая 2019 г.

Inplace column type alteration in Postgres: jsonb <-> hstore

In one of my projects I had to migrate localization resources, stored in jsonb to a plain hstore to reduce storage space and complexity.

Here comes an example of the direct and reverse DDL operations:


ALTER TABLE resources
    ALTER COLUMN name TYPE hstore
    USING hstore('ru', (name->'translate'->>'ru'))||hstore('en', (name->'translate'->>'en'));



ALTER TABLE resources
    ALTER COLUMN name TYPE jsonb
    USING json_build_object('translate', json_build_object('ru', name->'ru', 'en', name->'en'));

суббота, 23 февраля 2019 г.

Скидки на занятия английским и не только / English classes discounts

English Ninjas

Sign up with referral code and earn 10 free minutes.
Buy a package and earn additional 50 free minutes.
Link: https://englishninjas.com/signup?referral_code=nxDCFWGT


Italki

Дарим по 10$ после первого платного занятия.
Italki -- cоцсеть для изучения иностранных языков. Бесплатная практика иностранного языка по обмену, платные занятия с преподавателями. Цены демократичные -- от 5$ за часовое занятие. Регистрируйтесь по ссылке,  и после занятия получите 10$ на счет. Занятия с иностранными преподавателями, носителями языка.

Ссылка для регистрации: https://www.italki.com/i/EAA6bB?hl=ru