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

Moderator: fracz

User avatar
lesny8
Posts: 2814
Joined: Mon Dec 11, 2017 9:43 pm

Post

PuteR wrote: Mon Dec 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 wrote: Sun Dec 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

Code: Select all

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

Code: Select all

cd docker-bind
nano Dockerfile

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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
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

Code: Select all

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

Code: Select all

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

Code: Select all

host scripts.noip.pl 192.168.0.2
odpowiedź

Code: Select all

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

Code: Select all

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
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 ;)
You do not have the required permissions to view the files attached to this post.
Last edited by lesny8 on Sun Dec 16, 2018 12:53 am, edited 1 time in total.
Czekam na kolejne Supla Offline Party 👍
User avatar
PuteR
Posts: 1422
Joined: Wed Dec 06, 2017 10:07 am

Post

W wolnej chwili sprawdzę u siebie to rozwiązanie i dam znać :], ale co tam musi działać :D
User avatar
PuteR
Posts: 1422
Joined: Wed Dec 06, 2017 10:07 am

Post

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.

Code: Select all

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?
User avatar
PuteR
Posts: 1422
Joined: Wed Dec 06, 2017 10:07 am

Post

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

Code: Select all

 ;; connection timed out; no servers could be reached
na webmina też nie mogę się zalogować. Czy trzeba coś zrestartować??
User avatar
lesny8
Posts: 2814
Joined: Mon Dec 11, 2017 9:43 pm

Post

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

Code: Select all

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.

Code: Select all

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

Code: Select all

sudo service networking restart
i instalujemy serwer DHCP

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

sudo dhcpd -cf /etc/dhcp/dhcpd.conf
i na koniec gasimy DHCP w FunBoxie
dhcp.jpg
Od tej pory w sieci istnieje tylko jeden serwer DHCP rozdający adresy IP z właściwym DNS :D
You do not have the required permissions to view the files attached to this post.
Last edited by lesny8 on Sun Dec 16, 2018 1:04 am, edited 1 time in total.
Czekam na kolejne Supla Offline Party 👍
User avatar
lesny8
Posts: 2814
Joined: Mon Dec 11, 2017 9:43 pm

Post

PuteR wrote: Sun Dec 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ń

Code: Select all

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

Code: Select all

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 👍
User avatar
PuteR
Posts: 1422
Joined: Wed Dec 06, 2017 10:07 am

Post

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:

Code: Select all

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

Code: Select all

# 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;
#  }
#}

User avatar
lesny8
Posts: 2814
Joined: Mon Dec 11, 2017 9:43 pm

Post

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

Code: Select all

  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

Code: Select all

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

Code: Select all

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

Code: Select all

sudo reboot
i zobacz czy wszystko będzie działać prawidłowo.
Czekam na kolejne Supla Offline Party 👍
User avatar
PuteR
Posts: 1422
Joined: Wed Dec 06, 2017 10:07 am

Post

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

Code: Select all

# 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 :]

Code: Select all

#!/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
User avatar
lesny8
Posts: 2814
Joined: Mon Dec 11, 2017 9:43 pm

Post

PuteR wrote: Wed Dec 19, 2018 11:28 pm czy tak powinien wyglądać w moim przypadku plik dhcpd.conf??
Tak
PuteR wrote: Wed Dec 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.

Code: Select all

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

Code: Select all

#!/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

Code: Select all

chmod +x update_dns.sh
edytuj systemowego crona

Code: Select all

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

Code: Select all

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

Code: Select all

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 👍

Return to “supla-docker”