mirror of
https://github.com/bol-van/zapret.git
synced 2024-12-02 06:30:53 +03:00
tpws: always compile PF support, use --enable-pf flag in FreeBSD
This commit is contained in:
parent
0f55960460
commit
cc5f0af5a8
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -16,11 +16,6 @@ To compile sources in FreeBSD use `make`, in OpenBSD - use `make bsd`, in MacOS
|
|||||||
|
|
||||||
Compile all programs : `make -C /opt/zapret`
|
Compile all programs : `make -C /opt/zapret`
|
||||||
|
|
||||||
Compile all programs with PF support : `make -C /opt/zapret CFLAGS=-DUSE_PF`
|
|
||||||
|
|
||||||
In FreeBSD enable PF only if you use it. Its undesirable if you don't.
|
|
||||||
PF is enabled automatically in OpenBSD and MacOS.
|
|
||||||
|
|
||||||
Divert sockets are internal type sockets in the BSD kernel. They have no relation to network addresses
|
Divert sockets are internal type sockets in the BSD kernel. They have no relation to network addresses
|
||||||
or network packet exchange. They are identified by a port number `1..65535`. Its like queue number in NFQUEUE.
|
or network packet exchange. They are identified by a port number `1..65535`. Its like queue number in NFQUEUE.
|
||||||
Traffic can be diverted to a divert socket using firewall rule.
|
Traffic can be diverted to a divert socket using firewall rule.
|
||||||
@ -147,7 +142,7 @@ ipv4 frames are filtered using 'sockarg'.
|
|||||||
|
|
||||||
PF in FreeBSD:
|
PF in FreeBSD:
|
||||||
The setup is similar to OpenBSD, but there are important nuances.
|
The setup is similar to OpenBSD, but there are important nuances.
|
||||||
1) Don't forget to build special PF-enabled version of tpws : make CFLAGS=-DUSE_PF
|
1) Don't forget to use special tpws parameter `--enable-pf`
|
||||||
2) It's not possible to redirect to ::1. Need to redirect to the link-local address of the incoming interface.
|
2) It's not possible to redirect to ::1. Need to redirect to the link-local address of the incoming interface.
|
||||||
Look for fe80:... address in ifconfig and use it for redirection target.
|
Look for fe80:... address in ifconfig and use it for redirection target.
|
||||||
3) pf.conf syntax is a bit different from OpenBSD.
|
3) pf.conf syntax is a bit different from OpenBSD.
|
||||||
@ -228,11 +223,10 @@ rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::20c:29ff:5ae3:4821 por
|
|||||||
Autostart '/usr/local/etc/rc.d/zapret.sh' :
|
Autostart '/usr/local/etc/rc.d/zapret.sh' :
|
||||||
```
|
```
|
||||||
pfctl -a zapret -f /etc/zapret.anchor
|
pfctl -a zapret -f /etc/zapret.anchor
|
||||||
pkill ^tpws_pf$
|
pkill ^tpws$
|
||||||
tpws_pf --daemon --port=988 --split-http-req=method --split-pos=2
|
tpws --daemon --port=988 --split-http-req=method --split-pos=2
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that the special tpws version is used which supports PF.
|
|
||||||
After reboot check that anchor is created and referred from the main ruleset :
|
After reboot check that anchor is created and referred from the main ruleset :
|
||||||
```
|
```
|
||||||
[root@pfSense /]# pfctl -s nat
|
[root@pfSense /]# pfctl -s nat
|
||||||
|
11
docs/bsd.txt
11
docs/bsd.txt
@ -21,9 +21,7 @@ FreeBSD содержит 3 фаервола : IPFilter, ipfw и Packet Filter (P
|
|||||||
Под FreeBSD tpws и dvtws собираются через "make", под OpenBSD - "make bsd", под MacOS - "make mac".
|
Под FreeBSD tpws и dvtws собираются через "make", под OpenBSD - "make bsd", под MacOS - "make mac".
|
||||||
FreeBSD make распознает BSDmakefile , OpenBSD и MacOS - нет. Поэтому там используется отдельный target в Makefile.
|
FreeBSD make распознает BSDmakefile , OpenBSD и MacOS - нет. Поэтому там используется отдельный target в Makefile.
|
||||||
Сборка всех исходников : make -C /opt/zapret
|
Сборка всех исходников : make -C /opt/zapret
|
||||||
Сборка всех исходников с поддержкой PF : make -C /opt/zapret CFLAGS=-DUSE_PF
|
В FreeBSD поддержка PF в tpws отключена по умолчанию. Чтобы ее включить, нужно использовать параметр --enable-pf.
|
||||||
В FreeBSD поддержку PF нужно включать только, если вы его используете. Иначе это нежелательно !
|
|
||||||
В OpenBSD и MacOS PF при сборке включается автоматически.
|
|
||||||
|
|
||||||
divert сокет - внутренний тип сокета ядра BSD. Он не привязывается ни к какому сетевому адресу, не участвует
|
divert сокет - внутренний тип сокета ядра BSD. Он не привязывается ни к какому сетевому адресу, не участвует
|
||||||
в обмене данными через сеть и идентифицируется по номеру порта 1..65535. Аналогия с номером очереди NFQUEUE.
|
в обмене данными через сеть и идентифицируется по номеру порта 1..65535. Аналогия с номером очереди NFQUEUE.
|
||||||
@ -146,7 +144,7 @@ dvtws в FreeBSD отсылает ipv4 фреймы через raw socket. Та
|
|||||||
|
|
||||||
PF в FreeBSD:
|
PF в FreeBSD:
|
||||||
Настройка аналогична OpenBSD, но есть важные нюансы.
|
Настройка аналогична OpenBSD, но есть важные нюансы.
|
||||||
1) Не забыть собрать специальную версию под PF : make CFLAGS=-DUSE_PF
|
1) Не забыть указать параметр --enable-pf
|
||||||
2) Нельзя сделать ipv6 rdr на ::1. Нужно делать на link-local адрес входящего интерфейса.
|
2) Нельзя сделать ipv6 rdr на ::1. Нужно делать на link-local адрес входящего интерфейса.
|
||||||
Смотрите через ifconfig адрес fe80:... и добавляете в правило
|
Смотрите через ifconfig адрес fe80:... и добавляете в правило
|
||||||
3) Синтаксис pf.conf немного отличается. Более новая версия PF.
|
3) Синтаксис pf.conf немного отличается. Более новая версия PF.
|
||||||
@ -227,11 +225,10 @@ rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::20c:29ff:5ae3:4821 por
|
|||||||
Добавьте в автозапуск /usr/local/etc/rc.d/zapret.sh :
|
Добавьте в автозапуск /usr/local/etc/rc.d/zapret.sh :
|
||||||
-----------
|
-----------
|
||||||
pfctl -a zapret -f /etc/zapret.anchor
|
pfctl -a zapret -f /etc/zapret.anchor
|
||||||
pkill ^tpws_pf$
|
pkill ^tpws$
|
||||||
tpws_pf --daemon --port=988 --split-http-req=method --split-pos=2
|
tpws --daemon --port=988 --enable-pf --split-http-req=method --split-pos=2
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
Обратите внимание, что запускается специальная версия tpws с поддежкой pf. Обычный tpws не работает с PF.
|
|
||||||
После перезагрузки проверьте, что правила создались :
|
После перезагрузки проверьте, что правила создались :
|
||||||
-----------
|
-----------
|
||||||
[root@pfSense /]# pfctl -s nat
|
[root@pfSense /]# pfctl -s nat
|
||||||
|
@ -7,7 +7,6 @@ all: tpws
|
|||||||
|
|
||||||
tpws: $(SRC_FILES)
|
tpws: $(SRC_FILES)
|
||||||
$(CC) $(CFLAGS) -Iepoll-shim/include -o $@ $(SRC_FILES) epoll-shim/src/*.c $(LDFLAGS) $(LIBS)
|
$(CC) $(CFLAGS) -Iepoll-shim/include -o $@ $(SRC_FILES) epoll-shim/src/*.c $(LDFLAGS) $(LIBS)
|
||||||
$(CC) $(CFLAGS) -Iepoll-shim/include -o $@_pf $(SRC_FILES) -DUSE_PF epoll-shim/src/*.c $(LDFLAGS) $(LIBS)
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f tpws tpws_pf *.o
|
rm -f tpws *.o
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <sys/param.h>
|
||||||
#include "strpool.h"
|
#include "strpool.h"
|
||||||
|
|
||||||
enum splithttpreq { split_none = 0, split_method, split_host };
|
enum splithttpreq { split_none = 0, split_method, split_host };
|
||||||
@ -46,6 +47,10 @@ struct params_s
|
|||||||
strpool *hostlist;
|
strpool *hostlist;
|
||||||
|
|
||||||
int debug;
|
int debug;
|
||||||
|
|
||||||
|
#if defined(BSD)
|
||||||
|
bool pf_enable;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct params_s params;
|
extern struct params_s params;
|
||||||
|
@ -10,25 +10,19 @@
|
|||||||
#include "params.h"
|
#include "params.h"
|
||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
|
|
||||||
//#if !defined(USE_PF) && defined(__OpenBSD__)
|
|
||||||
#if !defined(USE_PF) && (defined(__OpenBSD__) || defined(__APPLE__))
|
|
||||||
#define USE_PF 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <linux/netfilter_ipv4.h>
|
#include <linux/netfilter_ipv4.h>
|
||||||
#ifndef IP6T_SO_ORIGINAL_DST
|
#ifndef IP6T_SO_ORIGINAL_DST
|
||||||
#define IP6T_SO_ORIGINAL_DST 80
|
#define IP6T_SO_ORIGINAL_DST 80
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_PF
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <net/pfvar.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(BSD)
|
||||||
|
|
||||||
|
#include <net/if.h>
|
||||||
|
#include <net/pfvar.h>
|
||||||
|
|
||||||
#if defined(USE_PF)
|
|
||||||
static int redirector_fd=-1;
|
static int redirector_fd=-1;
|
||||||
|
|
||||||
void redir_close()
|
void redir_close()
|
||||||
@ -54,7 +48,7 @@ static bool redir_open_private(const char *fname, int flags)
|
|||||||
}
|
}
|
||||||
bool redir_init()
|
bool redir_init()
|
||||||
{
|
{
|
||||||
return redir_open_private("/dev/pf", O_RDONLY);
|
return params.pf_enable ? redir_open_private("/dev/pf", O_RDONLY) : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool destination_from_pf(const struct sockaddr *accept_sa, struct sockaddr_storage *orig_dst)
|
static bool destination_from_pf(const struct sockaddr *accept_sa, struct sockaddr_storage *orig_dst)
|
||||||
@ -209,8 +203,8 @@ bool get_dest_addr(int sockfd, const struct sockaddr *accept_sa, struct sockaddr
|
|||||||
}
|
}
|
||||||
if (orig_dst->ss_family==AF_INET6)
|
if (orig_dst->ss_family==AF_INET6)
|
||||||
((struct sockaddr_in6*)orig_dst)->sin6_scope_id=0; // or MacOS will not connect()
|
((struct sockaddr_in6*)orig_dst)->sin6_scope_id=0; // or MacOS will not connect()
|
||||||
#ifdef USE_PF
|
#ifdef BSD
|
||||||
if (!destination_from_pf(accept_sa, orig_dst))
|
if (params.pf_enable && !destination_from_pf(accept_sa, orig_dst))
|
||||||
DBGPRINT("pf filter destination_from_pf failed");
|
DBGPRINT("pf filter destination_from_pf failed");
|
||||||
#endif
|
#endif
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
14
tpws/tpws.c
14
tpws/tpws.c
@ -139,6 +139,9 @@ static void exithelp()
|
|||||||
" --pidfile=<filename>\t\t; write pid to file\n"
|
" --pidfile=<filename>\t\t; write pid to file\n"
|
||||||
" --user=<username>\t\t; drop root privs\n"
|
" --user=<username>\t\t; drop root privs\n"
|
||||||
" --uid=uid[:gid]\t\t; drop root privs\n"
|
" --uid=uid[:gid]\t\t; drop root privs\n"
|
||||||
|
#if defined(BSD) && !defined(__OpenBSD__) && !defined(__APPLE__)
|
||||||
|
" --enable-pf\t\t\t; enable PF redirector support. required in FreeBSD when used with PF firewall.\n"
|
||||||
|
#endif
|
||||||
" --debug=0|1|2\t\t\t; 0(default)=silent 1=verbose 2=debug\n"
|
" --debug=0|1|2\t\t\t; 0(default)=silent 1=verbose 2=debug\n"
|
||||||
"\nTAMPERING:\n"
|
"\nTAMPERING:\n"
|
||||||
" --hostlist=<filename>\t\t; only act on host in the list (one host per line, subdomains auto apply)\n"
|
" --hostlist=<filename>\t\t; only act on host in the list (one host per line, subdomains auto apply)\n"
|
||||||
@ -205,6 +208,9 @@ void parse_params(int argc, char *argv[])
|
|||||||
params.maxconn = DEFAULT_MAX_CONN;
|
params.maxconn = DEFAULT_MAX_CONN;
|
||||||
params.max_orphan_time = DEFAULT_MAX_ORPHAN_TIME;
|
params.max_orphan_time = DEFAULT_MAX_ORPHAN_TIME;
|
||||||
params.binds_last = -1;
|
params.binds_last = -1;
|
||||||
|
#if defined(__OpenBSD__) || defined(__APPLE__)
|
||||||
|
params.pf_enable = true; // OpenBSD and MacOS have no other choice
|
||||||
|
#endif
|
||||||
if (can_drop_root())
|
if (can_drop_root())
|
||||||
{
|
{
|
||||||
params.uid = params.gid = 0x7FFFFFFF; // default uid:gid
|
params.uid = params.gid = 0x7FFFFFFF; // default uid:gid
|
||||||
@ -252,6 +258,9 @@ void parse_params(int argc, char *argv[])
|
|||||||
{ "socks",no_argument,0,0 },// optidx=37
|
{ "socks",no_argument,0,0 },// optidx=37
|
||||||
{ "no-resolve",no_argument,0,0 },// optidx=38
|
{ "no-resolve",no_argument,0,0 },// optidx=38
|
||||||
{ "skip-nodelay",no_argument,0,0 },// optidx=39
|
{ "skip-nodelay",no_argument,0,0 },// optidx=39
|
||||||
|
#if defined(BSD) && !defined(__OpenBSD__) && !defined(__APPLE__)
|
||||||
|
{ "enable-pf",no_argument,0,0 },// optidx=40
|
||||||
|
#endif
|
||||||
{ NULL,0,NULL,0 }
|
{ NULL,0,NULL,0 }
|
||||||
};
|
};
|
||||||
while ((v = getopt_long_only(argc, argv, "", long_options, &option_index)) != -1)
|
while ((v = getopt_long_only(argc, argv, "", long_options, &option_index)) != -1)
|
||||||
@ -485,6 +494,11 @@ void parse_params(int argc, char *argv[])
|
|||||||
case 39: /* skip-nodelay */
|
case 39: /* skip-nodelay */
|
||||||
params.skip_nodelay = true;
|
params.skip_nodelay = true;
|
||||||
break;
|
break;
|
||||||
|
#if defined(BSD) && !defined(__OpenBSD__)
|
||||||
|
case 40: /* enable-pf */
|
||||||
|
params.pf_enable = true;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!params.bind_wait_only && !params.port)
|
if (!params.bind_wait_only && !params.port)
|
||||||
|
Loading…
Reference in New Issue
Block a user