Tryb proxy (poprawne certyfiakty SSL, Let's Encrypt)

Moderator: fracz

Awatar użytkownika
lesny8
Posty: 2808
Rejestracja: pn gru 11, 2017 9:43 pm

PuteR pisze: pn gru 10, 2018 5:02 pm lesny8 masz jakiś sposób jak sobie i z tym poradzić
Oczywiście, wspomniałem o tym wyżej zanim zrodziło się pytanie ;)
lesny8 pisze: ndz gru 09, 2018 11:08 am Myślę bardziej nad tym czy nie utworzyć na malinie jakiegoś serwera DNS i na nim statyczny wpis i rozdawać adres malinki jako pierwszy serwer DNS przez DHCP. Wtedy obeszło by się bez konfigurowania statycznych wpisów w plikach hosts na maszynach, które łączą się po domenie.
Biorąc pod lupę zaproponowane rozwiązanie, wdrożyłem je u siebie i przetestowałem.

Poniżej instrukcja jak to prosto uruchomić.
Mamy RPI z zainstalowanym dockerem, więc dlaczego by tego nie wykorzystać? Znalazłem ciekawy obraz z wbudowanym panelem do zarządzania, który idealnie nada się dla ostatecznego rozwiązania problemu z ograniczeniami jakie stawia FunBox i podobne routery.

Nie wystarczy pobrać obrazu i odpalić kontenera, bo ten obraz nie trawi architektury i kontener się restartuje, zbudujemy zatem sobie obraz sami.

Logujemy się na malinę i klonujemy git-a

Kod: Zaznacz cały

git clone https://github.com/sameersbn/docker-bind
Podczas budowania obrazu dostałem błąd spowodowany brakiem webmina w wersji 1.8, zmieniamy wartość tej zmiennej na aktualną wersję, czyli 1.9
Edytujemy

Kod: Zaznacz cały

cd docker-bind
nano Dockerfile

Kod: Zaznacz cały

WEBMIN_VERSION=1.9 \
i budujemy obraz, kropka nie jest tu przypadkiem

Kod: Zaznacz cały

docker build -t sameersbn/bind .
Przerwa na kawę ;)

Po pomyślnym zbudowaniu obrazu, możemy uruchomić kontener. Moglibyśmy skorzystać z docker-compose, ale tak też jak najbardziej można

Kod: Zaznacz cały

docker run -d --name=bind --restart always --dns=8.8.8.8 \
-p 53:53/udp -p 10000:10000 \
--volume=/srv/docker/bind:/data \
--env='ROOT_PASSWORD=silnehaslo' \
sameersbn/bind:latest
objaśnienie tego co ważniejsze
--dns=8.8.8.8 DNS do którego odpytywać będzie nasz bind, możemy zmienić na jaki chcemy może być orangowy 194.204.152.34, który znajdziemy w konfiguracji routera, osobiście zostawiłbym DNS googla.
--volume=/srv/docker/bind:/data podmontowanie lokalnych zasobów, aby dane nie umarły razem z kontenerem
--env='ROOT_PASSWORD=silnehaslo' hasło dla użytkownika root do panelu webmin

Po uruchomieniu kontenera sprawdzamy sobie, czy działa kierując zapytanie na bramkę binda

Kod: Zaznacz cały

docker ps
docker logs bind
host www.google.pl 172.17.0.1
Powinniśmy dostać coś w ten deseń, oczywiście adres serwera google może być inny

Kod: Zaznacz cały

Using domain server:
Name: 172.17.0.1
Address: 172.17.0.1#53
Aliases: 

www.google.pl has address 172.217.20.195
www.google.pl has IPv6 address 2a00:1450:401b:806::2003
Założyłem, że malina ma adres 192.168.0.2, a domena którą chcemy rozwiązywać lokalnie to noip.pl. Dla aplikacji są przewidziane subdomeny cloud i scripts. Sieć z której będziemy odpytywać to 192.168.0.0/24.

Przechodzimy do przeglądarki internetowej i logujemy się poprzez https do webmina przy użyciu silnego hasła przekazanego wcześniej w zmiennej podczas uruchamiania kontenera
https://192.168.0.2:10000

Teraz miało być kilka obrazków, ale post ma ograniczenie w załącznikach do 3 więc musiałem spakować.
steps.zip
(330.47 KiB) Pobrany 170 razy
01. Wybieramy BIND DNS Server,
02. Przechodzimy do ustawień dostępu,
03. Ustawiamy dostęp do naszego serwera dla naszej klasy adresowej i lokalnych sieci na malinie,
04. Przechodzimy do ustawień domyślnych strefy,
05. Włączamy dostęp dla zdefiniowanej listy,
06. Tworzymy naszą główną strefę,
07. Podajemy nazwę domeny, nameserver i adres mail, tworzymy wpis,
08. Przechodzimy do dodawania adresów w strefie,
09. Wprowadzamy namserver, adres IP naszego RPI i tworzymy wpis,
10. Wracamy do edycji strefy,
11. Przechodzimy do dodawania subdomen,
12. Podajemy nazwy subdomen i wskazujemy na nameserver, i na końcu kropka,
13. j.w.
14. Zatwierdzamy konfigurację,

Możemy teraz sprawdzić czy na RPI dostaniemy rozwiązanie naszych subdomen kierując tym razem zapytanie na interfejs maliny

Kod: Zaznacz cały

host cloud.noip.pl 192.168.0.2
powinna być odpowiedź

Kod: Zaznacz cały

Using domain server:
Name: 192.168.0.2
Address: 192.168.0.2#53
Aliases: 

cloud.noip.pl is an alias for ns.noip.pl.
ns.noip.pl has address 192.168.0.2
Dla subdomeny scripts podobnie

Kod: Zaznacz cały

host scripts.noip.pl 192.168.0.2
odpowiedź

Kod: Zaznacz cały

Using domain server:
Name: 192.168.0.2
Address: 192.168.0.2#53
Aliases: 

scripts.noip.pl is an alias for ns.noip.pl.
ns.noip.pl has address 192.168.0.2
Kontrolnie sprawdzamy dla google

Kod: Zaznacz cały

host www.google.com 192.168.0.2
Using domain server:
Name: 192.168.0.2
Address: 192.168.0.2#53
Aliases: 

www.google.com has address 216.58.215.68
www.google.com has IPv6 address 2a00:1450:401b:806::2004
Jeżeli mamy taką odpowiedź dla obu naszych subdomen i google to pozostało nam zmienić DNS w FunBoxie
dns_funbox.jpg
dns_funbox.jpg (28.04 KiB) Przejrzano 4607 razy
Po tym zabiegu wszystkie zapytania o adresy IP kierowane do routera skierowane zostaną do RPI a tam do kontenera bind a ten do ustawionego DNS googla, ale dla naszej strefy zapytania zostaną rozwiązane przez bind.

Będąc poza domem uruchamiając na czymkolwiek cloud.noip.pl i scripts.noip.pl, DNS operatora rozwiąże nam nazwę i trafimy przez przekierowane porty do proxy i tam do odpowiedniego kontenera. Będąc w domu natomiast w sieci LAN te same domeny będzie rozwiązywać nam nasz bind, dzięki czemu można ostatecznie stwierdzić, że NAT Loopback nie jest nam w routerach już taki niezbędny :mrgreen:

P.S.
1. Wcześniejsze zmiany w plikach hosts można śmiało wycofać.
2. Trzeba mieć świadomość, że po zgaszeniu maliny braknie nam internetu ;)
Ostatnio zmieniony ndz gru 16, 2018 12:53 am przez lesny8, łącznie zmieniany 1 raz.
Czekam na kolejne Supla Offline Party 👍
Awatar użytkownika
PuteR
Posty: 1421
Rejestracja: śr gru 06, 2017 10:07 am

W wolnej chwili sprawdzę u siebie to rozwiązanie i dam znać :], ale co tam musi działać :D
Awatar użytkownika
PuteR
Posty: 1421
Rejestracja: śr gru 06, 2017 10:07 am

lesny8, wszystko poszło OK ale w ostatnim punkcie gdzie trzeba zmienić adres DNS na routerze jest problem bo chyba nie da się tego zrobić :| pola są wpisane na stałe i nie mam możliwości ich zmiany :(

P.S - taki komunikat jest po prawej stronie.

Kod: Zaznacz cały

DNS
Serwery DNS są ustawiane automatycznie i nie mogą być modyfikowane.
Wklepalem DNS w telefonie i wszystko działa jak należy 😁 strony łączą się ok i działa automate. W sumie mi to wystarcza. Przy takim rozwiązaniu mam rozumieć że w przypadku jak by malina paldla bądź została wyłączona internet dalej będzie wszędzie z wyjątkiem telefonu, czy tak?
Awatar użytkownika
PuteR
Posty: 1421
Rejestracja: śr gru 06, 2017 10:07 am

lesny8 mam problem, wszystko działało dobrze aż do czasu jak zmuszony byłem zrestartować malinę. Teraz sam cloud i skrypty działają natomiast te ostatnie zmiany już nie. Tj. nie mogę się łączyć z telefonu i automate nie działa.

po użyciu komendy host czy to na google czy na swoj serwer wywala taki błąd

Kod: Zaznacz cały

 ;; connection timed out; no servers could be reached
na webmina też nie mogę się zalogować. Czy trzeba coś zrestartować??
Awatar użytkownika
lesny8
Posty: 2808
Rejestracja: pn gru 11, 2017 9:43 pm

Ale topór z tego FunBoxa wrrrr.... Dobra, nie ma co przeżywać, bo w łatwy sposób można ten problem rozwiązać.
Skoro RPI robi już za serwer DNS to może też przy okazji robić za serwer DHCP, tylko że bezpośrednio na poziomie Raspbiana, a nie w kontenerze. Można by było serwer DHCP odpalić w bind i zarządzać przez webmina, ale jak kontener z jakiegoś powodu nie wystartuje to żaden host nie dostanie adresu.

Konfiguracja nie jest wcale skomplikowana, logujemy się na malinę i edytujemy plik

Kod: Zaznacz cały

nano /etc/dhcpcd.conf

Zakładam, że sieć to 192.168.0.0/24, FunBox NAT-uje i jest pod adresem 192.168.0.1, a malina ma adres 192.168.0.2.
Trzeba w tym pliku zdefiniować na stałe adres IP dla interfejsu sieciowego. Nie wiem, czy wykorzystujesz eth0 czy wlan0, zmień sobie odpowiednio.

Kod: Zaznacz cały

interface wlan0
static ip_address=192.168.0.2/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.2
teraz robimy restart interfejsów

Kod: Zaznacz cały

sudo service networking restart
i instalujemy serwer DHCP

Kod: Zaznacz cały

sudo apt install isc-dhcp-server
po instalacji edytujemy plik

Kod: Zaznacz cały

sudo nano /etc/dhcp/dhcpd.conf
konfigurujemy naszą podsieć, zakres rozdawanych adresów, wskazujemy bramkę i serwer DNS

Kod: Zaznacz cały

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.3 192.168.0.254;
  option routers 192.168.0.1;
  option domain-name-servers 192.168.0.2;
}
przeładujemy jeszcze

Kod: Zaznacz cały

sudo dhcpd -cf /etc/dhcp/dhcpd.conf
i na koniec gasimy DHCP w FunBoxie
dhcp.jpg
dhcp.jpg (38.23 KiB) Przejrzano 4520 razy
Od tej pory w sieci istnieje tylko jeden serwer DHCP rozdający adresy IP z właściwym DNS :D
Ostatnio zmieniony ndz gru 16, 2018 1:04 am przez lesny8, łącznie zmieniany 1 raz.
Czekam na kolejne Supla Offline Party 👍
Awatar użytkownika
lesny8
Posty: 2808
Rejestracja: pn gru 11, 2017 9:43 pm

PuteR pisze: ndz gru 16, 2018 12:47 am na webmina też nie mogę się zalogować. Czy trzeba coś zrestartować??
Zapomniałem o opcji restartu, zmieniłem już w poście odnoszącym się do DNS.
Zatrzymaj kontener i go usuń

Kod: Zaznacz cały

docker stop bind && docker rm bind
Utwórz i uruchom jeszcze raz z opcją restartu

Kod: Zaznacz cały

docker run -d --name=bind --restart always --dns=8.8.8.8 \
-p 53:53/udp -p 10000:10000 \
--volume=/srv/docker/bind:/data \
--env='ROOT_PASSWORD=silnehaslo' \
sameersbn/bind:latest
i będzie się już uruchamiać po restarcie ;)
Czekam na kolejne Supla Offline Party 👍
Awatar użytkownika
PuteR
Posty: 1421
Rejestracja: śr gru 06, 2017 10:07 am

lesny8 widzę, że masz sposób na wszystko co mnie bardzo cieszy.

Na chwilę obecną działa to tak jak wcześniej czyli muszę DNS zmienić w telefonie.

Chyba coś nie tak konfiguruję przy ustawianiu DHCP bo dostaję taki błąd:

Kod: Zaznacz cały

pi@raspberrypi:~ $ sudo dhcpd -cf /etc/dhcp/dhcpd.conf
Internet Systems Consortium DHCP Server 4.3.5
Copyright 2004-2016 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
/etc/dhcp/dhcpd.conf line 52: expecting numeric value.
  range 192.168.1.2 192.168.254.;
                                ^
/etc/dhcp/dhcpd.conf line 58: unexpected end of file
#}
  ^
Configuration file errors encountered -- exiting

If you think you have received this message due to a bug rather
than a configuration issue please read the section on submitting
bugs on either our web page at www.isc.org or in the README file
before submitting a bug.  These pages explain the proper
process and the information we find helpful for debugging..

exiting.
A tak wygląda plik dhcp.conf

Kod: Zaznacz cały

# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#

# option definitions common to all supported networks...
#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;


#default-lease-time 600;
#max-lease-time 7200;

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
#log-facility local7;

# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.

#subnet 10.152.187.0 netmask 255.255.255.0 {
#}

# This is a very basic subnet declaration.

#subnet 10.254.239.0 netmask 255.255.255.224 {
#  range 10.254.239.10 10.254.239.20;
#  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
#}

# This declaration allows BOOTP clients to get dynamic addresses,
# which we don't really recommend.

#subnet 10.254.239.32 netmask 255.255.255.224 {
#  range dynamic-bootp 10.254.239.40 10.254.239.60;
#  option broadcast-address 10.254.239.31;
#  option routers rtr-239-32-1.example.org;
#}

# A slightly different configuration for an internal subnet.
  subnet 192.168.1.0 netmask 255.255.255.224 {
  range 192.168.1.2 192.168.254.;
  option domain-name-servers 192.168.1.81;
#  option domain-name "internal.example.org";
  option routers 192.168.1.1;
#  option broadcast-address 10.5.5.31;
  default-lease-time 600;
  max-lease-time 7200;
  #}

# Hosts which require special configuration options can be listed in
# host statements.   If no address is specified, the address will be
# allocated dynamically (if possible), but the host-specific information
# will still come from the host declaration.

#host passacaglia {
#  hardware ethernet 0:0:c0:5d:bd:95;
#  filename "vmunix.passacaglia";
#  server-name "toccata.example.com";
#}

# Fixed IP addresses can also be specified for hosts.   These addresses
# should not also be listed as being available for dynamic assignment.
# Hosts for which fixed IP addresses have been specified can boot using
# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
# be booted with DHCP, unless there is an address range on the subnet
# to which a BOOTP client is connected which has the dynamic-bootp flag
# set.
#host fantasia {
#  hardware ethernet 08:00:07:26:c0:a5;
#  fixed-address fantasia.example.com;
#}

# You can declare a class of clients and then do address allocation
# based on that.   The example below shows a case where all clients
# in a certain class get addresses on the 10.17.224/24 subnet, and all
# other clients get addresses on the 10.0.29/24 subnet.
#class "foo" {
#  match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
#}

#shared-network 224-29 {
#  subnet 10.17.224.0 netmask 255.255.255.0 {
#    option routers rtr-224.example.org;
#  }
#  subnet 10.0.29.0 netmask 255.255.255.0 {
#    option routers rtr-29.example.org;
#  }
#  pool {
#    allow members of "foo";
#    range 10.17.224.10 10.17.224.250;
#  }
#  pool {
#    deny members of "foo";
#    range 10.0.29.10 10.0.29.230;
#  }
#}

Awatar użytkownika
lesny8
Posty: 2808
Rejestracja: pn gru 11, 2017 9:43 pm

:)
Tu jest błąd, zabrakło jednego oktetu.

Kod: Zaznacz cały

  range 192.168.1.2 192.168.254.;
Oczywiście tak skonfigurowana podsieć nie będzie działać prawidłowo, bo maska ogranicza do 32 hostów a chciałeś pewnie rozdawać więcej, dlatego zamiast modyfikować przykłady dodaj na końcu pliku to co niżej. To co zmieniałeś zakomentuj. Opcje dotyczące czasu dzierżawy są ustawione domyślnie na początku pliku, więc nie trzeba ich powtarzać, chyba, że chcesz czas wydłużyć co nie jest wcale złym pomysłem.
Ustawienia kopiuj-wklej dla Ciebie

Kod: Zaznacz cały

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.2 192.168.1.80;
  range 192.168.1.82 192.168.1.254;
  option routers 192.168.1.1;
  option domain-name-servers 192.168.1.81;
  default-lease-time 86400;
  max-lease-time 172800;
}
i załaduj

Kod: Zaznacz cały

sudo dhcpd -cf /etc/dhcp/dhcpd.conf
a najlepiej później zrób reboot

Kod: Zaznacz cały

sudo reboot
i zobacz czy wszystko będzie działać prawidłowo.
Czekam na kolejne Supla Offline Party 👍
Awatar użytkownika
PuteR
Posty: 1421
Rejestracja: śr gru 06, 2017 10:07 am

Wcześniej jakoś nie miałem czasu do tego przysiąść, lesny8 czy tak powinien wyglądać w moim przypadku plik dhcpd.conf??

Kod: Zaznacz cały

# Hosts which require special configuration options can be listed in
# host statements.   If no address is specified, the address will be
# allocated dynamically (if possible), but the host-specific information
# will still come from the host declaration.

#host passacaglia {
#  hardware ethernet 0:0:c0:5d:bd:95;
#  filename "vmunix.passacaglia";
#  server-name "toccata.example.com";
#}

# Fixed IP addresses can also be specified for hosts.   These addresses
# should not also be listed as being available for dynamic assignment.
# Hosts for which fixed IP addresses have been specified can boot using
# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
# be booted with DHCP, unless there is an address range on the subnet
# to which a BOOTP client is connected which has the dynamic-bootp flag
# set.
#host fantasia {
#  hardware ethernet 08:00:07:26:c0:a5;
#  fixed-address fantasia.example.com;
#}

# You can declare a class of clients and then do address allocation
# based on that.   The example below shows a case where all clients
# in a certain class get addresses on the 10.17.224/24 subnet, and all
# other clients get addresses on the 10.0.29/24 subnet.

#class "foo" {
#  match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
#}

#shared-network 224-29 {
#  subnet 10.17.224.0 netmask 255.255.255.0 {
#    option routers rtr-224.example.org;
#  }
#  subnet 10.0.29.0 netmask 255.255.255.0 {
#    option routers rtr-29.example.org;
#  }
#  pool {
#    allow members of "foo";
#    range 10.17.224.10 10.17.224.250;
#  }
#  pool {
#    deny members of "foo";
#    range 10.0.29.10 10.0.29.230;
#  }
#}
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.2 192.168.1.80;
  range 192.168.1.82 192.168.1.254;
  option routers 192.168.1.1;
  option domain-name-servers 192.168.1.81;
  default-lease-time 86400;
  max-lease-time 172800;
}
i jeszcze jedno pytanko :] zauważyłem że po restarcie maliny mimo tego że plik rc.local mam wyedytowany to za każdym razem procesy i tak muszę uruchamiać sam. Czy coś tam jednak mam nie tak?? Oczywiście login i hasło mam wpisane swoje :]

Kod: Zaznacz cały

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
/usr/local/bin/noip.client-arm -u login -p hasło -d supla73.noip.pl -b 5
/usr/local/bin/noip.client-arm -u login -p hasło -d suplascripts73.noip.pl -b 5
exit 0
Awatar użytkownika
lesny8
Posty: 2808
Rejestracja: pn gru 11, 2017 9:43 pm

PuteR pisze: śr gru 19, 2018 11:28 pm czy tak powinien wyglądać w moim przypadku plik dhcpd.conf??
Tak
PuteR pisze: śr gru 19, 2018 11:28 pm zauważyłem że po restarcie maliny mimo tego że plik rc.local mam wyedytowany to za każdym razem procesy i tak muszę uruchamiać sam. Czy coś tam jednak mam nie tak??
Sprawdziłem u siebie i faktycznie tak jest, ale nie mam pojęcia dlaczego.
Sprawę aktualizacji adresów w DNS można zrealizować poprzez uruchamianie skryptu w systemowym cronie.

Zaloguj się do maliny i utwórz sobie skrypt np.

Kod: Zaznacz cały

nano update_dns.sh 
wypełnij wpisując odpowiednio login i hasło

Kod: Zaznacz cały

#!/bin/bash

/usr/local/bin/noip.client-arm -u login -p hasło -d supla73.noip.pl
/usr/local/bin/noip.client-arm -u login -p hasło -d suplascripts73.noip.pl
zapisz i nadaj uprawnienia do wykonywania

Kod: Zaznacz cały

chmod +x update_dns.sh
edytuj systemowego crona

Kod: Zaznacz cały

sudo nano /etc/crontab
i na końcu pliku dodaj

Kod: Zaznacz cały

*/5 * * * *    pi      /home/pi/update_dns.sh
zrestartuj crona a najlepiej maline

Kod: Zaznacz cały

sudo reboot
Aha i nie zapomnij usunąć lub zahashować wprowadzonych wcześniej zmian w pliku rc.local
Uzyskasz w ten sposób efekt taki sam jak z procesem działającym w tle. Crone co 5 minut uruchomiać będzie skrypt, który wywoła dwa razy klienta DDNS z odpowiednimi parametrami.
Czekam na kolejne Supla Offline Party 👍
ODPOWIEDZ

Wróć do „supla-docker”