From 3345bf55b0ba0cf7d1406a151b6035331292cfee Mon Sep 17 00:00:00 2001
From: bol-van <none@none.none>
Date: Sat, 22 Jan 2022 14:36:36 +0300
Subject: [PATCH] bsd docs: pfsense info

---
 docs/bsd.eng.md | 28 +++++++++++++++++++++++++++-
 docs/bsd.txt    | 30 ++++++++++++++++++++++++++++--
 2 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/docs/bsd.eng.md b/docs/bsd.eng.md
index 372b622..f0d3cd3 100644
--- a/docs/bsd.eng.md
+++ b/docs/bsd.eng.md
@@ -2,7 +2,7 @@
 
 FreeBSD 11.x+ , OpenBSD 6.x+, partially MacOS Sierra+
 
-Older versions may work or not. pfSense is not supported.
+Older versions may work or not.
 
 ## BSD features
 
@@ -168,6 +168,32 @@ then
 Its not clear how to do rdr-to outgoing traffic. I could not make route-to scheme work.
 
 
+## pfsense
+
+pfsense is based on FreeBSD.
+Binaries compiled in compatible FreeBSD versions shoud work.
+It's been tested that dvtws binary from FreeBSD 13 works on pfsense 2.5.2 with FreeBSD kernel 12.2.
+pfsense uses pf firewall which does not support divert.
+Fortunately ipfw and ipdivert modules are present and can be kldload-ed.
+It's also necessary to change firewall order using sysctl commands.
+Sometimes pf may limit dvtws abilities. It scrubs ip fragments disabling dvtws ipfrag2 desync mode.
+If something is absent, no ipfw.ko/ipdivert.ko or binaries do not work - try the latest pfsense version.
+
+/usr/local/etc/rc.d/zapret.sh  (chmod 755)
+```
+#!/bin/sh
+
+kldload ipfw
+kldload ipdivert
+sysctl net.inet.ip.pfil.outbound=ipfw,pf
+sysctl net.inet.ip.pfil.inbound=ipfw,pf
+sysctl net.inet6.ip6.pfil.outbound=ipfw,pf
+sysctl net.inet6.ip6.pfil.inbound=ipfw,pf
+ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg
+dvtws --daemon --port 989 --dpi-desync=split2
+```
+
+
 ## OpenBSD
 
 In OpenBSD default tpws bind is ipv6 only. to bind to ipv4 specify --bind-addr=0.0.0.0
diff --git a/docs/bsd.txt b/docs/bsd.txt
index 3ab4019..e4f9811 100644
--- a/docs/bsd.txt
+++ b/docs/bsd.txt
@@ -6,8 +6,7 @@ FreeBSD 11.x+ , OpenBSD 6.x+, частично MacOS Sierra+
 На более старых может собираться, может не собираться, может работать или не работать.
 На FreeBSD 10 собирается и работает dvtws. С tpws есть проблемы из-за слишком старой версии компилятора clang.
 Вероятно, будет работать, если обновить компилятор.
-На pfSense если и можно завести, то это не просто. Собранные на FreeBSD с той же версией ядра бинарики не работают.
-Статические бинарики тоже. Модуль ipdivert отсутствует.
+Возможна прикрутка к последним версиям pfsense без веб интерфейса в ручном режиме через консоль.
 
 
 Особенности BSD систем
@@ -164,6 +163,33 @@ rdr pass on em1 inet  proto tcp to port {80,443} -> 127.0.0.1 port 988
 В PF непонятно как делать rdr-to с той же системы, где работает proxy. Вариант с route-to у меня не заработал.
 
 
+pfsense
+-------
+
+pfsense основано на FreeBSD.
+На последних версиях pfsense работают бинарики, собранные в FreeBSD совместимых версий.
+Проверено, что бинарик dvtws с FreeBSD 13 сработал на pfsense 2.5.2 с ядром FreeBSD 12.2.
+pfsense использует фаервол pf, а он не поддерживает divert.
+К счастью, модули ipfw и ipdivert присутствуют в поставке последних версий pfsense.
+Их можно подгрузить через kldload. Еще требуется изменить порядок фаерволов через sysctl, сделав ipfw первым.
+В некоторых случаях фаервол pf может ограничивать возможности dvtws, в частности в области фрагментации ip.
+Присутствуют по умолчанию правила scrub для реассемблинга фрагментов.
+
+/usr/local/etc/rc.d/zapret.sh  (chmod 755)
+-----------
+#!/bin/sh
+
+kldload ipfw
+kldload ipdivert
+sysctl net.inet.ip.pfil.outbound=ipfw,pf
+sysctl net.inet.ip.pfil.inbound=ipfw,pf
+sysctl net.inet6.ip6.pfil.outbound=ipfw,pf
+sysctl net.inet6.ip6.pfil.inbound=ipfw,pf
+ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg
+dvtws --daemon --port 989 --dpi-desync=split2
+-----------
+
+
 OpenBSD
 -------