Skip to content

[BUG] TCP Port Forwarding не работает при Fully Routed IPs #385

@Gercov

Description

@Gercov

📝 Описание проблемы

После обновления до Podkop 0.7.19 TCP Port Forwarding всё ещё не работает, если используется Fully Routed IPs.

У меня в Fully Routed IPs указана вся LAN-подсеть:

192.168.1.0/24

При этом настроен обычный проброс порта через LuCI:

WAN TCP 443 -> 192.168.1.10:443

Если Podkop выключить — порт снаружи открывается.

Если Podkop включить — порт снаружи не открывается.

В PodkopTable mangle правило ct status dnat return есть, но оно стоит ниже правил для Fully Routed IPs:

iifname @interfaces ip saddr 192.168.1.0/24 meta l4proto udp meta mark set 0x00100000 counter
iifname @interfaces ip saddr 192.168.1.0/24 meta l4proto tcp meta mark set 0x00100000 counter
ct status dnat return

Похоже, из-за этого DNAT-трафик сначала получает mark 0x00100000, и только потом доходит до ct status dnat return.

Для проверки я временно вставлял такое правило самым верхним:

nft insert rule inet PodkopTable mangle ct status dnat counter return comment "DEBUG_DNAT_RETURN_TOP"

После этого port forwarding сразу начинал работать.

Шаги для воспроизведения

  1. Включить Podkop.
  2. В Fully Routed IPs указать LAN-подсеть:
192.168.1.0/24
  1. Настроить TCP Port Forwarding через LuCI:
WAN TCP 443 -> 192.168.1.10:443
  1. Проверить доступ к порту снаружи.
  2. Выключить Podkop.
  3. Проверить этот же порт ещё раз.

✅ Ожидаемое поведение

TCP Port Forwarding должен работать при включённом Podkop, даже если используется Fully Routed IPs.

DNAT/port-forwarded соединения не должны маркироваться в VPN/tproxy.

🖥️ Информация о системе

OpenWrt: 25.12.4 r32933-4ccb782af7
Target: mediatek/filogic
Device: Xiaomi Mi Router AX3000T
Board: xiaomi,mi-router-ax3000t
Kernel: 6.12.87
Architecture: aarch64_cortex-a53

podkop: 0.7.19-r1
luci-app-podkop: 0.7.19-r1
luci-i18n-podkop-ru: 0.260601.34183
sing-box: 1.12.17-r1
firewall4: 2025.03.17~b6e51575-r2
nftables-json: 1.1.6-r1
dnsmasq: 2.91-r3

⚙️ Конфигурация

Podkop config

podkop.settings.dns_type='udp'
podkop.settings.dns_server='77.88.8.8'
podkop.settings.bootstrap_dns_server='77.88.8.8'
podkop.settings.dns_rewrite_ttl='60'
podkop.settings.source_network_interfaces='br-lan'
podkop.settings.enable_output_network_interface='0'
podkop.settings.enable_badwan_interface_monitoring='0'
podkop.settings.enable_yacd='0'
podkop.settings.disable_quic='0'
podkop.settings.update_interval='1d'
podkop.settings.download_lists_via_proxy='0'
podkop.settings.dont_touch_dhcp='0'
podkop.settings.config_path='/etc/sing-box/config.json'
podkop.settings.cache_path='/tmp/sing-box/cache.db'
podkop.settings.log_level='warn'
podkop.settings.exclude_ntp='0'
podkop.settings.shutdown_correctly='0'

podkop.main.connection_type='proxy'
podkop.main.proxy_config_type='url'
podkop.main.enable_udp_over_tcp='0'
podkop.main.proxy_string='<REDACTED>'
podkop.main.user_domain_list_type='disabled'
podkop.main.user_subnet_list_type='disabled'
podkop.main.mixed_proxy_enabled='0'
podkop.main.resolve_real_ip_for_routing='0'
podkop.main.fully_routed_ips='192.168.1.0/24'

Firewall redirect

firewall.@redirect[0]=redirect
firewall.@redirect[0].dest='lan'
firewall.@redirect[0].target='DNAT'
firewall.@redirect[0].name='SWAG HTTPS'
firewall.@redirect[0].proto='tcp'
firewall.@redirect[0].src='wan'
firewall.@redirect[0].src_dport='443'
firewall.@redirect[0].dest_ip='192.168.1.10'
firewall.@redirect[0].dest_port='443'

nft -a list chain inet PodkopTable mangle

table inet PodkopTable {
    chain mangle {
        type filter hook prerouting priority mangle; policy accept;
        ip saddr 192.168.1.0/24 ip daddr @localv4 return # handle 22
        iifname @interfaces ip saddr 192.168.1.0/24 meta l4proto udp meta mark set 0x00100000 counter packets 68 bytes 12861 # handle 21
        iifname @interfaces ip saddr 192.168.1.0/24 meta l4proto tcp meta mark set 0x00100000 counter packets 423 bytes 168708 # handle 20
        ct status dnat return # handle 7
        iifname @interfaces ip daddr @podkop_subnets meta l4proto tcp meta mark set 0x00100000 counter packets 0 bytes 0 # handle 8
        iifname @interfaces ip daddr @podkop_subnets meta l4proto udp meta mark set 0x00100000 counter packets 0 bytes 0 # handle 9
        iifname @interfaces ip daddr 198.18.0.0/15 meta l4proto tcp meta mark set 0x00100000 counter packets 0 bytes 0 # handle 10
        iifname @interfaces ip daddr 198.18.0.0/15 meta l4proto udp meta mark set 0x00100000 counter packets 0 bytes 0 # handle 11
    }
}

Проверка с временным правилом

Временно вставлял правило выше всех остальных:

nft insert rule inet PodkopTable mangle ct status dnat counter return comment "DEBUG_DNAT_RETURN_TOP"

После этого TCP Port Forwarding сразу начинал работать.

Это временное правило удалено из вывода выше.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions