Temat: Złe trasowanie ruchu

Serdecznie wszystkich witam. Posiadam następującą konfigurację na urządzeniu z bezpośrednim dostępem do publicznego IP:

root@OpenWrt:~# for i in network firewall; do uci show $i; echo; done
network.loopback=interface
network.loopback.ifname='lo'
network.loopback.proto='static'
network.loopback.ipaddr='127.0.0.1'
network.loopback.netmask='255.0.0.0'
network.globals=globals
network.wan=interface
network.wan.proto='static'
network.wan.force_link='1'
network.wan.ipv6='0'
network.wan.ipaddr='51.68.x.x'
network.wan.netmask='255.255.248.0'
network.wan.gateway='51.68.136.1'
network.wan.dns='1.1.1.1'
network.wan.delegate='0'
network.wan.ifname='eth0'
network.@rule[0]=rule
network.@rule[0].mark='255'
network.@rule[0].lookup='252'
network.@route[0]=route
network.@route[0].gateway='51.68.136.1'
network.@route[0].interface='wan'
network.@route[0].target='0.0.0.0/0'
network.@route[0].table='mgmt'
network.@route[1]=route
network.@route[1].netmask='255.255.248.0'
network.@route[1].target='51.68.136.0'
network.@route[1].interface='wan'
network.@route[1].table='mgmt'

firewall.@defaults[0]=defaults
firewall.@defaults[0].input='DROP'
firewall.@defaults[0].output='DROP'
firewall.@defaults[0].forward='DROP'
firewall.@defaults[0].syn_flood='1'
firewall.@defaults[0].drop_invalid='1'
firewall.@zone[0]=zone
firewall.@zone[0].name='wan'
firewall.@zone[0].mtu_fix='1'
firewall.@zone[0].network='wan'
firewall.@zone[0].forward='DROP'
firewall.@zone[0].input='DROP'
firewall.@zone[0].masq='1'
firewall.@zone[0].family='ipv4'
firewall.@zone[0].output='DROP'
firewall.@include[0]=include
firewall.@include[0].path='/etc/firewall.user'
firewall.@rule[0]=rule
firewall.@rule[0].name='EnableDirectMgmt'
firewall.@rule[0].target='MARK'
firewall.@rule[0].proto='tcp'
firewall.@rule[0].family='ipv4'
firewall.@rule[0].set_mark='255'
firewall.@rule[0].src_port='x'
firewall.@rule[0].dest='*'
firewall.@rule[0].src_ip='51.68.136.1'
firewall.@rule[1]=rule
firewall.@rule[1].src='*'
firewall.@rule[1].family='ipv6'
firewall.@rule[1].target='DROP'
firewall.@rule[1].dest='*'
firewall.@rule[1].proto='all'
firewall.@rule[1].name='BlockIPv6-frwd'
firewall.@rule[2]=rule
firewall.@rule[2].src='*'
firewall.@rule[2].family='ipv6'
firewall.@rule[2].proto='all'
firewall.@rule[2].target='DROP'
firewall.@rule[2].name='BlockIPv6-in'
firewall.@rule[3]=rule
firewall.@rule[3].proto='all'
firewall.@rule[3].dest='*'
firewall.@rule[3].target='DROP'
firewall.@rule[3].family='ipv6'
firewall.@rule[3].name='BlockIPv6-out'
firewall.@rule[4]=rule
firewall.@rule[4].src='wan'
firewall.@rule[4].family='ipv4'
firewall.@rule[4].target='ACCEPT'
firewall.@rule[4].name='AllowMgmt-inwan'
firewall.@rule[4].dest_port='x'
firewall.@rule[4].proto='tcp'
firewall.@rule[5]=rule
firewall.@rule[5].family='ipv4'
firewall.@rule[5].target='ACCEPT'
firewall.@rule[5].dest='wan'
firewall.@rule[5].name='AllowMgmt-outwan'
firewall.@rule[5].mark='255'
firewall.@rule[5].src_port='x'
firewall.@rule[5].proto='tcp'
firewall.@rule[6]=rule
firewall.@rule[6].proto='all'
firewall.@rule[6].name='AllowVPN-outwan'
firewall.@rule[6].dest='wan'
firewall.@rule[6].extra='-m owner --uid-owner openvpn'
firewall.@rule[6].target='ACCEPT'
firewall.@rule[6].family='ipv4'

root@OpenWrt:~# cat /etc/iproute2/rt_tables 
#
# reserved values
#
128    prelocal
255    local
254    main
253    default
0    unspec
252    mgmt
#
# local
#
#1    inr.ruhep

Założenie jest takie, by do internetu mogło wyjść tylko openvpn, reszta ma być na eth0 blokowana. Konfiguracja openvpn z kolei jest zrobiona tak, że przy podłączeniu do serwera ten ustawia bramę główną na siebie, więc urządzenie ma dostęp do internetu po podłączeniu (zakładamy tutaj, że output dla tun0 jest dozwolony).

Problem rodzi się gdy muszę administrować urządzeniem zdalnie. Jeżeli otworzę odpowiednie porty, to otrzymuje ono zapytanie, natomiast ze względu na gw odpowiedź jest routowana przez vpn i do mnie nie trafia (tzn. trafia ale z IP VPN i na innym porcie). Dlatego mam oddzielną tablicę dla trafficu trafiającego na port x ssh. Jeżeli zechcę poadministrować, to przez KVM włączam regułę 'EnableDirectMgmt' i mam dostęp ssh.

Niestety, nie działa to jak należy. Po nawiązaniu połączenia ovpn urządzenie na porcie x nie odpowiada. Dopiero gdy dodam ip route add z moim IP i poprzednim gw do main mogę się połączyć, co wskazywałoby na to, że kernel nadal korzysta z tablicy main, a nie mgmt. Tak być nie powinno, bo po mangle output kernel powinien ponownie sprawdzić trasowanie.

Co robię źle?

2

Odp: Złe trasowanie ruchu

1. czyli masz urządzenie np. "R" (jak router) z publicznym ip, ale do internetu wychodzisz za pomocą tunelu ovpn przez inny serwer ovpn np. "S" (jak serwer) z innym publicznym ip.
2. chcesz się dostać z zewnątrz do urządzenia "R" ale już bezpośrednio na jego adres publiczny, żeby nie korzystać z usług serwera "S" i jego tunelu.

tak?

MrCiek4wski napisał/a:

...
Dlatego mam oddzielną tablicę dla trafficu trafiającego na port x ssh
...
network.wan.ipaddr='51.68.x.x'                # to jest Twój IP na WAN (inny adres niż bramy)
network.wan.netmask='255.255.248.0'
network.wan.gateway='51.68.136.1'        # tu jest brama (inny adres niż na WAN)
...
firewall.@rule[0].src_port='x'                    # x - to jest numer Twojego portu ssh na WAN
firewall.@rule[0].dest='*'
firewall.@rule[0].src_ip='51.68.136.1'      # i jednocześnie port o numerze x jest na bramie (src_port + src_ip)
...
firewall.@rule[4].src='wan'
firewall.@rule[4].family='ipv4'
firewall.@rule[4].target='ACCEPT'
firewall.@rule[4].name='AllowMgmt-inwan'
firewall.@rule[4].dest_port='x'                    # i ten sam numer portu x dla ssh masz u siebie na WAN
...

Czyli wychodzi na to, że z zewnątrz wbijasz się na adres IP bramy na port x (a nie na swój własny adres) a ona przekierowuje zapytania ze świata na Twój adres na  WAN-ie też na port x i jeszcze ukrywa adres nadawcy:

51.68.136.1:x      ->      51.68.x.x:x
Xiaomi AX3000T @ Netgear R6220
* DVBT2 - T230C *

3

Odp: Złe trasowanie ruchu

@mar_w
1. Dokładnie tak
2. Dokładnie tak

No tak, dziękuję za zauważenie tej kosmicznej gafy... No, trochę wstyd jak na taki błąd. Brama nie jest moja, a providera i ja nie mam do niej żadnego dostępu, ani żadnych personalnych configów dnat czy snat. Jej jedynym zadaniem jest przekazywanie ruchu z mojej publicznej podsieci, więc wbić się mogę tylko na moje publiczne IP. Także zamiast

firewall.@rule[0].src_ip='51.68.136.1'

powinno być:

firewall.@rule[0].src_ip='51.68.x.x'

To by też wyjaśniało powód braku reroutów w kernelu, przecież pakiety wychodzą z moim IP, a nie bramy, więc nie były markowane.



Mam jeszcze tylko jedno pytanie teoretyczne.

Aby takie ustawienie działało (tj. wszystko na bramę tun0 za wyjątkiem markowanych pakietów, które mają iść na bramę eth0) trzeba było ręcznie wypełnić nową tablicę trasowania (u mnie 'mgmt') z routingem dla eth0. W przypadku stałego IP to nie jest problem. Natomiast jak coś takiego skonfigurować, gdy dostajemy adres i bramę dynamicznie (z dhcp)?