diff --git a/binaries/freebsd-x64/tpws b/binaries/freebsd-x64/tpws index d8d76eb..edcb31f 100755 Binary files a/binaries/freebsd-x64/tpws and b/binaries/freebsd-x64/tpws differ diff --git a/binaries/freebsd-x64/tpws_pf b/binaries/freebsd-x64/tpws_pf index c6999fc..e8ead81 100755 Binary files a/binaries/freebsd-x64/tpws_pf and b/binaries/freebsd-x64/tpws_pf differ diff --git a/binaries/mac64/tpws b/binaries/mac64/tpws index bd65ffa..0b475b8 100755 Binary files a/binaries/mac64/tpws and b/binaries/mac64/tpws differ diff --git a/binaries/x86_64/tpws_wsl.tgz b/binaries/x86_64/tpws_wsl.tgz index f2fc1b6..b38f544 100644 Binary files a/binaries/x86_64/tpws_wsl.tgz and b/binaries/x86_64/tpws_wsl.tgz differ diff --git a/docs/bsd.txt b/docs/bsd.txt index 4114082..be87007 100644 --- a/docs/bsd.txt +++ b/docs/bsd.txt @@ -323,7 +323,7 @@ Link locals периодически меняются. Смена завязан Проще всего отказаться от "secured" адресов. Поместите строчку "net.inet6.send.opmode=0" в /etc/sysctl.conf. Затем перезагрузите систему. Все равно для исходящих соединений будут использоваться temporary адреса, как и в других системах. -Или вам идея не по вкусу, можно прописать дополнительный статический ipv6 из диапазона fd00::/8 - +Или вам идея не по вкусу, можно прописать дополнительный статический ipv6 из диапазона fc00::/7 - выберите любой с длиной префикса 128. Это можно сделать в системных настройках, создав дополнительный адаптер на базе того же сетевого интерфейса, отключить в нем ipv4 и вписать статический ipv6. Он добавится к автоматически настраеваемым. diff --git a/docs/readme.txt b/docs/readme.txt index b049733..dcd16af 100644 --- a/docs/readme.txt +++ b/docs/readme.txt @@ -438,16 +438,7 @@ ipv6 : Нет способа для приложения гарантирова Для ядер <4.16 похоже, что нет иного способа решить эту проблему, кроме как выгрузить модуль nf_conntrack, который подтягивает зависимость nf_defrag_ipv6. Он то как раз и выполняет дефрагментацию. Для ядер 4.16+ ситуация чуть лучше. Из дефрагментации исключаются пакеты в состоянии NOTRACK. -На практике это работает для цепочки OUTPUT. Чтобы не загромождать описание, смотрите пример решения этой проблемы в 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 @@ -544,9 +535,9 @@ tpws может биндаться на множество интерфейсо Остальные параметры --bind-* относятся к последнему бинду. Для бинда на все ipv4 укажите --bind-addr "0.0.0.0", на все ipv6 - "::". --bind-addr="" - биндаемся на все ipv4 и ipv6. Выбор режима использования link local ipv6 адресов (fe80::/8) : ---bind-iface6 --bind-linklocal=no : сначала приватный адрес fd00::/8, затем глобальный адрес ---bind-iface6 --bind-linklocal=unwanted : сначала приватный адрес fd00::/8, затем глобальный адрес, затем link local. ---bind-iface6 --bind-linklocal=prefer : сначала link local, затем приватный адрес fd00::/8, затем глобальный адрес. +--bind-iface6 --bind-linklocal=no : сначала приватный адрес fc00::/7, затем глобальный адрес +--bind-iface6 --bind-linklocal=unwanted : сначала приватный адрес fc00::/7, затем глобальный адрес, затем link local. +--bind-iface6 --bind-linklocal=prefer : сначала link local, затем приватный адрес fc00::/7, затем глобальный адрес. --bind-iface6 --bind-linklocal=force : только link local Если не указано ни одного бинда, то создается бинд по умолчанию на все адреса всех интерфейсов. Для бинда на конкретный link-local address делаем так : --bind-iface6=fe80::aaaa:bbbb:cccc:dddd%iface-name diff --git a/tpws/helpers.c b/tpws/helpers.c index eb2936e..37a660e 100644 --- a/tpws/helpers.c +++ b/tpws/helpers.c @@ -165,8 +165,8 @@ bool is_linklocal(const struct sockaddr_in6 *a) } bool is_private6(const struct sockaddr_in6* a) { - // fdf0::/8 - return a->sin6_addr.s6_addr[0]==0xFD; + // fc00::/7 + return (a->sin6_addr.s6_addr[0] & 0xFE) == 0xFC; } diff --git a/tpws/redirect.c b/tpws/redirect.c index 94b22c5..ee7fc44 100644 --- a/tpws/redirect.c +++ b/tpws/redirect.c @@ -60,9 +60,34 @@ bool redir_init() static bool destination_from_pf(const struct sockaddr *accept_sa, struct sockaddr_storage *orig_dst) { struct pfioc_natlook nl; + struct sockaddr_storage asa2; 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) { 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: { 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.saddr.v4.s_addr = ((struct sockaddr_in*)accept_sa)->sin_addr.s_addr; #ifdef __APPLE__ nl.sxport.port = ((struct sockaddr_in*)accept_sa)->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: { 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.saddr.v6 = ((struct sockaddr_in6*)accept_sa)->sin6_addr; #ifdef __APPLE__ nl.sxport.port = ((struct sockaddr_in6*)accept_sa)->sin6_port; nl.dxport.port = sin6->sin6_port;