mirror of
https://github.com/bol-van/zapret.git
synced 2025-01-06 08:20:34 +05:00
tpws: fc00::/7 private range. PF convert ipv4 to ipv6 mapped address
This commit is contained in:
parent
17d161267e
commit
013f3996df
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -323,7 +323,7 @@ Link locals периодически меняются. Смена завязан
|
|||||||
Проще всего отказаться от "secured" адресов.
|
Проще всего отказаться от "secured" адресов.
|
||||||
Поместите строчку "net.inet6.send.opmode=0" в /etc/sysctl.conf. Затем перезагрузите систему.
|
Поместите строчку "net.inet6.send.opmode=0" в /etc/sysctl.conf. Затем перезагрузите систему.
|
||||||
Все равно для исходящих соединений будут использоваться temporary адреса, как и в других системах.
|
Все равно для исходящих соединений будут использоваться temporary адреса, как и в других системах.
|
||||||
Или вам идея не по вкусу, можно прописать дополнительный статический ipv6 из диапазона fd00::/8 -
|
Или вам идея не по вкусу, можно прописать дополнительный статический ipv6 из диапазона fc00::/7 -
|
||||||
выберите любой с длиной префикса 128. Это можно сделать в системных настройках, создав дополнительный адаптер на базе
|
выберите любой с длиной префикса 128. Это можно сделать в системных настройках, создав дополнительный адаптер на базе
|
||||||
того же сетевого интерфейса, отключить в нем ipv4 и вписать статический ipv6. Он добавится к автоматически настраеваемым.
|
того же сетевого интерфейса, отключить в нем ipv4 и вписать статический ipv6. Он добавится к автоматически настраеваемым.
|
||||||
|
|
||||||
|
@ -438,16 +438,7 @@ ipv6 : Нет способа для приложения гарантирова
|
|||||||
Для ядер <4.16 похоже, что нет иного способа решить эту проблему, кроме как выгрузить модуль nf_conntrack,
|
Для ядер <4.16 похоже, что нет иного способа решить эту проблему, кроме как выгрузить модуль nf_conntrack,
|
||||||
который подтягивает зависимость nf_defrag_ipv6. Он то как раз и выполняет дефрагментацию.
|
который подтягивает зависимость nf_defrag_ipv6. Он то как раз и выполняет дефрагментацию.
|
||||||
Для ядер 4.16+ ситуация чуть лучше. Из дефрагментации исключаются пакеты в состоянии NOTRACK.
|
Для ядер 4.16+ ситуация чуть лучше. Из дефрагментации исключаются пакеты в состоянии NOTRACK.
|
||||||
На практике это работает для цепочки OUTPUT.
|
|
||||||
Чтобы не загромождать описание, смотрите пример решения этой проблемы в blockcheck.sh.
|
Чтобы не загромождать описание, смотрите пример решения этой проблемы в blockcheck.sh.
|
||||||
Что касается forwarding, чтобы избежать дефрагментации потребуется залезть еще глубже.
|
|
||||||
Может понадобиться загружать модули iptable_raw и ip6table_raw с параметром raw_before_defrag и
|
|
||||||
переводить в состояние NOTRACK нужные пакеты. Но тем самым вы сломаете NAT и другие stateful операции.
|
|
||||||
Для ipv6 может сработать, поскольку для ipv6 NAT обычно не делается.
|
|
||||||
Альтернативно можно использовать nftables. Там можно задавать кастомные chains с любым приоритетом netfilter,
|
|
||||||
в частности можно сделать цепочку с приоритетом меньше, чем defrag.
|
|
||||||
Вы должны очень хорошо понимать что вы делаете и уметь тщательно проверить что у вас получилось.
|
|
||||||
https://github.com/torvalds/linux/commit/902d6a4c2a4f411582689e53fb101895ffe99028
|
|
||||||
|
|
||||||
|
|
||||||
tpws
|
tpws
|
||||||
@ -544,9 +535,9 @@ tpws может биндаться на множество интерфейсо
|
|||||||
Остальные параметры --bind-* относятся к последнему бинду.
|
Остальные параметры --bind-* относятся к последнему бинду.
|
||||||
Для бинда на все ipv4 укажите --bind-addr "0.0.0.0", на все ipv6 - "::". --bind-addr="" - биндаемся на все ipv4 и ipv6.
|
Для бинда на все ipv4 укажите --bind-addr "0.0.0.0", на все ipv6 - "::". --bind-addr="" - биндаемся на все ipv4 и ipv6.
|
||||||
Выбор режима использования link local ipv6 адресов (fe80::/8) :
|
Выбор режима использования link local ipv6 адресов (fe80::/8) :
|
||||||
--bind-iface6 --bind-linklocal=no : сначала приватный адрес fd00::/8, затем глобальный адрес
|
--bind-iface6 --bind-linklocal=no : сначала приватный адрес fc00::/7, затем глобальный адрес
|
||||||
--bind-iface6 --bind-linklocal=unwanted : сначала приватный адрес fd00::/8, затем глобальный адрес, затем link local.
|
--bind-iface6 --bind-linklocal=unwanted : сначала приватный адрес fc00::/7, затем глобальный адрес, затем link local.
|
||||||
--bind-iface6 --bind-linklocal=prefer : сначала link local, затем приватный адрес fd00::/8, затем глобальный адрес.
|
--bind-iface6 --bind-linklocal=prefer : сначала link local, затем приватный адрес fc00::/7, затем глобальный адрес.
|
||||||
--bind-iface6 --bind-linklocal=force : только link local
|
--bind-iface6 --bind-linklocal=force : только link local
|
||||||
Если не указано ни одного бинда, то создается бинд по умолчанию на все адреса всех интерфейсов.
|
Если не указано ни одного бинда, то создается бинд по умолчанию на все адреса всех интерфейсов.
|
||||||
Для бинда на конкретный link-local address делаем так : --bind-iface6=fe80::aaaa:bbbb:cccc:dddd%iface-name
|
Для бинда на конкретный link-local address делаем так : --bind-iface6=fe80::aaaa:bbbb:cccc:dddd%iface-name
|
||||||
|
@ -165,8 +165,8 @@ bool is_linklocal(const struct sockaddr_in6 *a)
|
|||||||
}
|
}
|
||||||
bool is_private6(const struct sockaddr_in6* a)
|
bool is_private6(const struct sockaddr_in6* a)
|
||||||
{
|
{
|
||||||
// fdf0::/8
|
// fc00::/7
|
||||||
return a->sin6_addr.s6_addr[0]==0xFD;
|
return (a->sin6_addr.s6_addr[0] & 0xFE) == 0xFC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,9 +60,34 @@ bool redir_init()
|
|||||||
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)
|
||||||
{
|
{
|
||||||
struct pfioc_natlook nl;
|
struct pfioc_natlook nl;
|
||||||
|
struct sockaddr_storage asa2;
|
||||||
|
|
||||||
if (redirector_fd==-1) return false;
|
if (redirector_fd==-1) return false;
|
||||||
|
|
||||||
|
if (params.debug>=2)
|
||||||
|
{
|
||||||
|
char s[48],s2[48];
|
||||||
|
*s=0; ntop46_port(accept_sa, s, sizeof(s));
|
||||||
|
*s2=0; ntop46_port((struct sockaddr *)orig_dst, s2, sizeof(s2));
|
||||||
|
DBGPRINT("destination_from_pf %s %s",s,s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
saconvmapped(orig_dst);
|
||||||
|
if (accept_sa->sa_family==AF_INET6 && orig_dst->ss_family==AF_INET)
|
||||||
|
{
|
||||||
|
memcpy(&asa2,accept_sa,sizeof(struct sockaddr_in6));
|
||||||
|
saconvmapped(&asa2);
|
||||||
|
accept_sa = (struct sockaddr*)&asa2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.debug>=2)
|
||||||
|
{
|
||||||
|
char s[48],s2[48];
|
||||||
|
*s=0; ntop46_port(accept_sa, s, sizeof(s));
|
||||||
|
*s2=0; ntop46_port((struct sockaddr *)orig_dst, s2, sizeof(s2));
|
||||||
|
DBGPRINT("destination_from_pf (saconvmapped) %s %s",s,s2);
|
||||||
|
}
|
||||||
|
|
||||||
if (accept_sa->sa_family!=orig_dst->ss_family)
|
if (accept_sa->sa_family!=orig_dst->ss_family)
|
||||||
{
|
{
|
||||||
DBGPRINT("accept_sa and orig_dst sa_family mismatch : %d %d", accept_sa->sa_family, orig_dst->ss_family);
|
DBGPRINT("accept_sa and orig_dst sa_family mismatch : %d %d", accept_sa->sa_family, orig_dst->ss_family);
|
||||||
@ -78,8 +103,8 @@ static bool destination_from_pf(const struct sockaddr *accept_sa, struct sockadd
|
|||||||
case AF_INET:
|
case AF_INET:
|
||||||
{
|
{
|
||||||
struct sockaddr_in *sin = (struct sockaddr_in *)orig_dst;
|
struct sockaddr_in *sin = (struct sockaddr_in *)orig_dst;
|
||||||
nl.saddr.v4.s_addr = ((struct sockaddr_in*)accept_sa)->sin_addr.s_addr;
|
|
||||||
nl.daddr.v4.s_addr = sin->sin_addr.s_addr;
|
nl.daddr.v4.s_addr = sin->sin_addr.s_addr;
|
||||||
|
nl.saddr.v4.s_addr = ((struct sockaddr_in*)accept_sa)->sin_addr.s_addr;
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
nl.sxport.port = ((struct sockaddr_in*)accept_sa)->sin_port;
|
nl.sxport.port = ((struct sockaddr_in*)accept_sa)->sin_port;
|
||||||
nl.dxport.port = sin->sin_port;
|
nl.dxport.port = sin->sin_port;
|
||||||
@ -92,8 +117,8 @@ static bool destination_from_pf(const struct sockaddr *accept_sa, struct sockadd
|
|||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)orig_dst;
|
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)orig_dst;
|
||||||
nl.saddr.v6 = ((struct sockaddr_in6*)accept_sa)->sin6_addr;
|
|
||||||
nl.daddr.v6 = sin6->sin6_addr;
|
nl.daddr.v6 = sin6->sin6_addr;
|
||||||
|
nl.saddr.v6 = ((struct sockaddr_in6*)accept_sa)->sin6_addr;
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
nl.sxport.port = ((struct sockaddr_in6*)accept_sa)->sin6_port;
|
nl.sxport.port = ((struct sockaddr_in6*)accept_sa)->sin6_port;
|
||||||
nl.dxport.port = sin6->sin6_port;
|
nl.dxport.port = sin6->sin6_port;
|
||||||
|
Loading…
Reference in New Issue
Block a user