tpws: fc00::/7 private range. PF convert ipv4 to ipv6 mapped address

This commit is contained in:
bol-van 2022-01-23 17:33:37 +03:00
parent 17d161267e
commit 013f3996df
8 changed files with 33 additions and 17 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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. Он добавится к автоматически настраеваемым.

View File

@ -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

View File

@ -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;
} }

View File

@ -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;