Archiwa kategorii: Linux/Unix

Połączenie OpenVPN site-to-site między EdgeRouterem a Debianem

Tak na szybko aby nie uleciało 🙂

  1. Logujemy się na EdgeRouter i z poziomu usera (nie configure) generujemy klucz wspólny:
    ubnt@router:~$ generate vpn openvpn-key /config/auth/openvpn-s2s-secret
    Generating OpenVPN key to /config/auth/openvpn-s2s-secret
    Your new local OpenVPN key has been generated
    ubnt@router:~$
  2. Konfigurujemy VPNa od strony EdgeRoutera (w naszym przypadku EdgeRouter ma zewnętrzne stałe IP a Debian będzie się do niego „dopinał”):
    ubnt@router:~$ configure
    ubnt@router# set interfaces openvpn vtun0 local-address 10.1.254.1
    ubnt@router# set interfaces openvpn vtun0 local-port 1195
    ubnt@router# set interfaces openvpn vtun0 mode site-to-site
    ubnt@router# set interfaces openvpn vtun0 openvpn-option --comp-lzo
    ubnt@router# set interfaces openvpn vtun0 openvpn-option --float
    ubnt@router# set interfaces openvpn vtun0 openvpn-option '--ping 10'
    ubnt@router# set interfaces openvpn vtun0 openvpn-option '--ping-restart 20'
    ubnt@router# set interfaces openvpn vtun0 openvpn-option --ping-timer-rem
    ubnt@router# set interfaces openvpn vtun0 openvpn-option --persist-tun
    ubnt@router# set interfaces openvpn vtun0 openvpn-option --persist-key
    ubnt@router# set interfaces openvpn vtun0 openvpn-option '--user nobody'
    ubnt@router# set interfaces openvpn vtun0 openvpn-option '--group nogroup'
    ubnt@router# set interfaces openvpn vtun0 remote-address 10.1.254.2
    ubnt@router# set interfaces openvpn vtun0 shared-secret-key-file /config/auth/openvpn-s2s-secret
    ubnt@router# commit
    ubnt@router# save

    Gdzie:
    10.1.254.1 – IP Edge Routera na interfejsie VPN
    10.1.254.2 – IP Debiana na interfejsie VPN
    1195 – port VPNa
    /config/auth/openvpn-s2s-secret – nazwa wygenerowanego wcześniej pliku z kluczem

  3. Na debianie instalujemy OpenVPNa
  4. Przenosimy plik /config/auth/openvpn-s2s-secret z EdgeRoutera na debiana jako /etc/openvpn/secret (jest to zwykły plik tekstowy można na routerze użyć sudo cat /config/auth/openvpn-s2s-secret i po prostu wkleić go na Debianie
  5. Tworzymy konfig VPNa na debianie w pliki /etc/openvpn/s2s.conf (IP.IP.IP.IP to IP EdgeRoutera):
    dev vtun0
    dev-type tun
    ping 10
    ping-restart 60
    ifconfig 10.1.254.2 10.1.254.1
    lport 1195
    rport 1195
    proto udp
    remote IP.IP.IP.IP
    secret /etc/openvpn/secret
    comp-lzo
    ping-timer-rem
    persist-tun
    persist-key
    user nobody
    group nogroup
    float
    script-security 2
  6. Włączamy autostart połączenia razem z systemem:
    systemctl enable openvpn@s2s.service
  7. Włączamy połączenie VPN:
    systemctl start openvpn@mhrok.service
  8. W tym momencie powinniśmy mieć już możliwość pingowania po adresach VPN (10.1.254.1 <-> 10.1.254.2)
  9. Jeżeli dodatkowo chcemy połączyć se sobą podłączone sieci, to musimy dodać trasy routingu. Na EdgeRouterze wykonujemy polecenie:
    ubnt@router# set protocols static interface-route 10.1.2.0/24 next-hop-interface vtun0
    

    (gdzie 10.1.2.0/24 to sieć od strony debiana)

  10. Na debianie sprawa jest utrudniona. Tworzymy skrypt /etc/openvpn/s2s-up.sh o zawartości:
    #!/bin/sh
    /sbin/ip route add 10.1.1.0/24 dev $dev
    

    (gdzie 10.1.1.0/24 to sieć po stronie  EdgeRoutera).
    Nadajemy mu prawa do wykonania:

    chmod +x /etc/openvpn/s2s-up.sh

    i do pliku konfiguracyjnego /etc/openvpn/s2s.conf dopisujemy:

    up /etc/openvpn/s2s-up.sh
  11. Pozostaje tylko zresetować VPNa (na debianie):
    systemctl restart openvpn@s2s.service

    i wszystko powinno zacząć działać.

  12. Dla pewności możemy sprawdzić tablice routingu.
    Na Debianie:

    wyprz ~ # ip route
    default via 10.1.2.1 dev eth0 onlink 
    10.1.1.0/24 dev vtun0 scope link 
    10.1.2.0/24 dev eth0 proto kernel scope link src 10.1.2.2 
    10.1.254.1 dev vtun0 proto kernel scope link src 10.1.254.2 
    169.254.0.0/16 dev eth0 scope link metric 1000

    Na EdgeRouterze:

    ubnt@router:~$ show ip route
    Codes: K - kernel, C - connected, S - static, R - RIP, B - BGP
           O - OSPF, IA - OSPF inter area
           N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
           E1 - OSPF external type 1, E2 - OSPF external type 2
           > - selected route, * - FIB route, p - stale info
    IP Route Table for VRF "default"
    S    *> 0.0.0.0/0 [210/0] via 89.71.140.1, eth4
    C    *> 10.1.1.0/24 is directly connected, eth0
    S    *> 10.1.2.0/24 [1/0] is directly connected, vtun0
    C    *> 10.1.254.1/32 is directly connected, vtun0
    C    *> 10.1.254.2/32 is directly connected, vtun0
    C    *> 89.71.140.0/22 is directly connected, eth4
    C    *> 127.0.0.0/8 is directly connected, lo

NetiaSpot w trybie bridge + Router Ubiquiti

Nie wiem czy tylko ja mam takiego pecha, ale po przełączeniu NetiaSpot w tryb bridge, mimo poprawnego zestawiania się połączenia PPPoE na routerze Ubiquiti, nie da się nawiązać żadnego połączenia TCP. Problemem jest nieprawidłowa wartość MSS (maksymalny rozmiar transmitowanego segmentu TCP) ustawiana dla połączeń wychodzących przez interfejs PPPoE. Rozwiązaniem tego problemu jest następująca konfiguracja:

set firewall modify pppoe-out rule 1 action modify
set firewall modify pppoe-out rule 1 modify tcp-mss 1452
set firewall modify pppoe-out rule 1 protocol tcp
set firewall modify pppoe-out rule 1 tcp flags SYN
set interfaces ethernet eth3 pppoe 0 firewall out modify pppoe-out

Zakładjąc oczywiście że interfejsem na którym ma działać PPPoE jest eth3 a numer interfejsu pppoe wynosi 0.

Po tej zmianie interfejs ładnie się podnosi i wszystko działa jak trzeba.

nginx autoryzacja spoza sieci lokalnej

Jakiś czas temu opisywałem jak za pomocą lighttpd wymagać logowania do podstrony jedynie z internetu (a z sieci lokalnej wpuszczać bez logowania). Dziś identyczna konfiguracja, dla serwera nginx:

location ~ /coś/ {
    satisfy any;
    allow 10.1.1.0/24;
    deny all;
    auth_basic "Strefa prywatna";
    auth_basic_user_file "/etc/nginx/htpasswd";
}

Podziękowania dla winnetou za pomoc w rozwiązaniu.

Autoryzacja tylko z poza sieci lokalnej w lighttpd

Załóżmy że chcemy udostępnić część zasobów serwera WWW wszystkim użytkownikom sieci lokalnej, zachowując dodatkowo możliwość dostania się do nich z internetu, po wprowadzeniu hasła. W takim wypadku z pomocą przychodzi nam serwer lighttpd. Wystarczy w pliku konfiguracyjnym odpowiednio uformować warunki:

$HTTP["remoteip"] != "10.1.1.0/24" {
        $HTTP["url"] =~ "^/rutorrent/" {
                auth.require = ( "" => (
                                        "method" => "digest",
                                        "realm" => "Strefa prywatna",
                                        "require" => "valid-user"
                                ) )
        }
}

I już osoby z internetu muszą się logować a użytkownicy sieci lokalnej korzystają do woli 🙂

Vyatta – Hairpin NAT

Działający Hairpin NAT (przekierowanie portów działające z zewnątrz i z wewnątrz):

set nat destination rule 10 destination address $IP_ZEWN
set nat destination rule 10 destination port $PORT
set nat destination rule 10 inbound-interface any
set nat destination rule 10 protocol $PROTO
set nat destination rule 10 translation address $IP_DOCELOWE
set nat destination rule 10 translation port $PORT
set nat source rule 10 destination address $IP_DOCELOWE
set nat source rule 10 destination port $PORT
set nat source rule 10 outbound-interface $LAN_IF
set nat source rule 10 protocol tcp
set nat source rule 10 source address $LAN_NET
set nat source rule 10 translation address masquerade
  • $IP_ZEWN – zewnętrzny IP routera
  • $PORT – przekierowywany port
  • $PROTO – protokół (tcp/udp)
  • $IP_DOCELOWE – wewnętrzne IP w lanie
  • $LAN_IF – interfejs sieci LAN
  • $LAN_NET – podsieć LANu (np. 10.0.0.0/24)