From e665794ac4036df9e802d2865db8b6c32c1d8090 Mon Sep 17 00:00:00 2001 From: bol-van Date: Mon, 7 Jul 2025 15:33:41 +0300 Subject: [PATCH] doc works --- docs/bsd.en.md | 22 ++++++++++++++++++++-- docs/bsd.md | 30 +++++++++++++++++++++++++++--- docs/bsdfw.txt | 13 +++++++++++++ 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/docs/bsd.en.md b/docs/bsd.en.md index d29e728..c561985 100644 --- a/docs/bsd.en.md +++ b/docs/bsd.en.md @@ -312,7 +312,7 @@ In OpenBSD default `tpws` bind is ipv6 only. To bind to ipv4 specify Use `--bind-addr=0.0.0.0 --bind-addr=::` to achieve the same default bind as in others OSes. -`tpws` for forwarded traffic only : +`tpws` for forwarded traffic only (OLDER OS versions): `/etc/pf.conf`: ``` @@ -323,13 +323,31 @@ pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988 Then: ``` pfctl -f /etc/pf.conf -tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 +tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 --enable-pf ``` Its not clear how to do rdr-to outgoing traffic. I could not make route-to scheme work. rdr-to support is done using /dev/pf, that's why transparent mode requires root. +`tpws` for forwarded traffic only (NEWER OS versions): + +``` +pass on em1 inet proto tcp to port {80,443} divert-to 127.0.0.1 port 989 +pass on em1 inet6 proto tcp to port {80,443} divert-to ::1 port 989 +``` + +Then: +``` +pfctl -f /etc/pf.conf +tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 +``` + +tpws must be bound exactly to diverted IPs, not `0.0.0.0` or `::`. + +It's also not clear how to divert connections from local system. + + `dvtws` for all traffic: `/etc/pf.conf`: diff --git a/docs/bsd.md b/docs/bsd.md index 56304d7..d1cbfb7 100644 --- a/docs/bsd.md +++ b/docs/bsd.md @@ -392,7 +392,11 @@ rdr pass on em1 inet6 proto tcp from any to any port = https -> fe80::20c:29ff:5 Но лучше все же так не делать, а сажать на определенные внутренние адреса или интерфейсы. -### tpws для проходящего трафика +### tpws для проходящего трафика (старая схема, не работает в новых версиях) + +В этом варианте tpws обращается явно к редиректору pf и пытается от него получить оригинальный адрес назначения. +Как показывает практика, это не работает на новых версиях OpenBSD. Возвращается ошибка ioctl. +Последняя проверенная версия, где это работает, - 6.8 . Между 6.8 и 7.4 разработчики сломали этот механизм. `/etc/pf.conf`: ``` @@ -402,15 +406,35 @@ pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988 ```sh $ pfctl -f /etc/pf.conf -$ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 +$ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 --enable-pf ``` -> [!NOTE] +> [!NOTE] > В PF не выходит делать rdr-to с той же системы, где работает proxy. > Вариант с route-to не сохраняет мета информацию. Адрес назначения теряется. > Поэтому этот вариант годится для squid, берущего адрес из протокола прикладного уровня, но не годится для tpws, полагающегося на метаданные ОС. > Поддержка rdr-to реализована через `/dev/pf`, поэтому прозрачный режим **требует root**. +### tpws для проходящего трафика (новые системы) + +В новых версиях предлагается использовать divert-to вместо rdr-to. +Минимально проверенная версия, где это работает, 7.4. Может работать или не работать на более старых - исследование не проводилось. + +`/etc/pf.conf`: +``` +pass on em1 inet proto tcp to port {80,443} divert-to 127.0.0.1 port 989 +pass on em1 inet6 proto tcp to port {80,443} divert-to ::1 port 989 +``` + +tpws должен иметь бинд на точно такой адрес, который указан в правилах pf. `0.0.0.0` или `::` не работает. + +```sh +$ pfctl -f /etc/pf.conf +$ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 +``` + +> [!NOTE] +> Так же не понятно как делать divert с самой системы, где работает tpws. ### Запуск dvtws diff --git a/docs/bsdfw.txt b/docs/bsdfw.txt index 8202322..6abd025 100644 --- a/docs/bsdfw.txt +++ b/docs/bsdfw.txt @@ -56,14 +56,27 @@ sysctl net.inet6.ip6.forwarding=1 OpenBSD PF : +(OLD OpenBSD versions) + ; dont know how to rdr-to from local system. doesn't seem to work. only works for routed traffic. /etc/pf.conf pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988 pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988 pfctl -f /etc/pf.conf +/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 --enable-pf + +(NEW OpenBSD versions) + +; dont know how to divert-to from local system + +/etc/pf.conf +pass on em1 inet proto tcp to port {80,443} divert-to 127.0.0.1 port 989 +pass on em1 inet6 proto tcp to port {80,443} divert-to ::1 port 989 +pfctl -f /etc/pf.conf /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 + ; dvtws works both for routed and local pass in quick on em0 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state