<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  >
<channel>
<title><![CDATA[Sternadel.pl - Blog i galeria Michała Sternadela]]></title>
<link>http://sternadel.pl/feed/all/</link>
<description><![CDATA[Kanał witryny Michała Sternadel]]></description>
<image><title><![CDATA[Blog i galeria Michała Sternadela]]></title>
<link>http://sternadel.pl/feed/all</link>
<url>http://sternadel.pl/templates/default/images/feed.png</url>
</image>
<language>pl</language>
<pubDate>Thu, 22 Oct 2026 00:29:05 +0200</pubDate>
<item>
<title><![CDATA[Instalacja serwera Vaultwarden bez użycia Dockera]]></title>
<link>http://sternadel.pl/blog/?id=200</link>
<pubDate>Sat, 24 Jan 2026 11:14:07 +0100</pubDate>
<description><![CDATA[<p>Niektórzy z administratorów sceptycznie patrzą na konteneryzację, pomimo faktu, że jest z nami na prawdę bardzo długo. Czasem wynika to z braku wiedzy, czasem z braku możliwości i chęci utrzymywania całego technologicznego zaplecza dla jednego czy też dwóch kontenerów, a czasem - minimalizacji narzutu kolejnych warstw i optymalizacji prędkości działania. W poniższym opisie przedstawię jak zainstalować serwer Vaultwarden bezpośrednio na systemie Linux z pominięciem kompilacji oprogramowania. Plik binarny jak również pliki aplikacji webowej zostaną pobrane i wypakowane z dostępnego obrazu Dockera, udostępnianego publicznie.</p><br />
<p>Założenia:</p><br />
<ul><br />
<li>Urządzenie z systemem Linux, z procesorem o architekturze AMD64 lub ARM64 (Tutaj Raspberry Pi 4 z systemem Debian 13)</li><br />
<li>Baza danych - dowolna, obsługiwana przez Vaultwarden, tutaj będzie to SQLite, ale nic nie stoi na przeszkodzie, aby wcześniej zainstalować sobie MariaDB.</li><br />
<li>Adres usługi to https://vaultwarden.home.arpa:8443</li><br />
<li>Udostępnienie aplikacji Web-Vault</li><br />
<li>Samopodpisany certyfikat x509 w celu uruchomienia Vaultwarden po SSL na porcie 8443</li><br />
<li>Użytkownik, który może tworzyć organizacje: admin@home.arpa</li><br />
<li>Domeny, na które można wykonywać rejestrację użytkowników: localhost, home.arpa</li><br />
</ul><br />
<br />
<h3>Instalacja paczek potrzebnych do działania</h3><br />
<pre>apt-get update && apt-get -y install curl git wget ssl-cert</pre><br />
<h3>Utworzenie użytkownika, na którym będzie działała usługa</h3><br />
<pre>adduser --system --shell /usr/sbin/nologin --comment "Vaultwarden User" --create-home --home /usr/lib/vaultwarden/ vaultwarden<br />
adduser vaultwarden ssl-cert</pre><br />
<h3>Utworzenie katalogu z konfiguracją</h3><br />
<pre>mkdir -p /etc/vaultwarden/ && chown vaultwarden:vaultwarden /etc/vaultwarden && chmod 0750 /etc/vaultwarden</pre><br />
<br />
<h3>Utworzenie katalogu na dane oraz dla plików tymczasowych</h3><br />
<pre>mkdir -p /usr/lib/vaultwarden/data/ && chown vaultwarden:vaultwarden /usr/lib/vaultwarden/data && chmod 0750 /usr/lib/vaultwarden/data<br />
mkdir -p /usr/lib/vaultwarden/data/tmp && chown vaultwarden:vaultwarden /usr/lib/vaultwarden/data/tmp && chmod 0750 /usr/lib/vaultwarden/data/tmp</pre><br />
<br />
<h3>Utworzenie katalogu dla logów</h3><br />
<pre>mkdir -p /var/log/vaultwarden && chown vaultwarden:vaultwarden /var/log/vaultwarden && chmod 0751 /var/log/vaultwarden</pre><br />
<br />
<h3>Konfiguracja rotacji logów</h3><br />
<pre>cat <<EOF > /etc/logrotate/vaultwarden<br />
/var/log/vaultwarden/vaultwarden.log {<br />
        su vaultwarden vaultwarden<br />
        rotate 60<br />
        daily<br />
        missingok<br />
        copytruncate<br />
        notifempty<br />
        compress<br />
        sharedscripts<br />
        postrotate<br />
                invoke-rc.d rsyslog rotate >/dev/null 2>&1 || true<br />
        endscript<br />
}<br />
EOF</pre><br />
<br />
<h3>Wypakowanie plików z obrazu Dockera</h3><br />
<p>W celu wypakowania plików niezbędnych do uruchomienia usługi można ręcznie pobrać każdą z warstw dostępnych w manifeście dla obrazu vaultwarden/server lub też skorzystać z przygotowanego skryptu powłoki (instalujac uprzednio jq <i>apt-get install jq -y</i>):</p><br />
<pre><br />
#!/usr/bin/env bash<br />
DEST_WEB="/usr/lib/vaultwarden"<br />
DEST_BIN="/usr/bin"<br />
VAULTWARDEN_USER="vaultwarden"<br />
VAULTWARDEN_GROUP="vaultwarden"<br />
IMAGE="vaultwarden/server"<br />
TAG="latest"<br />
case "$(uname -m)" in<br />
  x86_64)  ARCH="amd64" ;;<br />
  aarch64) ARCH="arm64" ;;<br />
  *) echo "Unsupported architecture, exiting..."; exit 1 ;;<br />
esac<br />
TARGET_DIR="web-vault"<br />
TARGET_BIN="vaultwarden"<br />
<br />
mkdir -p "$DEST_WEB"<br />
<br />
echo "[*] Getting registry token..."<br />
TOKEN=$(curl -s \<br />
  "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${IMAGE}:pull" \<br />
  | jq -r '.token')<br />
<br />
echo "[*] Fetching manifest list..."<br />
MANIFEST_LIST=$(curl -s \<br />
  -H "Authorization: Bearer ${TOKEN}" \<br />
  -H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \<br />
  "https://registry-1.docker.io/v2/${IMAGE}/manifests/${TAG}")<br />
<br />
echo "[*] Selecting manifest for $ARCH..."<br />
MANIFEST_DIGEST=$(echo "$MANIFEST_LIST" \<br />
  | jq -r ".manifests[] | select(.platform.architecture == \"$ARCH\") | .digest")<br />
<br />
if [[ -z "$MANIFEST_DIGEST" ]]; then<br />
    echo "Error: no manifest for architecture '$ARCH'"<br />
    exit 1<br />
fi<br />
<br />
echo "[*] Using manifest: $MANIFEST_DIGEST"<br />
<br />
echo "[*] Fetching image manifest..."<br />
MANIFEST=$(curl -s \<br />
  -H "Authorization: Bearer ${TOKEN}" \<br />
  -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \<br />
  "https://registry-1.docker.io/v2/${IMAGE}/manifests/${MANIFEST_DIGEST}")<br />
<br />
echo "[*] Downloading layers..."<br />
rm -f layer_*.tar<br />
i=0<br />
for DIGEST in $(echo "$MANIFEST" | jq -r '.layers[].digest'); do<br />
  i=$((i+1))<br />
  FILE="layer_${i}.tar"<br />
  echo "    - downloading $FILE ($DIGEST)"<br />
  curl -s -L \<br />
    -H "Authorization: Bearer ${TOKEN}" \<br />
    "https://registry-1.docker.io/v2/${IMAGE}/blobs/${DIGEST}" \<br />
    -o "$FILE"<br />
done<br />
<br />
echo "[*] Searching for '$TARGET_DIR' and '$TARGET_BIN' in layers..."<br />
FOUND_DIR=0<br />
FOUND_BIN=<br />
<br />
for LAYER in layer_*.tar; do<br />
    if [[ "$FOUND_DIR" -eq 0 ]]; then<br />
        if tar -tf "$LAYER" | grep "${TARGET_DIR}/index.html"; then<br />
            echo "[*] Found '$TARGET_DIR' in $LAYER — extracting to $DEST_WEB"<br />
            tar -xf "$LAYER" -C "$DEST_WEB" "$TARGET_DIR"<br />
            FOUND_DIR=1<br />
        fi<br />
    fi<br />
    if [[ "$FOUND_BIN" -eq 0 ]]; then<br />
        if tar -tf "$LAYER" | grep "${TARGET_BIN}"; then<br />
            echo "[*] Found '$TARGET_BIN' in $LAYER — extracting to $DEST_BIN"<br />
            tar -xf "$LAYER" -C "$DEST_BIN" "$TARGET_BIN"<br />
            FOUND_BIN=1<br />
        fi<br />
    fi<br />
    if [[ "$FOUND_DIR" -eq 1 && "$FOUND_BIN" -eq 1 ]]; then<br />
        break<br />
    fi<br />
done<br />
<br />
rm -f layer_*.tar<br />
<br />
if [[ "$FOUND_DIR" -eq 0 || "$FOUND_BIN" -eq 0 ]]; then<br />
    echo "Error: Could not find one or both targets ('$TARGET_DIR' and '$TARGET_BIN') in the image layers."<br />
    exit 1<br />
fi<br />
echo "[*] Change permissions..."<br />
chown $VAULTWARDEN_USER:$VAULTWARDEN_GROUP $DEST_WEB/$TARGET_DIR -R<br />
chown $VAULTWARDEN_USER:$VAULTWARDEN_GROUP $DEST_BIN/$TARGET_BIN<br />
echo "[+] Done!"<br />
echo "→ Extracted files are in: $DEST_WEB and $DEST_BIN"<br />
echo "  - Web Vault: $DEST_WEB/$TARGET_DIR"<br />
echo "  - Binary: $DEST_BIN/$TARGET_BIN"<br />
</pre><br />
Po zapisaniu skryptu pod nazwą "/root/dedocker-vaultwarden.sh" oraz po włączeniu bitu wykonywania i  uruchomieniu go, na konsoli powinny pojawić się stosowne komunikaty:<br />
<pre><br />
# ./dedocker-vaultwarden.sh <br />
[*] Getting registry token...<br />
[*] Fetching manifest list...<br />
[*] Selecting manifest for arm64...<br />
[*] Using manifest: sha256:a24a108a90f6380a8f990308831025b038ee8df5d5be7f4c04922441ac7d6ff0<br />
[*] Fetching image manifest...<br />
[*] Downloading layers...<br />
    - downloading layer_1.tar (sha256:2ae15a20160209c6fd6cff4886e4ba2e666fa5bedd7b54a2c0097ea6646f0273)<br />
    - downloading layer_2.tar (sha256:45431c76674b0df695a222114e087abf9d53d313517bc2b072f06913e8c89dcd)<br />
    - downloading layer_3.tar (sha256:7c614f5e5b12d769ab1c7209670d560dfa11dad61b1b47e205d239ba64a8b0e6)<br />
    - downloading layer_4.tar (sha256:6043b4e5998fa5bb92ed2956636c3718d33dea6c277cdd7510d2f6814db914a7)<br />
    - downloading layer_5.tar (sha256:389eb04f03834ad4fa7d5b2fa18ae377990943fffd16b96397bfae35dfa6a6ba)<br />
[*] Searching for 'web-vault' and 'vaultwarden' in layers...<br />
web-vault/index.html<br />
[*] Found 'web-vault' in layer_4.tar — extracting to /usr/lib/vaultwarden<br />
vaultwarden<br />
[*] Found 'vaultwarden' in layer_5.tar — extracting to /usr/bin<br />
[*] Change permissions...<br />
[+] Done!<br />
→ Extracted files are in: /usr/lib/vaultwarden nad /usr/bin<br />
  - Web Vault: /usr/lib/vaultwarden/web-vault<br />
  - Binary: /usr/bin/vaultwarden<br />
</pre><br />
W katalogu <i>/usr/bin/</i> powinien pojawić się plik <i>vaultwarden,</i> a w katalogu /usr/lib/vaultwarden/ katalog <i>web-vault/.</i> Sprawdźmy, czy program działa poprawnie:<br />
<pre><br />
cd /usr/lib/vaultwarden<br />
/usr/bin/vaultwarden --version<br />
Vaultwarden 1.35.2<br />
Web-Vault 2025.12.1+build.3<br />
</pre><br />
<br />
<p>Następnie możemy przystąpić do generowania certyfikatu SSL oraz konfiguracji usługi.</p><br />
<h3>Generowanie klucza oraz certyfikatu</h3><br />
<pre><br />
apt-get install -y openssl<br />
openssl genrsa -out /etc/ssl/private/self-vaultwarden.home.arpa.key 4096<br />
chgrp ssl-cert /etc/ssl/private/self-vaultwarden.home.arpa.key<br />
chmod 0640 /etc/ssl/private/self-vaultwarden.home.arpa.key<br />
openssl req -x509 -new \<br />
  -key /etc/ssl/private/self-vaultwarden.home.arpa.key \<br />
  -sha256 \<br />
  -days 825 \<br />
  -out /etc/ssl/certs/self-vaultwarden.home.arpa.crt \<br />
  -subj "/CN=vaultwarden.home.arpa" \<br />
  -addext "subjectAltName=DNS:vaultwarden.home.arpa"<br />
chgrp ssl-cert /etc/ssl/certs/self-vaultwarden.home.arpa.crt <br />
chmod 0644 /etc/ssl/certs/self-vaultwarden.home.arpa.crt <br />
</pre><br />
<br />
<p>Vaultwarden wymaga klucza rsa do podpisywania tokenów, zaproszeń dla użytkowników czy też danych w bazie danych. Należy zatem wygenerować go:</p><br />
<pre>openssl genrsa -out /etc/vaultwarden/rsa_key.pem 4096<br />
chown vaultwarden:vaultwarden /etc/vaultwarden/rsa_key.pem<br />
chmod 0600 /etc/vaultwarden/rsa_key.pem</pre><br />
<br />
<p>Skonfigurujmy teraz Vaultwarden, według założeń:</p><br />
<pre>cat <<EOF >> /etc/vaultwarden/vaultwarden.conf<br />
DATA_FOLDER=/usr/lib/vaultwarden/data<br />
RSA_KEY_FILENAME=/etc/vaultwarden/rsa_key<br />
WEB_VAULT_FOLDER=/usr/lib/vaultwarden/web-vault/<br />
WEB_VAULT_ENABLED=true<br />
DATABASE_URL=/usr/lib/vaultwarden/data/db.sqlite3<br />
WEBSOCKET_ENABLED=false<br />
WEBSOCKET_ADDRESS=0.0.0.0<br />
WEBSOCKET_PORT=3012<br />
PUSH_ENABLED=False<br />
PUSH_INSTALLATION_ID=CHANGEME<br />
PUSH_INSTALLATION_KEY=CHANGEME<br />
DOMAIN=https://vaultwarden.home.arpa:8443<br />
SENDS_ALLOWED=False<br />
SIGNUPS_ALLOWED=True<br />
SIGNUPS_VERIFY=False<br />
SIGNUPS_DOMAINS_WHITELIST=localhost,home.arpa<br />
ORG_CREATION_USERS=admin@home.arpa<br />
INVITATIONS_ALLOWED=False<br />
INVITATION_ORG_NAME=Snakeoil<br />
EMAIL_CHANGE_ALLOWED=False<br />
LOF_FILE=/var/log/vaultwarden/vaultwarden.log<br />
LOG_LEVEL=error<br />
ROCKET_ADDRESS=0.0.0.0<br />
ROCKET_PORT=8443<br />
ROCKET_TLS={certs="/etc/ssl/certs/self-vaultwarden.home.arpa.crt",key="/etc/ssl/private/self-vaultwarden.home.arpa.key"}<br />
EOF<br />
chown vaultwarden:vaultwarden /etc/vaultwarden/vaultwarden.conf<br />
chmod 0640 /etc/vaultwarden/vaultwarden.conf</pre><br />
<br />
<p>Pozostała tylko instalacja usługi oraz jej uruchomienie. W tym celu należy utworzyć jednostkę systemd w /etc/systemd/system/vaultwarden.service:</p><br />
<pre>cat <<EOF >> /etc/systemd/system/vaultwarden.service<br />
[Unit]<br />
Description=Vaultwarden server<br />
After=network.target auditd.service<br />
<br />
[Service]<br />
RestartSec=5s<br />
Type=simple<br />
User=vaultwarden<br />
Group=vaultwarden<br />
EnvironmentFile=/etc/vaultwarden/vaultwarden.conf<br />
WorkingDirectory=/usr/lib/vaultwarden<br />
ExecStart=/usr/bin/vaultwarden<br />
Restart=always<br />
PrivateTmp=true<br />
PrivateDevices=true<br />
ProtectHome=true<br />
NoNewPrivileges=true<br />
ProtectSystem=strict<br />
ReadOnlyPaths=/usr/lib/vaultwarden/web-vault/ /etc/vaultwarden<br />
ReadWritePaths=/usr/lib/vaultwarden/data/ /var/log/vaultwarden/<br />
LimitNOFILE=1048576<br />
LimitNPROC=64<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
EOF<br />
systemctl daemon-reload<br />
systemctl enable --now vaultwarden.service</pre><br />
<br />
<p>Sprawdzenie poprawności działania usługi</p><br />
<pre># ss -plnat |grep 8443<br />
LISTEN 0      4096         0.0.0.0:8443       0.0.0.0:*     users:(("vaultwarden",pid=3147,fd=24))  <br />
<br />
# systemctl status vaultvarden.service<br />
● vaultwarden.service - Vaultwarden server<br />
     Loaded: loaded (/etc/systemd/system/vaultwarden.service; enabled; preset: enabled)<br />
     Active: active (running) since Sat 2026-01-24 10:50:33 CET; 1min 21s ago<br />
 Invocation: ba3204b2476940c9b3d82cbbf64d2e35<br />
   Main PID: 3147 (vaultwarden)<br />
      Tasks: 13 (limit: 8749)<br />
        CPU: 195ms<br />
     CGroup: /system.slice/vaultwarden.service<br />
             └─3147 /usr/bin/vaultwarden<br />
<br />
Jan 24 10:50:33 r4pie vaultwarden[3147]: | This is an *unofficial* Bitwarden implementation, DO NOT use the   |<br />
Jan 24 10:50:33 r4pie vaultwarden[3147]: | official channels to report bugs/features, regardless of client.   |<br />
Jan 24 10:50:33 r4pie vaultwarden[3147]: | Send usage/configuration questions or feature requests to:         |<br />
Jan 24 10:50:33 r4pie vaultwarden[3147]: |   https://github.com/dani-garcia/vaultwarden/discussions or        |<br />
Jan 24 10:50:33 r4pie vaultwarden[3147]: |   https://vaultwarden.discourse.group/                             |<br />
Jan 24 10:50:33 r4pie vaultwarden[3147]: | Report suspected bugs/issues in the software itself at:            |<br />
Jan 24 10:50:33 r4pie vaultwarden[3147]: |   https://github.com/dani-garcia/vaultwarden/issues/new            |<br />
Jan 24 10:50:33 r4pie vaultwarden[3147]: \--------------------------------------------------------------------/</pre><br />
<br />
<p>Można już z powodzeniem utworzyć konta użytkowników i korzystać do woli. Podobny efekt, z tym, że automatycznie, można uzyskać wykonując polecenia:</p><br />
<pre>sudo apt-get install -y ansible git<br />
cat <<EOF > /tmp/localhost_vars.yml<br />
linux_vaultwarden_domain: vaultwarden.home.arpa<br />
linux_vaultwarden_signups_domains_whitelist:<br />
  - localhost<br />
  - home.arpa<br />
linux_vaultwarden_org_creation_users:<br />
  - admin@home.arpa<br />
EOF<br />
ansible-pull \<br />
  -U https://github.com/michalsternadel/linux_vaultwarden.git \<br />
  -e @/tmp/localhost_vars.yml \<br />
  local.yml</pre><br />
 <br />
<br />
<p>Zalecam skonfigurować Vaultwarden tak, aby słuchał jedynie na hoście lokalnym oraz wykorzystać reverse-proxy do udostępniania usługi z odpowiadnią terminacją SSL. Przy dużych wdrożeniach również rozsądniej byłoby zamiast SQLite użyć silnika MariaDB.</p><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/blog/?id=200</guid>
</item>
<item>
<title><![CDATA[Konfiguracja kilku serwerów OpenVPN (TCP/UDP) z jedną podsiecią]]></title>
<link>http://sternadel.pl/blog/?id=199</link>
<pubDate>Mon, 14 Feb 2022 20:03:38 +0100</pubDate>
<description><![CDATA[<p>Pomimo istnienia dość sympatycznego i w miarę już przyjętego przez świat Wireguarda, OpenVPN wciąż jest dość szeroko używany zarówno w rozwiązaniach klasy biznesowej, jak i domowych bo dobry i tani, zwłaszcza po zaimplementowaniu algorytmu ChaCha20-Poly1305 stał się wydajnym bohaterem bez peleryny, który bezpiecznie i prędko przenosi ogrom danych. Założenia nie zawsze pozwalają na utworzenie mostka z konkretnym fizycznym interfejsem, a konfiguracja na bazie TUN taka, aby klient uzyskiwał konkretny adres z jednej podsieci, ale mógł sie łączyć zarówno przez protokół TCP jak i UDP jest skomplikowana. Nie każdy chce opierać VPN o TAP, mostkować, konfigurować mnóstwo dodatkowych usług, jak chociażby serwer DHCP. Trzymając się rozwiązań opartych na dwóch interfejsach TUN z tą samą podsiecią łatwo zauważyć, że będzie się to niejako "gryzło". OpenVPN nie posiada komplementarnego rozwiązania, pozwalającego zagregować jedną konfigurację na oba protokoły jednocześnie. Nikt nie zabrania nam jednak skonfigurować sobie kilku VPNów na różnych portach i protokołach i odpowiednio zmieniać trasy przy zestawieniu nowego połączenia od klienta w zależności od użytej konfiguracji. Założenia konfiguracji przedstawiam poniżej:</p><br />
<ul><br />
<li>Jedna podsieć dla klientów: 192.168.168.0/24</li><br />
<li>Dostęp do serwera VPN na porcie 1194/TCP</li><br />
<li>Dostęp do serwera VPN na porcie 1194/UDP</li><br />
<li>Dostęp do serwera VPN na porcie 443/TCP</li><br />
<li>Konfiguracja oparta tym razem o certyfikaty</li><br />
<li>Możliwość połączeń pomiędzy klientami (również gdy jeden zestawi VPN innym kanałem od drugiego)</li><br />
</ul><br />
<p>Co będzie nam potrzebne? Serwer z zewnętrznym adresem IP oraz zainstalowanym systemem operacyjnym Linux (już skonfigurowanym). Konfigurację przedstawię na bazie Debiana 11 i OpenVPN w wersji 2.5.1, ale nic oczywiście nie stoi na przeszkodzie, aby użyć innego Linuksa oraz starszej wersji OpenVPN (po drobnym dopasowaniu konfiguracji).</p><br />
<br />
<p>Rozpocznijmy od instalacji pakietów, które będziemy potrzebowali, a więc <cite>openvpn</cite> oraz <cite>easy-rsa:</cite><p><br />
<pre>apt update && apt install openvpn easy-rsa -y</pre><br />
<p>Następnie przygotujmy wszelkie katalogi, certyfikaty oraz klucze:</p><br />
<pre>mkdir -p /etc/openvpn/easyrsa && cd /etc/openvpn/easyrsa/<br />
cp -R /usr/share/easy-rsa/* ./<br />
mv vars.example vars<br />
wget https://raw.githubusercontent.com/TinCanTech/easy-tls/master/easytls -O ./easytls && chmod +x easytls</pre><br />
<p>Zmieńmy konfigurację w pliku <cite>vars</cite> według upodobań, zalecam zmienić okres ważności certyfikatu CA oraz certyfikatów serwera/klientów (<cite>EASYRSA_CA_EXPIRE</cite> oraz <cite>EASYRSA_CERT_EXPIRE</cite>), jeżeli VPN ma służyć do użytku wewnętrznego.<br />
<pre>./easyrsa init-pki<br />
./easyrsa build-ca # Podajmy hasło na przykład "cement15" i zapamiętajmy<br />
./easyrsa gen-dh # Tutaj możemy zaparzyć kawę<br />
./easyrsa gen-crl # Zapamiętane hasło potrzebne<br />
./easytls init-tls<br />
./easytls build-tls-crypt<br />
./easyrsa build-server-full openvpnserver nopass # Jeszcze pamietać hasło należy<br />
./easyrsa build-client-full klient1 # Hasło już prawie się zapomniało<br />
./easyrsa build-client-full klient2 nopass<br />
mkdir /etc/openvpn/ccd<br />
touch /etc/openvpn/ipp.txt</pre><br />
<p>Powyższe komendy wygenerują po kolei: certyfikat główny -- autoryzujący pozostałe certyfikaty, klucz Diffie-Hellmana, listę nieważnych certyfikatów, zainicjują klucze szyfrujące TLS, wygenerują i podpiszą certyfikat serwera bez hasła do klucza oraz dwa certyfikaty i klucze dla klientów z hasłem do kluczy.</p><br />
<p>Po wygenerowaniu stosownych plików możemy przygotować nasze pliki konfiguracyjne.</p><br />
<p>Server na porcie 1194/TCP:</p><br />
<pre><br />
cat << EOF > /etc/openvpn/server1194tcp.conf<br />
local 0.0.0.0<br />
lport 1194<br />
proto tcp4<br />
dev tun-ovpntcp1194<br />
ca /etc/openvpn/easyrsa/pki/ca.crt<br />
cert /etc/openvpn/easyrsa/pki/issued/openvpnserver.crt<br />
key /etc/openvpn/easyrsa/pki/private/openvpnserver.key<br />
dh /etc/openvpn/easyrsa/pki/dh.pem<br />
topology subnet<br />
server 192.168.168.0 255.255.255.0<br />
client-config-dir /etc/openvpn/ccd<br />
keepalive 15 120<br />
remote-cert-tls client<br />
tls-version-min 1.2<br />
tls-crypt /etc/openvpn/easyrsa/pki/easytls/tls-crypt.key 0<br />
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256<br />
tls-groups prime256v1<br />
cipher AES-256-CBC<br />
auth SHA256<br />
persist-key<br />
persist-tun<br />
crl-verify /etc/openvpn/easyrsa/pki/crl.pem<br />
status /etc/openvpn/status.log 20<br />
status-version 3<br />
management 127.0.0.1 11194<br />
verb 0<br />
push "explicit-exit-notify 1"<br />
ifconfig-pool-persist /etc/openvpn/ipp.txt<br />
route-metric 5<br />
log-append /var/log/openvpn/openvpnserver.log<br />
script-security 2<br />
learn-address /etc/openvpn/learn-address.sh<br />
push "redirect-gateway def1"<br />
EOF<br />
</pre><br />
<br />
<br />
<p>Server na porcie 443/TCP:</p><br />
<pre><br />
cat << EOF > /etc/openvpn/server443tcp.conf<br />
local 0.0.0.0<br />
lport 443<br />
proto tcp4<br />
dev tun-ovpntcp443<br />
ca /etc/openvpn/easyrsa/pki/ca.crt<br />
cert /etc/openvpn/easyrsa/pki/issued/openvpnserver.crt<br />
key /etc/openvpn/easyrsa/pki/private/openvpnserver.key<br />
dh /etc/openvpn/easyrsa/pki/dh.pem<br />
topology subnet<br />
server 192.168.168.0 255.255.255.0<br />
client-config-dir /etc/openvpn/ccd<br />
keepalive 15 120<br />
remote-cert-tls client<br />
tls-version-min 1.2<br />
tls-crypt /etc/openvpn/easyrsa/pki/easytls/tls-crypt.key 0<br />
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256<br />
tls-groups prime256v1<br />
cipher AES-256-CBC<br />
auth SHA256<br />
persist-key<br />
persist-tun<br />
crl-verify /etc/openvpn/easyrsa/pki/crl.pem<br />
status /etc/openvpn/status.log 20<br />
status-version 3<br />
management 127.0.0.1 10443<br />
verb 0<br />
push "explicit-exit-notify 1"<br />
ifconfig-pool-persist /etc/openvpn/ipp.txt<br />
route-metric 5<br />
log-append /var/log/openvpn/openvpnserver.log<br />
script-security 2<br />
learn-address /etc/openvpn/learn-address.sh<br />
push "redirect-gateway def1"<br />
EOF<br />
</pre><br />
<br />
<p>Server na porcie 1194/UDP:</p><br />
<pre><br />
cat << EOF > /etc/openvpn/server1194udp.conf<br />
local 0.0.0.0<br />
lport 1194<br />
proto udp4<br />
dev tun-ovpnudp1194<br />
ca /etc/openvpn/easyrsa/pki/ca.crt<br />
cert /etc/openvpn/easyrsa/pki/issued/openvpnserver.crt<br />
key /etc/openvpn/easyrsa/pki/private/openvpnserver.key<br />
dh /etc/openvpn/easyrsa/pki/dh.pem<br />
topology subnet<br />
server 192.168.168.0 255.255.255.0<br />
client-config-dir /etc/openvpn/ccd<br />
keepalive 15 120<br />
remote-cert-tls client<br />
tls-version-min 1.2<br />
tls-crypt /etc/openvpn/easyrsa/pki/easytls/tls-crypt.key 0<br />
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256<br />
tls-groups prime256v1<br />
cipher AES-256-CBC<br />
auth SHA256<br />
persist-key<br />
persist-tun<br />
crl-verify /etc/openvpn/easyrsa/pki/crl.pem<br />
status /etc/openvpn/status.log 20<br />
status-version 3<br />
management 127.0.0.1 21194<br />
verb 0<br />
push "explicit-exit-notify 1"<br />
ifconfig-pool-persist /etc/openvpn/ipp.txt<br />
route-metric 5<br />
log-append /var/log/openvpn/openvpnserver.log<br />
script-security 2<br />
learn-address /etc/openvpn/learn-address.sh<br />
push "redirect-gateway def1"<br />
EOF<br />
</pre><br />
<br />
<p>Teraz cala magia, bo jak każdy mało znudzony czytelnik zauważył, że przedstawione listingi posiadają linię <cite>server 192.168.168.0 255.255.255.0,</cite> a więc zostaną utworzone trzy różne interfejsy z taką samą adresacją. Musimy nauczyć nasz serwer jak trasować pakiety pomiędzy nimi, w zależności od tego, który klient połączy się do VPN z użyciem którego interfejsu. Za to odpowiedzialne są linie: <cite>script-security 2</cite> (możliwość uruchamiana skryptów przez demona openvpn - ostrożnie) oraz <cite>learn-address /etc/openvpn/learn-address.sh.</cite></p><br />
<p>Stwórzmy plik <cite>learn-address.sh</cite> oraz ustawmy mu atrybut <i>+x:</i><p><br />
<pre><br />
cat << EOF > /etc/openvpn/learn-address.sh <br />
#!/bin/bash<br />
if [ \$# -lt 2 ]; then<br />
  exit 0;<br />
fi<br />
action=\$1;<br />
addr=\$2;<br />
commonname=\$3<br />
case \${action} in<br />
  add|update)<br />
    /usr/bin/sudo /sbin/ip route del \${addr}/32 > /dev/null 2>&1<br />
    /usr/bin/sudo /sbin/ip route add \${addr}/32 dev \${dev} > /dev/null 2>&1<br />
  ;;<br />
  delete)<br />
    /usr/bin/sudo /sbin/ip route del \${addr}/32 > /dev/null 2>&1<br />
  ;;<br />
  *)<br />
    exit 1<br />
  ;;<br />
esac<br />
exit 0<br />
EOF<br />
chmod +x /etc/openvpn/learn-address.sh<br />
</pre><br />
<p>Pozostaje nam uruchomić trzy demony OpenVPN:</p><br />
<pre>systemctl enable openvpn@server1194tcp<br />
systemctl enable openvpn@server443tcp<br />
systemctl enable openvpn@server1194udp<br />
systemctl start openvpn@server1194tcp<br />
systemctl start openvpn@server443tcp<br />
systemctl start openvpn@server1194udp<br />
</pre><br />
<p>Upewniając się wcześniej, że konfiguracja firewalla jest odpowiednia (więc przekazywanie pakietów i NAT/Maskarada):</p><br />
<pre><br />
echo "1" > /proc/sys/net/ipv4/ip_forward<br />
iptables -A INPUT -i ens3 -p tcp --dport 443 -j ACCEPT<br />
iptables -A INPUT -i ens3 -p tcp --dport 1194 -j ACCEPT<br />
iptables -A INPUT -i ens3 -p udp --dport 1194 -j ACCEPT<br />
iptables -A FORWARD -i ens3 -o tun-ovpntcp1194 -m state --state ESTABLISHED,RELATED -j ACCEPT<br />
iptables -A FORWARD -i ens3 -o tun-ovpntcp443 -m state --state ESTABLISHED,RELATED -j ACCEPT<br />
iptables -A FORWARD -i ens3 -o tun-ovpnudp1194 -m state --state ESTABLISHED,RELATED -j ACCEPT<br />
iptables -A FORWARD -s 192.168.168.0/24 -o ens3 -j ACCEPT<br />
iptables -t nat -A POSTROUTING -s 192.168.168.0/24 ! -d 192.168.168.0/24 -o ens3 -j MASQUERADE<br />
</pre><br />
<p>Jeżeli nigdzie nie popełniliśmy błędu, powinno wszystko wystartować i nasłuchiwać na skonfigurowanych portach, a my możemy przygotować konfiguracje dla klientów. Aby zautomatyzować sobie to trochę, posłużmy się poniższymi komendami:<p><br />
<pre><br />
mkdir -p /etc/openvpn/configs/<br />
cat << EOF > /etc/openvpn/user-skeleton.conf<br />
tls-client<br />
pull<br />
dev tun0<br />
resolv-retry infinite<br />
nobind<br />
remote-cert-tls server<br />
tls-version-min 1.2<br />
key-method 2<br />
verify-x509-name openvpnserver name<br />
cipher AES-256-CBC<br />
auth SHA256<br />
auth-nocache<br />
verb 0<br />
redirect-gateway def1<br />
key-direction 1<br />
EOF<br />
<br />
cat <<EOF > /etc/openvpn/makeuserconfig.sh<br />
#!/bin/bash<br />
if [ -z \${1} ]; then<br />
echo "No podajże nazwę klienta chociaż. Na ten przykład: \${0} klient1 port protokół"<br />
echo "\${0} klient1 1194 tcp"<br />
exit 1<br />
fi<br />
REMOTE=ABC.DEF.GHI.JKL # TUTAJ WKLEJAMY ZEWNĘTRZNE IP SERWERA<br />
klient=\${1}<br />
port=\${2}<br />
proto=\${3}<br />
outdir="/etc/openvpn/configs/"<br />
template="/etc/openvpn/user-skeleton.conf"<br />
<br />
echo "remote \${REMOTE} \${port}" >  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
if [ "\${proto}" == "udp" ] || [ "\${proto}" == "UDP" ] ; then<br />
echo "proto udp4" >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
else<br />
echo "proto tcp4-client" >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
fi<br />
cat \${template} >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
echo "<ca>" >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
cat /etc/openvpn/easyrsa/pki/ca.crt  >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
echo "</ca>" >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
echo "<cert>"  >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
cat /etc/openvpn/easyrsa/pki/issued/\${klient}.crt >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
echo "</cert>" >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
echo "<key>" >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
cat /etc/openvpn/easyrsa/pki/private/\${klient}.key >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
echo "</key>" >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
echo "<tls-crypt>" >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
cat /etc/openvpn/easyrsa/pki/easytls/tls-crypt.key >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
echo "</tls-crypt>" >>  \${outdir}\${klient}-\${port}-\${proto}.conf<br />
EOF<br />
chmod +x /etc/openvpn/makeuserconfig.sh<br />
</pre><br />
<p>Oraz wygenerujmy konfiguracje dla dwóch klientów (<cite>klient1</cite> oraz <cite>klient2</cite>):</p><br />
<pre><br />
/etc/openvpn/makeuserconfig.sh klient1 1194 TCP<br />
/etc/openvpn/makeuserconfig.sh klient1 1194 UDP<br />
/etc/openvpn/makeuserconfig.sh klient1 443 TCP<br />
/etc/openvpn/makeuserconfig.sh klient2 1194 TCP<br />
/etc/openvpn/makeuserconfig.sh klient2 1194 UDP<br />
/etc/openvpn/makeuserconfig.sh klient2 443 TCP</pre><br />
<p>Należy mieć na uwadze, że tutaj openvpn musi być uruchomiony z użytkownika, który posiada uprawnienia do zmiany tablicy routingu, co siłą rzeczy niesie ze sobą pewne ryzyko, dotyczące bezpieczeństwa takiego rozwiązania. Rozważyć należy zatem czy warto jest podejmować to ryzyko. W obecnym przykładzie demony OpenVPN startują jako użytkownik <cite>root,</cite> ale w celu podniesienia bezpieczeństwa zachęcam do stworzenia odrębnego użytkownika systemowego, na którego prawach będzie działał OpenVPN, a któremy to z kolei przyznamy prawa do edycji tablicy routingu, czy to za pomocą <cite>sudo</cite> czy też opowiednich <cite>capabilities</cite>. Poniżej przykład użycia rozwiązania opartego na użytkowniku <cite>"vpnmajster"</cite> z odpowiednim wpisem w <cite>sudoers.d/vpnmajster</cite>.</p><br />
<p>Utwórzmy użytkownika <cite>vpnmajster</cite>:</p><br />
<pre>adduser --system --disabled-login --disabled-password --no-create-home vpnmajster</pre><br />
<p>Następnie stwórzmy plik <cite>/etc/sudoers.d/vpnmajster</cite> z odpowiednimi uprawnieniami:</p><br />
<pre>cat <<EOF > /etc/sudoers.d/vpnmajster<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route add 192.168.168.[1-2][0-9][0-9]/32 dev tun-ovpntcp1194<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route add 192.168.168.[1-2][0-9][0-9]/32 dev tun-ovpnudp1194<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route add 192.168.168.[1-2][0-9][0-9]/32 dev tun-ovpntcp443<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route del 192.168.168.[1-2][0-9][0-9]/32<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route add 192.168.168.[1-9][0-9]/32 dev tun-ovpntcp1194<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route add 192.168.168.[1-9][0-9]/32 dev tun-ovpnudp1194<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route add 192.168.168.[1-9][0-9]/32 dev tun-ovpntcp443<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route del 192.168.168.[1-9][0-9]/32<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route add 192.168.168.[1-9]/32 dev tun-ovpntcp1194<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route add 192.168.168.[1-9]/32 dev tun-ovpnudp1194<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route add 192.168.168.[1-9]/32 dev tun-ovpntcp443<br />
vpnmajster ALL = NOPASSWD:/sbin/ip route del 192.168.168.[1-9]/32<br />
EOF<br />
chmod 0440 /etc/sudoers.d/vpnmajster</pre><br />
<p>Dodajmy stosowną linijkę do plików konfiguracyjnych serwera oraz zrestartujmy usługę openvpn:</p><br />
<pre><br />
echo "user vpnmajster" >> /etc/openvpn/server1194tcp.conf<br />
echo "user vpnmajster" >> /etc/openvpn/server1194udp.conf<br />
echo "user vpnmajster" >> /etc/openvpn/server443tcp.conf<br />
systemctl restart openvpn@server1194tcp<br />
systemctl restart openvpn@server443tcp<br />
systemctl restart openvpn@server1194udp<br />
</pre><br />
<p>Gotowe. Czyż życie nie staje się proste po przeczytaniu zagmatwanego opisu?</p><hr />Komentarze (12)<br /><strong>Publikowane komentarze są prywatnymi opiniami użytkowników witryny Michała Sternadela. Witryna Michała Sternadela nie ponosi odpowiedzialności za treść tych opinii.</strong><ul><li><b><a href="http://sternadel.pl/blog/?id=199#101">#12</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:37:25</li><li><b><a href="http://sternadel.pl/blog/?id=199#100">#11</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:36:50</li><li><b><a href="http://sternadel.pl/blog/?id=199#99">#10</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:36:21</li><li><b><a href="http://sternadel.pl/blog/?id=199#98">#9</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:35:54</li><li><b><a href="http://sternadel.pl/blog/?id=199#97">#8</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:35:33</li><li><b><a href="http://sternadel.pl/blog/?id=199#96">#7</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:35:25</li><li><b><a href="http://sternadel.pl/blog/?id=199#95">#6</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:34:57</li><li><b><a href="http://sternadel.pl/blog/?id=199#94">#5</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:34:40</li><li><b><a href="http://sternadel.pl/blog/?id=199#93">#4</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:34:26</li><li><b><a href="http://sternadel.pl/blog/?id=199#92">#3</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:30:50</li><li><b><a href="http://sternadel.pl/blog/?id=199#91">#2</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:30:29</li><li><b><a href="http://sternadel.pl/blog/?id=199#90">#1</a><br /></b>Autor: Stefan<br />Treść: Skomplikowane<br />Dodano: 11.10.2022, 19:29:51</li></ul><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/blog/?id=199</guid>
</item>
<item>
<title><![CDATA[Kto Ty jesteś Człowieku?]]></title>
<link>http://sternadel.pl/blog/?id=198</link>
<pubDate>Tue, 28 May 2019 14:06:25 +0200</pubDate>
<description><![CDATA[Ukrywający się pod osłoną ciasno dopasowanej, metalowej zbroi, błyszczącej w promieniach złocistego słońca wątle umięśniony rycerzu, o posturze atakującego krogulca. Chroniony niemalże z każdej strony, niedościgniony, nieuchwytny, żelazny, stały. Czyżby taki jesteś na pewno? Przez kratownice opuszczanej płyty przyłbicy prześwituje brzask jak co dnia. Otwory wentylacyjne nie zamkną ust ich przeklętych, niezlęknionych wrogów stoickiego spokoju, opanowania, bycia, ignorancji, monolitu - orężców monologu. Usta ich szeptają i szeptają, coraz więcej szeptów, szelestów, milczenie przechodzi w krzyki, szeptaną poezję rzeczywistości, głośne kwilenie, ćwierkanie, świergotanie. Słowa wykuwają w przydługawe zdania zaimki, orzeczenia, podmiot, dopełnienia, coś co oczywistym było jednak dokonało się dopiero teraz... Teraz, gdy ktoś szepnął, że to już dokonało się, gdy niezmącony niczym, posępny rycerz stał na straży życia swego w szczęściu i spokoju. Jednak noga drgnęła, drgnęła na kilka chwil, w kolanie ułamała się na sekund kilka... Dotarło. Jak prosto zgnieść człowieka, używając jedynie rzeczywistości, rzeczy dokonanych, od dawien dawna znanych prawideł, zasad działania świata, postępowania. Kurtuazyjną kurtynę przyodziać można nieskończenie wiele razy, ale wiotki mięśniak ze zbroi wyjdzie kiedyś. Wyjdzie, zmieniony, niby wyrzeźbiony już z gliny dawno temu, jednak zmieniony i zmieniać będzie się wcale nie tak prędko, powoli, nie wnet, ospale, ale jednak. Oby pozostał dobrym człowiekiem. To tyle.<hr />Komentarze (2)<br /><strong>Publikowane komentarze są prywatnymi opiniami użytkowników witryny Michała Sternadela. Witryna Michała Sternadela nie ponosi odpowiedzialności za treść tych opinii.</strong><ul><li><b><a href="http://sternadel.pl/blog/?id=198#88">#2</a><br /></b>Autor: 121<br />Treść: 2342<br />Dodano: 28.01.2020, 11:07:26</li><li><b><a href="http://sternadel.pl/blog/?id=198#87">#1</a><br /></b>Autor: ttt<br />Treść: tt<br />Dodano: 28.01.2020, 11:04:50</li></ul><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/blog/?id=198</guid>
</item>
<item>
<title><![CDATA[Oszustwo]]></title>
<link>http://sternadel.pl/blog/?id=197</link>
<pubDate>Thu, 19 Oct 2017 02:31:46 +0200</pubDate>
<description><![CDATA[<p>Życie, w którym jedyną czynnością będzie poznawanie świata na nowo. To nieuniknione, postanowione, wyśnione, jednak jeszcze niedokonane. Są dni, w których człowiek nie ma ochoty na nic, nie dotyczy to witalności, wigoru, siły mięśni, czy też umysłu lecz spowodowane jest zawiłością obecnego nurtu czasu, otoczenia, interakcji z tak zwanym socjalnym bytem, obecnością w wykreowanym przez wizjonerów przed laty światem i życiem w nieustającym ciosie trudności. Tarczą może okazać się ignorancja, walka, chęć zmian otoczenia i samego siebie, jednak wyzbycie się wszystkiego, co w człowieku tli się jeszcze, od maleńkości, czy też zagrabienie błahostek w miejsce marzeń, dążęń do określonych celów i działań ku rzeczom większym wydaje się być tylko kolejnym trikiem magicznym mającym na celu ubarwienie czasu w poczekalni do jedynego już w życiu marzenia... To zwykłe oszustwo!</p><br />
<hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/blog/?id=197</guid>
</item>
<item>
<title><![CDATA[Wujek]]></title>
<link>http://sternadel.pl/wydarzenia/?id=18</link>
<pubDate>Thu, 05 Oct 2017 11:40:00 +0200</pubDate>
<description><![CDATA[Jeszcze bardziej zwariowany wujek...<hr />Komentarze (4)<br /><strong>Publikowane komentarze są prywatnymi opiniami użytkowników witryny Michała Sternadela. Witryna Michała Sternadela nie ponosi odpowiedzialności za treść tych opinii.</strong><ul><li><b><a href="http://sternadel.pl/wydarzenia/?id=18#7">#4</a><br /></b>Autor: dfs<br />Treść: sfd<br />Dodano: 21.12.2020, 10:33:46</li><li><b><a href="http://sternadel.pl/wydarzenia/?id=18#6">#3</a><br /></b>Autor: dfs<br />Treść: sfd<br />Dodano: 21.12.2020, 10:31:49</li><li><b><a href="http://sternadel.pl/wydarzenia/?id=18#5">#2</a><br /></b>Autor: dfs<br />Treść: sfd<br />Dodano: 21.12.2020, 10:30:33</li><li><b><a href="http://sternadel.pl/wydarzenia/?id=18#4">#1</a><br /></b>Autor: dfs<br />Treść: sfd<br />Dodano: 21.12.2020, 10:25:51</li></ul><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/wydarzenia/?id=18</guid>
</item>
<item>
<title><![CDATA[MgS TimeManager 1.0.6MgS]]></title>
<link>http://sternadel.pl/projekty/?id=10</link>
<pubDate>Tue, 18 Apr 2017 11:14:04 +0200</pubDate>
<description><![CDATA[<p>Wtyczka do platformy e-learningowej Moodle w wersji 3.2+, dzięki której studenci oraz prowadzący mają wgląd w czas spędzony na poszczególnych kursach.</p><br />
<p>Wtyczka umożliwia wyświetlanie aktualnie spędzonego czasu na kursie, ustawienia minimalnego limitu czasu dla kursu, po którego osiągnięciu przez studenta, opiekun może zostać powiadomiony za pośrednictwem e-maila, a system generuje szablon certyfikatu w formacie RTF.</p><br />
<p>Instalacja modułu jest jak zwykle prosta i można ją wykonać po staroświecku, czyli, wypakowując zawartość załącznika do folderu /blocks/, a następnie przechodząc pod adres konsoli administracyjnej, lub bezpośrednio z panelu administracyjnego platformy.</p><br />
<p>Aktualizacja z wersji poprzedniej automatycznie ustawia odpowiednie opcje konfiguracyjne (loglegacy i loglifetime).</p><br />
<p>Do prawidłowego działania moduł wymaga załączenia opcji: enablestats, logstore_legacy | loglegacy, loglifetime (nie usuwaj logów).</p><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/projekty/?id=10</guid>
</item>
<item>
<title><![CDATA[Bramka SMS na Raspberry PI]]></title>
<link>http://sternadel.pl/blog/?id=196</link>
<pubDate>Wed, 01 Mar 2017 07:26:52 +0100</pubDate>
<description><![CDATA[<p>Z powodzeniem od roku używam fizycznej bramki SMS, którą zbudowałem na podstawie energooszczędnego komputera Raspberry Pi oraz modemu GSM. Na rynku istnieją również sprzętowe alternatywy, jednak ich koszt dziesięciokrotnie przewyższa cenę za wszystkie niezbędne części, do budowy własnej bramki. Osobiście testowałem kilka takich urządzeń i okazuje się, że nie odbiegają one sprawnością działania i funkcjami od mojej bramki.</p><br />
<br />
<p>Poniżej przedstawię opisową instrukcję jak taką bramkę skonstruować i cieszyć się alertami SMS o zatrzymaniu się krytycznych usług na serwerze aplikacji o godzinie 3:20 w nocy.</p><br />
<br />
<p>Aby w ogóle rozpocząć budowę urządzenia, potrzebne nam będzie:</p><br />
<ul><br />
<li>Raspberry Pi (ja używałem Raspberry Pi Model B+ 512MB RAM)</li><br />
<li>Karta microSD (ja użyłem 8GB)</li><br />
<li>Modem GSM na USB, zarówno Huaweii E173 jak i E3551/E3131 działają wspaniale</li><br />
<li>Zasilanie 5V (1A wystarczy w zupełności)</li><br />
<li>Według kaprysu: obudowa, przedłużacze USB, karta WiFi na USB</li><br />
</ul><br />
<br />
<p>Na samym początku musimy przygotować sobie system operacyjny - oczywiście będzie to Debian dla Raspberry Pi. Polecam od razu wersję <a href="https://downloads.raspberrypi.org/raspbian_lite_latest">lite.</a> Instalację systemu na karcie wykonujemy zgodnie z instrukcją zawartą na stronie raspberrypi.org (w skrócie, dla Linuksa: <pre>unzip yyyy-mm-dd-raspbian-jessie-lite.zip; dd bs=4M if=yyyy-mm-dd-raspbian-jessie-lite.img of=/dev/mmcblko0</pre>, dla Windows na przykład z wykorzystaniem programu Win32DiskImager).</p><br />
<br />
<p>Następnie łączymy się z komputerkiem, albo bezpośrednio klawiaturą i monitorem, albo przez sieć, wpinając kabel sieciowy do swojego switcha/komputera, albo przez kabel szeregowy. Wstępnie konfigurujemy system: <code>sudo raspi-config</code> Ustawiając <i>Hostname, Locale</i> oraz dostęp przez <i>SSH.</i></p><br />
<br />
<p>Konfigurujemy sieć, zgodnie z życzeniem, ja zalecam dodać sobie adres IP do zarządzania (w przypadku gdy nie uda nam się ustalić jakie IP otrzymała bramka, gdy działa bez monitora). Do pliku <i>/etc/network/interfaces</i> można dodać:<br />
<pre><br />
auto eth0:0<br />
iface eth0:0 inet static<br />
    name failback<br />
    address 192.168.139.253<br />
    netmask 255.255.255.0<br />
    network 192.168.139.0<br />
</pre></p><br />
<br />
<p>Można przystąpić do instalacji niezbędnego oprogramowania. Zalecam jeszcze od razu dodanie repozytorium pakietów, które da nam możliwość instalacji PHP w wersji 7.0 (skrypty uruchamiają się o wiele szybciej). Do pliku <i>/etc/apt/sources</i> trzeba dopisać:<br />
<pre><br />
deb http://repozytorium.mati75.eu/raspbian jessie-backports main contrib non-free<br />
deb-src http://repozytorium.mati75.eu/raspbian jessie-backports main contrib non-free<br />
</pre><br />
oraz wykonać:<br />
<pre><br />
sudo gpg --keyserver pgpkeys.mit.edu --recv-key CCD91D6111A06851<br />
sudo gpg --armor --export CCD91D6111A06851 | sudo apt-key add -<br />
apt update<br />
apt install nginx php7.0 php7.0-curl php7.0-gd php7.0-imap php7.0-json php7.0-mcrypt php7.0-mysql php7.0-mysqli php7.0-opcache php7.0-readline php7.0-fpm php7.0-xml php7.0-mbstring mysql-server mysql-client git curl<br />
</pre><br />
Instalator powinien zapytać o hasło dla użytkownika root serwera SQL. Wpisujemy tam cokolwiek trudnego do zapamiętania dla każdego innego człowieka niż my, na przykład: <code>PostaramSiePamietac2HaslaKtoreUzywamDoTwitera&fejsbuka</code> oraz staramy się to zapamiętać. Warto też założyć od razu dedykowanego użytkownika dla oprogramowania playSMS:<br />
<pre><br />
echo "CREATE USER 'playsms'@'localhost' IDENTIFIED BY 'HasloKtoreZnaTylkoPrezydentRzeczypospolitejPolskiejIJestPrzyklejoneNaKlapieLaptopaSluzbowegoPokazywanegoBardzoCzestoWTelewizorze'; GRANT USAGE ON *.* TO 'playsms'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; CREATE DATABASE IF NOT EXISTS `playsms`; GRANT ALL PRIVILEGES ON `playsms`.* TO 'playsms'@'localhost';" | mysql -u root -p<br />
</pre><br />
<p>Należy wpisać hasło root, oczywiście w tym przykładzie: <code>PostaramSiePamietac2HaslaKtoreUzywamDoTwitera&fejsbuka</code></p><br />
<p>Teraz możemy pobrać i zainstalować playSMS:<br />
<pre><br />
mkdir -p /var/www/<br />
cd /var/www/<br />
wget http://downloads.sourceforge.net/project/playsms/playsms/Version%201.4/playsms-1.4.tar.gz<br />
tar zxf playsms-1.4.tar.gz<br />
ln -s playsms-1.4 playsms<br />
cd playsms<br />
cp install.conf.dist install.conf<br />
nano install.conf<br />
rm playsms-1.4.tar.gz<br />
</pre><br />
Ustawiamy wszystkie niezbędne parametry, najważniejsze to: <pre>DBUSER="playsms", DBPASS="HasloKtoreZnaTylkoPrezydentRzeczypospolitejPolskiejIJestPrzyklejoneNaKlapieLaptopaSluzbowegoPokazywanegoBardzoCzestoWTelewizorze", DBNAME="playsms", DBHOST="localhost", PATHWEB="/var/www/playsms".</pre> Dodatkowo, jeżeli wybraliśmy PHP w wersji 7.0 musimy zmienić <pre>$core_config['db']['type'] = 'mysql';</pre> w pliku /var/www/playsms/config-dist.php na <pre>$core_config['db']['type'] = 'mysqli';</pre> (PHP 7 nie obsługuje już połączeń typu mysql).<br />
Uruchamiamy:<br />
<code>/var/www/playsms/install-playsms.sh</code><br />
Po pomyślnej instalacji dodajemy wpis do pliku <i>/etc/rc.local</i><br />
<code>/usr/local/bin/playsmsd /etc/playsmsd.conf start</code><br />
Teraz pozostaje nam konfiguracja serwera www (nginx). Tworzymy plik /etc/nginx/sites-available/playsms o następującej treści:<br />
<pre><br />
server {<br />
listen 80 default_server;<br />
listen [::]:80 default_server;<br />
root /var/www/playsms;<br />
index index.php index.html index.htm;<br />
server_name _;<br />
location / {<br />
try_files $uri $uri/ =404;<br />
}<br />
location ~ \.php$ {<br />
    fastcgi_split_path_info ^(.+\.php)(/.+)$;<br />
    fastcgi_intercept_errors on;<br />
fastcgi_pass unix:/var/run/php7.0-fpm.sock; # Dla php5 będzie tu inna ścieżka: /var/run/php5-fpm.sock;<br />
    fastcgi_index index.php;<br />
fastcgi_buffers 16 16k; <br />
fastcgi_buffer_size 32k;<br />
    include fastcgi.conf;<br />
}<br />
location ~ /\.ht {<br />
deny all;<br />
}<br />
}<br />
</pre><br />
I wykonujemy odpowiednie komendy:<br />
<pre><br />
ln -s /etc/nginx/sites-available/playsms /etc/nginx/sites-enabled<br />
rm /etc/nginx/sites-enabled/default<br />
nginx -t</pre><br />
Jeśli nie pojawiły się błędy, uruchamiamy nginx: <code>service nginx start</code><br />
</p><br />
<br />
<p>Możemy przystąpić do instalacji i konfiguracji modemu GSM. Podłączamy modem do wolnego portu USB oraz wykonujemy poniższe komendy:<br />
<pre>apt install gammu-smsd gammu usb-modeswitch<br />
useradd -G gammu www-data<br />
mkdir -p /var/log/gammu<br />
chown gammu:gammu /var/log/gammu<br />
chmod g+s /var/log/gammu<br />
</pre><br />
Tworzymy plik <i>/etc/gammu-smsrc</i>, o następującej treści:<br />
<pre><br />
[gammu]<br />
port = /dev/ttyUSB0<br />
connection = at115200<br />
logfile = /var/log/gammu/gammu.log<br />
logformat = textall<br />
<br />
[smsd]<br />
Service = files<br />
InboxPath = /var/spool/gammu/inbox/<br />
OutboxPath = /var/spool/gammu/outbox/<br />
SentSMSPath = /var/spool/gammu/sent/<br />
ErrorSMSPath = /var/spool/gammu/error/<br />
InboxFormat = unicode<br />
OutboxFormat = unicode<br />
TransmitFormat = auto<br />
debugLevel = 0<br />
LogFile = /var/log/gammu/smsd.log<br />
DeliveryReport = no<br />
CheckSecurity = 0<br />
</pre><br />
Oraz robimy symlinka: <code>ln -s /etc/gammu-smsdrc /etc/gammurc</code><br />
</p><br />
<p>Aby modem zawsze był widziany jako modem (a nie np. jak CD-ROM) warto dodać odpowiednie reguły do udeva, aby przy podłączeniu uruchamiać usb_modeswitch. Poniżej zawartość dla obydwu wspomnianych w tekście modemów (plik <i>/etc/udev/rules.d/80-gsm.rules</i><br />
<pre><br />
#E173:<br />
ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1446", RUN+="/usr/sbin/usb_modeswitch -v 12d1 -p 1446 -V 12d1 -P 1506 -M '55534243123456780000000000000011062000000100000000000000000000'"<br />
#E3131:<br />
ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14fe", RUN+="/usr/sbin/usb_modeswitch -v 12d1 -p 14fe -V 12d1 -P 1506 -M '55534243123456780000000000000011062000000100000000000000000000'"<br />
</pre><br />
Możemy sprawdzić czy wszystko działa: <code>udevadm trigger</code> i powinny pojawić się interfejsy szeregowe (<code>ls -l /dev/ttyUSB*</code>)<br />
Zmieniamy jeszcze USER=gammu na USER=root w <i>/etc/default/gammu-smsd</i> (Nawet po dodaniu użytkownika gammu do grupy dialout daemon gammu miał problemy z łączeniem się z modemem).<br />
Uruchamiamy usługę gammu-smsd:<br />
<code>systemctl start gammu-smsd</code><br />
I ustawiamy, aby uruchamiała się przy starcie:<br />
<code>systemctl enable gammu-smsd</code><br />
</p><br />
<br />
<p>Teraz konfiguracja samego playSMS za pośrednictwem interfejsu WWW. Trzeba zalogować się do playSMS przez przeglądarkę, wybrać Settings->Manage Gateway & SMSC, kliknąć na gammu manage oraz wpisać w <i>Spool folder</i> <code>/var/spool/gammu</code> i zapisać.<br />
<br />
<p>Następnie należy przejść w Settings -> Main Configuration i wybrać <code>gammu</code> dla <i>Default SMSC</i></p><br />
Pozostaje założyć sobie jakiegoś użytkownika, skonfigurować dostęp przez API oraz przetestować działanie, na przykład curlem: <br />
<pre>/usr/bin/curl "http://127.0.0.1/index.php?app=ws&u=UZYTKOWNIK1&h=TAJNYHASHUZYTKOWNIKA1&op=pv&to=004800000000&msg=Test&nofooter=1"</pre><br />
<br />
<p>Czasem zdarza się tak, że jakiś SMS nie dojdzie na skutek nieokreślonego błędu w deamonie gammu-smsd. Niestety w obecnej wersji playsms nie ma mechanizmu, który automatycznie ponowi próbę wysyłki, dlatego też zastosujemy rozwiązanie pomocnicze, tworząc plik <b>/usr/local/bin/resendSMS.sh,</b> o następującej treści:</p><br />
<pre><br />
#!/bin/bash<br />
/usr/bin/mysql -u playsms -pHasloKtoreZnaTylkoPrezydentRzeczypospolitejPolskiejIJestPrzyklejoneNaKlapieLaptopaSluzbowegoPokazywanegoBardzoCzestoWTelewizorze -hlocalhost playsms -N -e"SELECT id, p_dst as number, REPLACE(p_msg,'\n', '%0A') as message FROM playsms_tblSMSOutgoing WHERE p_status='2' ORDER BY c_timestamp DESC;" | while read id number message ; do<br />
msg=`echo -e $message`<br />
/usr/bin/curl -s -g "http://127.0.0.1/index.php?app=ws&u=UZYTKOWNIK1&h=TAJNYHASHUZYTKOWNIKA&op=pv&to=${number}&nofooter=1&msg=${msg}" && /bin/echo "UPDATE playsms.playsms_tblSMSOutgoing SET p_status='1' WHERE id ='$id'" | /usr/bin/mysql -u sys_playsms -pHasloKtoreZnaTylkoPrezydentRzeczypospolitejPolskiejIJestPrzyklejoneNaKlapieLaptopaSluzbowegoPokazywanegoBardzoCzestoWTelewizorze -hlocalhost playsms<br />
done<br />
exit 0<br />
</pre><br />
<p>W skrypcie oczywiście należy zmienić UZYTKONIK i TAJNYHASHUZYTKOWNIKA na odpowiedni, zczytany z playsms, a następnie ustawić atrybut wykonywania <code>chmod +x /usr/local/bin/resendSMS.sh</code></p><br />
<p>Teraz skrypt ten warto wykonywać co kilka minut (tutaj co 2 minuty), a wiec należy utworzyć plik <b>/etc/cron.d/resendFailedSMS,</b> zawierający:<br />
<pre><br />
*/2 * * * * root /usr/local/bin/resendSMS.sh > /dev/null 2>&1<br />
</pre><br />
<br />
<p>Teraz pozostaje nam cieszyć się własną bramką SMS.</p><br />
<hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/blog/?id=196</guid>
</item>
<item>
<title><![CDATA[To życie.]]></title>
<link>http://sternadel.pl/blog/?id=195</link>
<pubDate>Mon, 20 Feb 2017 23:09:09 +0100</pubDate>
<description><![CDATA[<p>Z językiem wywalonym tuż pod sklepienie rozrosłych wąsów, pośpiesznie przemieściłem się w inne miejsce, miejsce ciche, odległe od zgiełku, problemów dnia dzisiejszego i miejmy nadzieję, miejsce, które wyciszy wnętrze me. Chwila spojrzenia na zegarek, synchronizacja, według samodzielnie skleconego serwera czasu, opartego o amerykańskie satelity nawigacyjne, nie o jakieś serwery w Internecie i mogę... odpocząć sekund kilkanaście. <b>Pif-paf.</b> I znów stąpać w pośpiechu należy na przystanek, stację, ganek, po schodach, do piwnicy, sklepu, śmieci wyrzucić... Sekund kilkanaście okazuje się być mgnieniem, mrugnięciem, zalążkiem chwili, niewyłapanym drgnięciem piezoelektrycznego kwarcu, tylko chwilą zmrużonych powiek w podróży, w zmęczeniu na siłę wdzierającego się snu, z nożem sprężynowym w ręku, który zaatakować chce jeszcze jurne zafałdowania kory mózgowej, snu przestraszonego jednak po chwili głośnym, chrząknięciem starczego &#34;życia&#34;: No... Spójrz na mnie! Będziesz kiedyś taki jak ja. Kiedyś, czteroletni chłopak z woreczkiem foliowym, wypchanym drogocennymi kamieniami szlachetnymi, które po latach okazały się bezwartościowymi otoczakami kwarcu i ostruganego na kształt rewolweru patyka, będącego podpróchniałą gałęzią buku - teraz podstarzały, siwy i niezrozumiały przez nikogo staruch z kilkoma złotymi w dłoni, małpką w kieszeni znoszonej marynarki, i scyzorykiem szwajcarskim jako jedynym spełnieniem dziecięcych marzeń... Spójrz!</p><br />
<p>I tak w lustrzanym przyjacielu nastąpiło zrównanie czasu przeszłego z przyszłym, wykreowanie teraźniejszości, w której od wieków coś nie pasowało, było nadpsute, zatęchłe, ohydnie odpychające i trwa. To życie. Życie, ach, to... życie...</p><br />
<hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/blog/?id=195</guid>
</item>
<item>
<title><![CDATA[Ojciec]]></title>
<link>http://sternadel.pl/wydarzenia/?id=17</link>
<pubDate>Fri, 20 May 2016 10:10:00 +0200</pubDate>
<description><![CDATA[Przybyło na ten świat nowe stworzenie.<hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/wydarzenia/?id=17</guid>
</item>
<item>
<title><![CDATA[MgS TimeManager 1.0.5MgS]]></title>
<link>http://sternadel.pl/projekty/?id=9</link>
<pubDate>Mon, 30 Nov 2015 21:31:18 +0100</pubDate>
<description><![CDATA[<p>Wtyczka do platformy e-learningowej Moodle w wersji 3.0+, dzięki której studenci oraz prowadzący mają wgląd w czas spędzony na poszczególnych kursach.</p><br />
<p>Wtyczka umożliwia wyświetlanie aktualnie spędzonego czasu na kursie, ustawienia minimalnego limitu czasu dla kursu, po którego osiągnięciu przez studenta, opiekun może zostać powiadomiony za pośrednictwem e-maila, a system generuje szablon certyfikatu w formacie RTF.</p><br />
<p>Instalacja modułu jest jak zwykle prosta i można ją wykonać po staroświecku, czyli, wypakowując zawartość załącznika do folderu /blocks/, a następnie przechodząc pod adres konsoli administracyjnej, lub bezpośrednio z panelu administracyjnego platformy.</p><br />
<p>Do prawidłowego działania moduł wymaga załączenia opcji: enablestats, logstore_legacy | loglegacy, loglifetime (nie usuwaj logów).</p><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/projekty/?id=9</guid>
</item>
<item>
<title><![CDATA[Agregacja kilku łączy w jedno]]></title>
<link>http://sternadel.pl/blog/?id=194</link>
<pubDate>Fri, 10 Apr 2015 16:12:12 +0200</pubDate>
<description><![CDATA[<p>Nie każdy w firmie czy domu ma możliwość zestawienia jednego, szybkiego i stabilnego połączenia z Internetem. Często dla bezpieczeństwa lub odciążenia części działających usług doprowadza się do abonenta kilka złączy, z różnych lub tych samych źródeł i odpowiednio steruje ruchem i przepustowością przez każde z nich. Dzisiaj przestawię jak połączyć kilka łączy w jedno, które będzie odporne na awarię jednego z nich, a w przypadku, gdy każde pojedyncze połączenie działa - przepustowość będzie sumowana. Rozwiązanie przydatne jest również w przypadku, gdy posiadamy stałe łącze oraz dostęp &#34;mobilny&#34; przez sieć 3G/LTE i nazywa się różnie: port-trunking, port-bonding, bonding, link-aggregation...</p><br />
<br />
<p>Starałem się, aby przedstawiona konfiguracja była elegancka, więc oparłem ją w całości o systemy typu Debian oraz wbudowane w nich mechanizmy konfiguracji. Bezproblemowo można jednak po staroświecku oskryptować sobie wszystko i uruchamiać przygotowany tak skrypt przy starcie systemu.</p><br />
<br />
<h3>Co będzie potrzebne?</h3><br />
<ul><br />
 <li>Dwa lub więcej łącz u klienta (w poniżej przedstawionej konfiguracji będą trzy).</li><br />
 <li>Zewnętrzny serwer oparty na Linuksie w jakimś datacenter lub gdziekolwiek, z łączem szybszym lub równym sumie łącz klienckich oraz z <b>odpowiednią pulą adresów zewnętrznych (jeden adres zewnętrzny dla jednego łącza klienta).</b></li><br />
 <li>Router kliencki oparty na Linuksie.</li><br />
 <li>Wkompilowana obsługa bondingu na serwerze oraz routerze klienckim lub moduł bond (Debian standardowo już to ma).</li><br />
</ul><br />
<ul><br />
 <li>Serwer<br />
  <ul><br />
   <li>Łącze 100mbps/100mbps.</li><br />
   <li>Jedna karta sieciowa (eth0).</li><br />
   <li>Sieć 10.20.30.0/29, bramka: 10.20.30.1, dostępne adresy IP: 10.20.30.2, 10.20.30.3, 10.20.30.4, 10.20.30.5, 10.20.30.6.</li><br />
   <li>Firewall z otwartym portem 5000 (dla vtun) oraz ustawioną maskaradą.</li><br />
   <li>Adres 192.168.204.1/255.255.255.252 - adres interfejsu bond0, może być dowolny, prywatny, nie używany po żadnej stronie tunelów. Będzie to bramka domyślna dla routera klienckiego.</li><br />
  </ul><br />
 </li><br />
 <li>Router kliencki<br />
  <ul><br />
   <li>Łącze 10mbps/10mbps od <i>Operatora1</i>, Sieć 172.16.0.0/30, IP: 172.16.0.2, bramka: 172.16.0.1, maska: 255.255.255.252, wpięte do karty eth0</li><br />
   <li>Łącze 4mbps/4mbps od <i>Operatora2</i>, Sieć 172.30.0.4/30, IP: 172.30.0.6, bramka: 172.30.0.5, maska: 255.255.255.252, wpięte do karty eth0</li><br />
   <li>Łącze 5mbps/5mbps od <i>Operatora3</i>, Sieć 192.168.30.0/23, IP: 192.168.31.71, bramka: 192.168.30.1, maska: 255.255.254.0, wpięte do karty eth1</li><br />
   <li>Trzy karty sieciowe (eth0, eth1 oraz eth2)</li><br />
   <li>Sieć lokalna 192.168.1.0/24, skonfigurowany nat/maskarada na interfejsie eth2)</li><br />
   <li>Adres 192.168.204.2/255.255.255.242 - adresu interfejsu bond0, dowolny, który koresponduje z podsiecią na interfejsie bond0 na serwerze.<br />
  </ul><br />
 </li><br />
</ul><br />
<br />
<h3>Konfiguracja serwera w datacenter</h3><br />
<p>Zacznijmy od przygotowania serwera w naszym datacenter. Najpierw zainstalujmy sobie odpowiednie oprogramowanie <code>apt-get install ifenslave vtun</code>, zmodyfikujmy w pliku <i>/etc/network/interfaces</i> odpowiednie interfejsy:</p><br />
<pre><code>auto lo<br />
iface lo inet loopback<br />
<br />
# Pierwszy adres IP<br />
auto eth0<br />
iface eth0 inet static<br />
  address 10.20.30.2<br />
  netmask 255.255.255.248<br />
  network 10.20.30.0<br />
  broadcast 10.20.30.7<br />
  gateway 10.20.30.1<br />
  dns-nameservers 8.8.8.8 8.8.8.4<br />
<br />
# Drugi adres IP<br />
auto eth0:0<br />
iface eth0:0 inet static<br />
  address 10.20.30.3<br />
  netmask 255.255.255.248<br />
  network 10.20.30.0<br />
  broadcast 10.20.30.7<br />
<br />
# Trzeci adres IP <br />
auto eth0:1<br />
iface eth0:1 inet static<br />
  address 10.20.30.4<br />
  netmask 255.255.255.248<br />
  network 10.20.30.0<br />
  broadcast 10.20.30.7<br />
<br />
## Dla większej ilości adresów, można odpowiednio dopisać dodatkowe sekcje<br />
 <br />
# Agregacja lacza:<br />
auto bond0<br />
iface bond0 inet static<br />
  address 192.168.204.1<br />
  netmask 255.255.255.252<br />
  bond-slaves tap11 tap12 tap13<br />
  bond_mode balance-rr<br />
</code></pre><br />
<p>Teraz stwórzmy konfigurację tunelu. W tym poradniku skorzystamy z <i>vtun,</i> ale jeśli jest Ci wygodniej, możesz użyć openvpn czy nawet ssh. W pliku <code>/etc/vtund.conf</code> powinny znaleźć się takie wpisy:</p><br />
<pre><code><br />
options {<br />
  port 5000;<br />
  ip /sbin/ip;<br />
}<br />
default {<br />
 compress no;<br />
 encrypt no;<br />
 keepalive yes;<br />
 proto tcp;<br />
 speed 0;<br />
}<br />
TRUNK11 {<br />
 passwd supertajnepierwszehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;<br />
 type ether;<br />
 device tap11;<br />
 up {<br />
  ip &#34;link set up %% multicast off mtu 1420&#34;;<br />
  program &#34;/sbin/ifenslave bond0 %%&#34;;<br />
 };<br />
}<br />
TRUNK12 {<br />
 passwd supertajnedrugiehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;<br />
 type ether;<br />
 device tap12;<br />
 up {<br />
  ip &#34;link set up %% multicast off mtu 1420&#34;;<br />
  program &#34;/sbin/ifenslave bond0 %%&#34;;<br />
 };<br />
}<br />
TRUNK13 {<br />
 passwd supertajnetrzeciehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;<br />
 type ether;<br />
 device tap13;<br />
 up {<br />
  ip &#34;link set up %% multicast off mtu 1420&#34;;<br />
  program &#34;/sbin/ifenslave bond0 %%&#34;;<br />
 };<br />
}<br />
## Dla większej ilości tuneli, należy skopiować odpowiednio TRUNKXX, zmieniając niezbędne w środku parametry<br />
## dodając również interfejs tap w /etc/network/interfaces: bond-slaves</code></pre><br />
<p>Ustawmy w pliku <i>/etc/default/vtun</i> zmienną <code>RUN_SERVER=yes</code>, podnieśmy nowe interfejsy <code>ifup bond0</code> (i jeżeli eth0:0 i eth0:1 zostały dodane, to również i je) oraz wystartujmy vtun: <code>service vtun start</code>.</p><br />
<p>Pamiętać należy, ażeby dodać natowanie/maskaradę na interfejsie bond0, dla przykładu:</p><br />
<pre><code>iptables -A FORWARD -i bond0 -m state --state ESTABLISHED,RELATED -j ACCEPT<br />
iptables -A FORWARD -s 192.168.204.2/32 -j ACCEPT<br />
iptables -t nat -A POSTROUTING -s 192.168.204.2/32 ! -d 192.168.204.0/30 -o eth0 -j MASQUERADE</code></pre><br />
<br />
<h3>Konfiguracja routera</h3><br />
<br />
<p>Przejdźmy do ustawień routera klienckiego. Tak samo jak w przypadku serwera, najpierw instalujemy niezbędne oprogramowanie: <code>apt-get install vtun ifenslave</code>, konfigurujemy interfejs bond0 w <i>/etc/network/interfaces</i>, pamiętając o niezbędnych wpisach routingu (jeśli ich nie mielismy wcześniej):</p><br />
<pre><code>auto lo<br />
iface lo inet loopback<br />
<br />
# Operator1<br />
auto eth0<br />
iface eth0 inet static<br />
  address 172.16.0.2<br />
  netmask 255.255.255.252<br />
  post-up ip route add 172.16.0.0/30 dev eth0 src 172.16.0.2 table link1<br />
  post-up ip route add default via 172.16.0.1 table link1<br />
  post-up ip rule add from 172.16.0.2 to all lookup link1<br />
  post-up ip rule add from all to 172.16.0.2 lookup link1<br />
  post-down ip route flush table link1<br />
  post-down ip rule del from 172.16.0.2 to all lookup link1<br />
  post-down ip rule del from all to 172.16.0.2 lookup link1<br />
<br />
# Operator2<br />
auto eth0:0<br />
iface eth0:0 inet static<br />
  address 172.30.0.6<br />
  netmask 255.255.255.252<br />
  post-up ip route add 172.30.0.4/30 dev eth0 src 172.30.0.6 table link2<br />
  post-up ip route add default via 172.30.0.5 table link2<br />
  post-up ip rule add from 172.30.0.6 to all lookup link2<br />
  post-up ip rule add from all to 172.30.0.6 lookup link2<br />
  post-down ip route flush table link2<br />
  post-down ip rule del from 172.30.0.6 to all lookup link2<br />
  post-down ip rule del from all to 172.30.0.6 lookup link2<br />
<br />
# Operator3<br />
auto eth1<br />
iface eth1 inet static<br />
  address 192.168.31.71<br />
  netmask 255.255.254.0<br />
  post-up ip route add 192.168.31.0/24 dev eth0 src 192.168.31.71 table link3<br />
  post-up ip route add default via 192.168.30.1 table link3<br />
  post-up ip rule add from 192.168.31.71 to all lookup link3<br />
  post-up ip rule add from all to 192.168.31.71 lookup link3<br />
  post-down ip route flush table link3<br />
  post-down ip rule del from 192.168.31.71 to all lookup link3<br />
  post-down ip rule del from all to 192.168.31.71 lookup link3<br />
<br />
## Dla większej ilosci łącz można dodać więcej odpowiednich sekcji<br />
 <br />
# Agregacja łącza<br />
auto bond0<br />
iface bond0<br />
  address 192.168.204.2<br />
  netmask 255.255.255.252<br />
  gateway 192.168.204.1<br />
  dns-nameservers 8.8.8.8 8.8.4.4<br />
  bond-slaves tap11 tap12 tap13<br />
  bond_mode balance-rr<br />
 <br />
# Sieć lokalna<br />
auto eth2<br />
iface eth2 inet static<br />
  address 192.168.1.1<br />
  netmask 255.255.255.0<br />
  network 192.168.1.0<br />
  broadcast 192.168.1.255</code></pre><br />
<p>Następnie w pliku /etc/iproute2/rt_tables, dodajemy adekwatne wpisy (jeśli ich jeszcze nie mieliśmy):</p><br />
<pre><code>11 link1<br />
12 link2<br />
13 link3<br />
## można dodać więcej analogicznych wpisów, w przypadku chęci dodania większej ilości łącz</code></pre><br />
<p>Uruchamiamy interfejsy: <code>ifup bond0</code> (itd), a następnie edytujemy plik <i>/etc/vtund.conf</i>:</p><br />
<pre><code>options {<br />
 port 5000;<br />
 ip /sbin/ip;<br />
}<br />
default {<br />
 compress no;<br />
 encrypt no;<br />
 stat yes;<br />
 speed 0;<br />
}<br />
TRUNK11 {<br />
 passwd supertajnepierwszehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;<br />
 device tap11;<br />
 persist yes;<br />
 srcaddr {<br />
  iface eth0;<br />
  addr 172.16.0.2;<br />
 };<br />
 up {<br />
  ip &#34;link set %% up multicast off mtu 1460&#34;;<br />
  program &#34;/sbin/ifenslave bond0 %%&#34;;<br />
 };<br />
}<br />
TRUNK12 {<br />
 passwd supertajnedrugiehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;<br />
 device tap12;<br />
 persist yes;<br />
 srcaddr {<br />
  iface eth0;<br />
  addr 172.30.0.6;<br />
 };<br />
 up {<br />
  ip &#34;link set %% up multicast off mtu 1460&#34;;<br />
  program &#34;/sbin/ifenslave bond0 %%&#34;;<br />
 };<br />
}<br />
TRUNK13 {<br />
 passwd supertajnetrzeciehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;<br />
 device tap13;<br />
 persist yes;<br />
 srcaddr {<br />
  iface eth1;<br />
  addr 192.168.31.71;<br />
 };<br />
 up {<br />
  ip &#34;link set %% up multicast off mtu 1460&#34;;<br />
  program &#34;/sbin/ifenslave bond0 %%&#34;;<br />
 };<br />
}<br />
## Dla większej ilości tuneli, analogicznie dodać należy więcej sekcji TRUNKXX z odpowiednimi parametrami<br />
## dodając również interfejs tap w /etc/network/interfaces: bond-slaves</code></pre><br />
<p>W pliku <i>/etc/default/vtun</i> umieszczamy wpisy:</p><br />
<pre><code>CLIENTO_NAME=TRUNK11<br />
CLIENT0_HOST=10.20.30.2<br />
CLIENT1_NAME=TRUNK12<br />
CLIENT1_HOST=10.20.30.3<br />
CLIENT2_NAME=TRUNK13<br />
CLIENT2_HOST=10.20.30.4<br />
## dla większej ilości analogicznie.<br />
</code></pre><br />
<p>Odpalamy tunel: <code>service vtun start</code> i jeżeli nasze trzy łącza klienckie są sprawne, maksymalna dostępna prędkość wyniesie 19mbps/19mbps. W przypadku awarii łącza od Operatora 1, prędkość spadnie do 9mbps/9mbps.</p><br />
<p>Należy pamiętać, że w przypadku awarii serwera w naszym datacenter nie będziemy mieli możliwości dostać się do Internetu.</p><br />
<p>Tekst trochę zagmatwany, a jakże! Starałem się nie pisać tekstu dla osób jedynie klikających myszką, choć pewnie mi trochę nie wyszło. Myślę jednak, że dla młodych administratorów, chcących coś zagregować tekst będzie świetnym punktem początkowym, a być może również i końcowym w poszukiwaniach ciekawych rozwiązań.</p><hr />Komentarze (5)<br /><strong>Publikowane komentarze są prywatnymi opiniami użytkowników witryny Michała Sternadela. Witryna Michała Sternadela nie ponosi odpowiedzialności za treść tych opinii.</strong><ul><li><b><a href="http://sternadel.pl/blog/?id=194#84">#5</a><br /></b>Autor: Marek<br />Treść: @Michał Sternadel: Serwer DC ma link 100Mbit/100Mbit. Po mojej stronie mam 2 x LTE (10Mbit/10Mbit oraz 40Mbit/10Mbit).  Prędkość nie jest najważniejsza, równoważenie obciążenia - bezcenne ;)<br />
Tryb balance-alb 6 jest obiecujący - przetestuje. Pozdrawiam<br />Dodano: 26.12.2016, 22:22:41</li><li><b><a href="http://sternadel.pl/blog/?id=194#83">#4</a><br /></b>Autor: Michał Sternadel<br />Treść: @Mateusz: Jak napisał poniżej Marek, to para prywatnych adresów IP, aby serwer w DC oraz router kliencki się widziały. Może to być cokolwiek, nieużywanego w sieci lokalnej po jednej i drugiej stronie.<br />
@Marek: Prawdopodobnie prędkości sumują się poprawnie, LTE jest asymetryczne, stąd dane wysyłane z serwera do routera klienckiego chodzą po prędkości &quot;upload&quot;. Mogę się jednak mylić. Spróbuj ramki jumbo (nic nie zaszkodzi, chociaż to bardziej pod interfejsy ethernetowe): ifconfig bond0 mtu 9000 up - oczywiście po dwóch stronach. Można też spróbować trybów: balance-xor, balance-tlb, balance-alb.<br />
Pozdrawiam<br />Dodano: 26.12.2016, 20:16:33</li><li><b><a href="http://sternadel.pl/blog/?id=194#82">#3</a><br /></b>Autor: Marek<br />Treść: Mam dwa łącza LTE (jedno około 10Mbit, drugie około 40Mbit). Test z odłączeniem kabelka działa - (przełącza między jednym a drugim). Natomiast transfer mam w granicach około 15Mbit. bond-mode balance-rr. Czy może jest jeszcze jakiś myk, który powoduje że te prędkości będą się sumowały ?<br />
<br />
P.S. (do Mateusza)  Interfejs bond0 funkcjonuje na sieci 192.168.204.0/30. Nie potrzeba czwartego publicznego IP. <br />Dodano: 26.12.2016, 19:43:23</li><li><b><a href="http://sternadel.pl/blog/?id=194#81">#2</a><br /></b>Autor: Mateusz<br />Treść: Czołem. Fajny opis i fajne podejście do tematu<br />
<br />
Mam pytanko: w konfiguracji serwera i klienta dla bond0 pojawia się nagle adres 192.168.204.1 który nie został nigdzie opisany. <br />
<br />
Czy to jest adres używany jakoś wewnętrznie przy komunikacji pomiędzy vtunami na serwerze i kliencie? Czy potrzebuję tam podać czwarty publiczny adres IP serwera (dla konfiguracji z trzema łączami jak tutaj)? Czy może być taki prywatny jak w przykładzie i nie potrzebuję nadmiarowego IP?<br />Dodano: 21.12.2016, 10:01:38</li><li><b><a href="http://sternadel.pl/blog/?id=194#75">#1</a><br /></b>Autor: 1912<br />Treść: Człowieku skąd t się urwałeś?<br />
ale odpał, jesteś fenomenalny<br />Dodano: 17.04.2015, 11:04:27</li></ul><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/blog/?id=194</guid>
</item>
<item>
<title><![CDATA[Sposób na zapychanie się modemu Comtrend VI-3223u]]></title>
<link>http://sternadel.pl/blog/?id=193</link>
<pubDate>Sat, 14 Mar 2015 14:58:43 +0100</pubDate>
<description><![CDATA[<p>Jeśli mówimy o polskim DSL dla firm, na język rzuca się od razu kilka epitetów, związanych z niezadowoleniem. Głównie dotyczy to różnicy w jakości łącza, opisanej w umowie, a jakości faktycznie dostarczonej do klienta. Zrozumieć pozostaje, że miedź już się w wielu miejscach utleniła, kable są rozkręcone, centrale daleko w lesie, za wzgórzem, szafki krosownicze podmokłe i obsikane przez psa. Niekiedy parametry dostarczanego łącza są całkiem przyzwoite, pozostaje więc narzekanie na dostarczony sprzęt, który umówmy się - mógłby być troszeczkę lepszy.</p><br />
<p>Modem Comtrend VI-3223u cierpi na ciekawą przypadłość, że bez względu na aktualne/historyczne obciążenie łącza, porę dnia, czy też trendy dotyczące nowych stron internetowych w sieci lubi się najeść bobem. Bób, mimo, że smaczny i pożywny często zatyka kiszki torując frajdę wynikającą z przeglądania najświeższych plotek ze świata i okolic. Po zalogowaniu się na modem i wejściu w statystyki widać, że łącze zestawione jest przyzwoicie, jednakże odczuwalna prędkość sugeruje, że raczej pakiety dostarcza urząd pocztowy średnio rozwiniętego kraju niż przechodzą one przez jakiekolwiek kable. Pozostaje nam zresetować modem, co rozłączy wszystkie dogadane sesje, radio przestanie grać, a my dostaniemy mnóstwo ostrzeżeń z nagiosa.</p><br />
<p>Okazuje się, że zamiast resetować modem bardzo pomaga mu od czasu do czasu wyczyszczenie statystyk, co można wykonać po zalogowaniu się do panelu użytkownika (Login i hasło domyślne to user/user) na odpowiedniej podstronie. My - leniwi administratorzy nie mamy czasu, aby zaglądać tam co pół godziny, klikać jak szaleni, a ciągłe chodzenie i resetowanie modemu też jest nam nie w smak, dlatego też wolimy przygotować sobie trywialny i raczej brudny skrypt, który wykona nam tą operację za nas.</p><br />
<pre><br />
#!/bin/bash<br />
modemip=${1}<br />
u=${2}<br />
p=${3}<br />
address=&#34;http://${modemip}&#34;<br />
ua=&#34;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)&#34;<br />
cookiefile=&#34;/tmp/${modemip}-cookie.txt&#34;<br />
sessionfile=&#34;/tmp/${modemip}-session.txt&#34;<br />
touch ${cookiefile}<br />
touch ${sessionfile}<br />
rm ${sessionfile}<br />
rm ${cookiefile}<br />
wget -quiet -cookies=on -keep-session-cookies -save-cookies=${cookiefile} -user ${u} -password=${p} -user-agent=&#34;${ua}&#34; ${address} -O - >/dev/null<br />
wget -quiet -cookies=on -load-cookies=${cookiefile} -keep-session-cookies -save-cookies=${cookiefile} -user ${u} -password=${p} -user-agent=&#34;${ua}&#34; ${address}/statsifcreset.html -O - > /dev/null<br />
wget -quiet -cookies=on -load-cookies=${cookiefile} -keep-session-cookies -save-cookies=${cookiefile} -user ${u} -password=${p} -user-agent=&#34;${ua}&#34; ${address}/statswanreset.html -O - > /dev/null<br />
wget -quiet -cookies=on -load-cookies=${cookiefile} -keep-session-cookies -save-cookies=${cookiefile} -user ${u} -password=${p} -user-agent=&#34;${ua}&#34; ${address}/statsxtmreset.html -O - > /dev/null<br />
wget -quiet -cookies=on -load-cookies=${cookiefile} -keep-session-cookies -save-cookies=${cookiefile} -user ${u} -password=${p} -user-agent=&#34;${ua}&#34; ${address}/statsadslreset.html -O - > /dev/null<br />
</pre><br />
<p>Teraz wystarczy drobny wpis do crona (jakiegoś komputera, mającego dostęp do panelu modemu):</p><br />
<pre>*/10 * * * *root/usr/local/bin/comtrend-clearLog.sh IP_MODEMU user HASLO;</pre><br />
<p>I już problem znika, a modem nie zjada więcej naszego bobu.</p><br />
<p>Rozwiązanie testowałem sobie przez 6 miesięcy i faktycznie moi użytkownicy przestali już narzekać, a telefon ucichł i nikt do słuchawki nie mówi: <cite>A nie kopnąłbyś routera, bo coś muli?</cite> Polecam.</p><br />
<hr />Komentarze (2)<br /><strong>Publikowane komentarze są prywatnymi opiniami użytkowników witryny Michała Sternadela. Witryna Michała Sternadela nie ponosi odpowiedzialności za treść tych opinii.</strong><ul><li><b><a href="http://sternadel.pl/blog/?id=193#89">#2</a><br /></b>Autor: Krzysztof<br />Treść: Czy na ten modem istnieje jakiś gotowy linux jak ddwrt czy openwrt?<br />Dodano: 03.01.2021, 00:07:41</li><li><b><a href="http://sternadel.pl/blog/?id=193#77">#1</a><br /></b>Autor: Mariusz<br />Treść: No tak, ale żeby wpisać skrypt trzeba mieć uprawnienia roota, czy tak?<br />
Bo z poziomu user/user nie da się chyba tego zrobić... Podobnie jak prozaiczna zmiana kanału Wi-Fi ze standardowej &amp;#34;1&amp;#34; też wymaga roota...<br />Dodano: 04.09.2015, 17:26:41</li></ul><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/blog/?id=193</guid>
</item>
<item>
<title><![CDATA[Paproć]]></title>
<link>http://sternadel.pl/galerie/?id=353</link>
<pubDate>Sat, 06 Dec 2014 18:33:11 +0100</pubDate>
<description><![CDATA[<a href="/galerie/?id=353"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/4/1417887191.jpg" border="0" alt="Paproć"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=353</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/4/1417887191.jpg&amp;wh=800"  length="333570"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Grzyb]]></title>
<link>http://sternadel.pl/galerie/?id=352</link>
<pubDate>Mon, 10 Nov 2014 19:28:20 +0100</pubDate>
<description><![CDATA[<a href="/galerie/?id=352"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/2/1415644100.jpg" border="0" alt="Grzyb"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=352</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/2/1415644100.jpg&amp;wh=800"  length="52743"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Mak4]]></title>
<link>http://sternadel.pl/galerie/?id=351</link>
<pubDate>Sat, 26 Jul 2014 13:28:27 +0200</pubDate>
<description><![CDATA[<a href="/galerie/?id=351"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/4/1406374107.jpg" border="0" alt="Mak4"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=351</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/4/1406374107.jpg&amp;wh=800"  length="87587"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Za rok, dwa, pięć.]]></title>
<link>http://sternadel.pl/blog/?id=192</link>
<pubDate>Thu, 20 Feb 2014 11:26:37 +0100</pubDate>
<description><![CDATA[<p>Gdybym wiatr mógł zaprosić do głowy mej, pośpiesznie poprosiłbym o deflację bezużytecznych myśli nabrzmiałych jutrem, nieznanym, zmiennym, niepewnym. <cite>Hej wietrze, pozostaw mnie proszę jakim byłem</cite> - rzekłbym gromko, lecz najciszej jak tylko bym potrafił. Być może zostałby ze mnie ostaniec, porośnięty skorupą roślinności nabytej wiedzy, doświadczenia i wspomnień miłych - jak kiedyś samoistny w osądach, nieukalony myślą o przyszłości.</p><br />
<br />
<p>Wiatr jedynie pośpiesznie przewiewa przez włosy porosłe w nieładzie, przerzedzone upływem czasu. Przenosi tylko zapachy teraźniejsze, informacje o przyszłości, pogodzie, która jeszcze się nie dokonała, a będzie lada chwila - jak zwykle zmienna, niepewna i nieposkromiona.</p><br />
<br />
<p>Dociekają nieliczni co z przyszłością będzie, co za pięć lat, dziesięć, za tydzień... Wyczytują splin blogowego bytu. Może i racje mają. Któż określić by mógł co jutro stanie się? Czy jeśli postanowię, że będę beztrosko szurał kijkiem po księżycowym regolicie już niebawem, ktokolwiek uwierzy? Czy to w ogóle ma jakiekolwiek znaczenie?</p><br />
<br />
<p>Przeszłość będzie zawsze lepsza od przyszłości. Zawsze! Dlaczego? Choćby i <strong>tylko dlatego,</strong> że ona już była. Ona już była, minęła, nie będzie jej tu drugi raz, nigdy więcej.</p><hr />Komentarze (1)<br /><strong>Publikowane komentarze są prywatnymi opiniami użytkowników witryny Michała Sternadela. Witryna Michała Sternadela nie ponosi odpowiedzialności za treść tych opinii.</strong><ul><li><b><a href="http://sternadel.pl/blog/?id=192#73">#1</a><br /></b>Autor: Joanna<br />Treść: A ja zacytuję &amp;#34;Piękne są chwile których jeszcze nie znamy...&amp;#34;<br />Dodano: 04.06.2014, 12:53:13</li></ul><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/blog/?id=192</guid>
</item>
<item>
<title><![CDATA[Skóra na rok 2014]]></title>
<link>http://sternadel.pl/aktualnosci/?id=33</link>
<pubDate>Fri, 27 Dec 2013 19:19:56 +0100</pubDate>
<description><![CDATA[<p>Z reguły pod koniec roku moja strona doczekiwała się przebudowy to szaty graficznej to silnika. Wraz z nastaniem nowego roku czeka na Was nowa skóra, która obecnie ustawiona została jako domyślna skórka witryny. Pozdrawiam</p><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/aktualnosci/?id=33</guid>
</item>
<item>
<title><![CDATA[Pająk]]></title>
<link>http://sternadel.pl/galerie/?id=350</link>
<pubDate>Tue, 29 Oct 2013 09:41:26 +0100</pubDate>
<description><![CDATA[<a href="/galerie/?id=350"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/2/1383036086.jpg" border="0" alt="Pająk"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=350</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/2/1383036086.jpg&amp;wh=800"  length="50083"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Życie - łańcuch Markowa]]></title>
<link>http://sternadel.pl/blog/?id=191</link>
<pubDate>Mon, 07 Oct 2013 15:46:02 +0200</pubDate>
<description><![CDATA[<p>Wyciskany jak połówka wytoczonej na dębowej desce wcześniej w całości cytryny, miażdżony przez żeliwne dłonie w pięści ułożone, uderzany na wpół przytomny toporem rzeczywistości, owiany niezrozumieniem i najzwyczajniej w świecie - zmęczony, siedzę (chyba bardziej przez pomyłkę niż świadomie). Na wygładzonym już siedzisku tli się bunt przeplatany niemocą i natychmiast stłumiony mocnym razem, otwartą ręką w lewy policzek: <cite>&#34;Ej! Co tu robisz?&#34;</cite> - odzywa się wewnętrzny głos odważnego, chełpliwego siebie - <cite>&#34;Idź! Krzyknij! Trzaśnij drzwiami!&#34;.</cite> Zadufanie szybko oblewa wiadrem zimnej, lodowatej wody - siedzę.</p><br />
<br />
<p>Zanikam szybko, pytanie, na które każdy zna odpowiedź od tygodnia wciąż wali po małżowinie bezlitośnie, opadają już ręce, już nie chcę tego ciągnąć więcej, dość. Nagle słuchają wszyscy...</p><br />
<br />
<p>Całe życie w łańcuchu Markowa, całe to życie, które nie może być inne. Życie zdeterminowane wyborem narodzin, planowaniem lepszych dni, aż do śmierci i ogromnej pustki własnego psyche. Jeśli ktoś uważa, że życie to teatr wyborów - cóż, tak bardzo się myli, pierwsze skrzypce zawsze gra wybór pierwotny, z reguły nie Wasz.</p><br />
<br />
<p>Poczekam, aby ktoś pogonił mnie patykiem lub motyką, niczym łasego na cudze truskawki amatora grandowania. Na pozytywne pobudzenie z własnego wnętrza już raczej się nie doczekam chyba, chcę spać.</p><br />
<hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/blog/?id=191</guid>
</item>
<item>
<title><![CDATA[Struś]]></title>
<link>http://sternadel.pl/galerie/?id=349</link>
<pubDate>Wed, 31 Jul 2013 12:58:49 +0200</pubDate>
<description><![CDATA[<a href="/galerie/?id=349"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/9/1375268328.jpg" border="0" alt="Struś"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=349</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/9/1375268328.jpg&amp;wh=800"  length="93687"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Liść palmowy]]></title>
<link>http://sternadel.pl/galerie/?id=348</link>
<pubDate>Mon, 15 Jul 2013 10:04:25 +0200</pubDate>
<description><![CDATA[<a href="/galerie/?id=348"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/12/1373875465.jpg" border="0" alt="Liść palmowy"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=348</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/12/1373875465.jpg&amp;wh=800"  length="138819"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Mimoza]]></title>
<link>http://sternadel.pl/galerie/?id=347</link>
<pubDate>Fri, 12 Jul 2013 10:04:23 +0200</pubDate>
<description><![CDATA[<a href="/galerie/?id=347"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/12/1373616263.jpg" border="0" alt="Mimoza"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=347</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/12/1373616263.jpg&amp;wh=800"  length="61097"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Zarodniki palmowe]]></title>
<link>http://sternadel.pl/galerie/?id=346</link>
<pubDate>Fri, 12 Jul 2013 10:03:59 +0200</pubDate>
<description><![CDATA[<a href="/galerie/?id=346"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/12/1373616239.jpg" border="0" alt="Zarodniki palmowe"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=346</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/12/1373616239.jpg&amp;wh=800"  length="302180"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Liść]]></title>
<link>http://sternadel.pl/galerie/?id=345</link>
<pubDate>Fri, 12 Jul 2013 10:03:29 +0200</pubDate>
<description><![CDATA[<a href="/galerie/?id=345"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/12/1373616209.jpg" border="0" alt="Liść"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=345</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/12/1373616209.jpg&amp;wh=800"  length="124813"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Kurczaki]]></title>
<link>http://sternadel.pl/galerie/?id=344</link>
<pubDate>Wed, 26 Jun 2013 13:33:56 +0200</pubDate>
<description><![CDATA[<a href="/galerie/?id=344"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/12/1372246436.jpg" border="0" alt="Kurczaki"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=344</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/12/1372246436.jpg&amp;wh=800"  length="368650"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Wiosenne barwy]]></title>
<link>http://sternadel.pl/galerie/?id=343</link>
<pubDate>Tue, 11 Jun 2013 09:43:53 +0200</pubDate>
<description><![CDATA[<a href="/galerie/?id=343"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/4/1370936607.jpg" border="0" alt="Wiosenne barwy"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=343</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/4/1370936607.jpg&amp;wh=800"  length="50667"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Pod mostem]]></title>
<link>http://sternadel.pl/galerie/?id=342</link>
<pubDate>Tue, 11 Jun 2013 09:16:51 +0200</pubDate>
<description><![CDATA[<a href="/galerie/?id=342"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/7/1370934985.jpg" border="0" alt="Pod mostem"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=342</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/7/1370934985.jpg&amp;wh=800"  length="79951"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Kuźnia Pod Strzechą]]></title>
<link>http://sternadel.pl/galerie/?id=341</link>
<pubDate>Tue, 28 May 2013 14:29:52 +0200</pubDate>
<description><![CDATA[<a href="/galerie/?id=341"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/7/1369744170.jpg" border="0" alt="Kuźnia Pod Strzechą"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=341</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/7/1369744170.jpg&amp;wh=800"  length="93578"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Motel Krak]]></title>
<link>http://sternadel.pl/galerie/?id=340</link>
<pubDate>Tue, 28 May 2013 14:28:54 +0200</pubDate>
<description><![CDATA[<a href="/galerie/?id=340"><img src="http://sternadel.pl/mgs_thumbs.php?wh=300&img=images/galleries/7/1369744112.jpg" border="0" alt="Motel Krak"></a><br /><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/galerie/?id=340</guid>
<enclosure url="http://sternadel.pl/mgs_thumbs.php?img=images/galleries/7/1369744112.jpg&amp;wh=800"  length="72420"  type="image/jpeg" ></enclosure>
</item>
<item>
<title><![CDATA[Zestawianie wielu VPN z autoryzacją użytkownika]]></title>
<link>http://sternadel.pl/blog/?id=190</link>
<pubDate>Tue, 28 May 2013 14:21:50 +0200</pubDate>
<description><![CDATA[<p>W obecnych czasach sporo osób posiada własne serwery, czy to wirtualne, czy sprzętowe, rozsiane po wielu krajach świata. Wiele osób pracuje w małych przedsiębiorstwach z siecią lokalną i wielu również potrzebuje dostępu do zasobów tej sieci z każdego miejsca, na chwilę, na stałe, awaryjnie, z każdego mądrzejszego urządzenia, jakie ma się pod ręką. Niektóre osoby często również chcą zmienić swój wychodzący adres IP na inny, ulokowany w innym kraju, aby uzyskać dostęp do treści nieosiągalnych na danym terenie. Z pomocą przychodzi serwer oparty o OpenVPN, bardzo elastyczny w konfiguracji, bezpieczny i wspaniale radzący sobie w wielu warunkach. Przykładów konfiguracji w sieci jest wiele, przedstawię również i swój. Konfiguracja pozwoli na obsłużenie wielu użytkowników jednocześnie, autoryzowanych za pośrednictwem loginu i hasła, w miarę potrzeb również na przekazywanie pakietów przez serwer (Zmianę IP wyjściowego na świat).</p><br />
<br />
<p>Załóżmy, że na serwerze, do którego będziemy się łączyć zainstalowany jest system operacyjny Linux z dostępnym już w systemie pakietem OpenVPN w wersji 2 (Dla uproszczenia, przyjmę, że jest to Debian). Konfigurację rozpoczniemy od wygenerowania odpowiednich certyfikatów i kluczy, następnie od utworzenia pliku konfiguracyjnego serwera, niezbędnych skryptów autoryzujących użytkownika oraz samych użytkowników poprzez utworzenie pliku konfiguracyjnego dla klientów.</p><br />
<br />
<br />
<p>Kopiujemy <i>easy-rsa</i> w dowolne miejsce - polecam, aby się nie pogubić, umieścić kopię w <i>/etc/openvpn/easy-rsa/:</i><br /><br />
<code>cp /usr/share/doc/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa/ -R</code></p><br />
<br />
<p>Następnie przechodzimy do tego katalogu i wykonujemy szereg poleceń:<br /><br />
<code>cd /etc/openvpn/easy-rsa/<br /><br />
source ./vars<br /><br />
./clean-all<br /><br />
./build-ca</code> (Tutaj wpisujemy kolejno informacje potrzebne do wystawienia certyfikatu, należy zapamiętać wartość &#34;Common Name&#34;, dla uproszecznia polecam użyć: <i>vpn-server</i>)<br /><br />
<code>./build-key-server WARTOŚĆ_COMMON_NAME</code> (Tutaj wpisujemy potrzebne informacje do certyfikatu (&#34;A challenge password&#34; zostawiamy puste), a następnie wybieremy &#34;y&#34;, aby podpisać certyfikat i potwierdzamy jeszcze na końcu &#34;y&#34;. Jeżeli poprzednio, jako &#34;Common Name&#34; wpisano vpn-server, polecenie będzie miało postać: <code>./build-key-server vpn-server</code>)<br /><br />
<code>./build-dh<br /><br />
openvpn -genkey -secret ./keys/ta.key</code></p><br />
<br />
<p>Następnie tworzymy katalog <i>/etc/openvpn/keys/</i> i kopiujemy do niego niezbędne pliki:<br />
<code>mkdir /etc/openvpn/keys<br /><br />
cd /etc/openvpn/keys<br /><br />
cp /etc/openvpn/easy-rsa/keys/ca.crt .<br /><br />
cp /etc/openvpn/easy-rsa/keys/COMMON_NAME.{key,crt} .<br /><br />
cp /etc/openvpn/easy-rsa/keys/dh1024.pem .<br /><br />
cp /etc/openvpn/easy-rsa/keys/ta.key .</code><br />
</p><br />
<br />
<p>Tworzymy plik konfiguracyjny serwera o nazwie <i>vpn-server.conf</i> w katalogu <i>/etc/openvpn/:</i><br /><br />
<br />
<code>local <b>IP_ZEWNĘTRZNE_SERWERA</b><br /><br />
port 1194<br /><br />
proto udp<br /><br />
dev tap<br /><br />
tun-mtu 1500<br /><br />
server 10.119.202.0 255.255.255.0<br /><br />
ca /etc/openvpn/keys/ca.crt<br /><br />
cert /etc/openvpn/keys/<b>COMMON_NAME</b>.crt<br /><br />
key /etc/openvpn/keys/<b>COMMON_NAME</b>.key<br /><br />
dh /etc/openvpn/keys/dh1024.pem<br /><br />
tls-auth /etc/openvpn/keys/ta.key 0<br /><br />
cipher AES-256-CBC<br /><br />
persist-key<br /><br />
persist-tun<br /><br />
keepalive 5 60<br /><br />
reneg-sec 0<br /><br />
comp-lzo<br /><br />
user nobody<br /><br />
group nogroup<br /><br />
client-to-client<br /><br />
client-config-dir ccd<br /><br />
username-as-common-name<br /><br />
client-cert-not-required<br /><br />
auth-user-pass-verify /etc/openvpn/scripts/login.sh via-env<br /><br />
auth-nocache<br /><br />
max-clients 10<br /><br />
push &#34;persist-key&#34;<br /><br />
push &#34;persist-tun&#34;<br /><br />
ifconfig-pool-persist vpn-ipp.txt<br /><br />
# Przekierowanie całego ruchu przez VPN: push &#34;redirect-gateway def1&#34;<br /><br />
push &#34;explicit-exit-notify 1&#34;<br /><br />
script-security 3<br /><br />
status /var/log/vpn-server.status<br /><br />
log-append /var/log/vpn-openvpn.log<br /><br />
verb 0<br /><br />
</code></p><br />
<br />
<p>Następnie tworzymy niezbędny skrypt autoryzujący użytkowników, o nazwie <b>login.sh</b> w katalogu <i>/etc/openvpn/scripts/</i> (Tutaj autoryzacja jest oparta na pliku, ale nic nie stoi na przeszkodzie, aby użytkowników trzymać w bazie danych SQL czy w jakimś tam worku):<br /><br />
<code>#!/bin/bash<br /><br />
hash=`echo -n $password|md5sum|awk {&#39;print $1&#39;}`<br /><br />
user_id=$(cat /etc/openvpn/vpn-passwd | grep &#34;$username:$hash&#34; | awk -F&#34;:&#34; {&#39;print $1&#39;})<br /><br />
[ &#34;$user_id&#34; != &#39;&#39; ] && [ &#34;$user_id&#34; = &#34;$username&#34; ] && echo &#34;user : $username&#34; && echo &#39;authentication ok.&#39; && exit 0 || echo &#39;authentication failed.&#39;; exit 1<br />
</code></p><br />
<br />
<p>Należy jeszcze pamiętać, aby utworzyć jakiegoś użytkownika w pliku /etc/openvpn/vpn-passwd (format: user:md5(hasło)). Można się posłużyć trywialnym skryptem (o nazwie <b>adduser.sh</b>), aby ułatwić sobie pracę:<br /><br />
<code>#!/bin/bash<br /><br />
echo -n &#34;Login: &#34;<br /><br />
read login<br /><br />
echo -n &#34;Password: &#34;<br /><br />
read pass<br /><br />
password=`echo -n &#34;$pass&#34; | md5sum | awk {&#39;print $1&#39;}`<br /><br />
echo $login:$password >> /etc/openvpn/vpn-passwd<br /><br />
echo &#34;OK&#34;</code></p><br />
<p>Aby utworzyć użytkownika należy wpisać w konsoli: <code>/etc/openvpn/scripts/adduser.sh</code> oraz podać login i hasło.</p><br />
<br />
<p>Powyższe skrypty zapisujemy w katalogu <i>/etc/openvpn/scripts/</i> i pamiętamy, aby ustawić odpowiednie uprawnienia zarówno do katalogów jak i do pliku z hasłami:<br />
<code><br />
chmod a+r /etc/openvpn/vpn-passwd<br /><br />
chmod o-r /etc/openvpn/keys -R<br /><br />
chmod a+r,a+x /etc/openvpn/scripts -R</code><br />
</p><br />
<br />
<p>Możemy przystąpić do konfiguracji po stronie klienta. Tworzymy plik tekstowy o następującej zawartości:<br /><br />
<code>client<br /><br />
dev tap<br /><br />
proto udp<br /><br />
remote <b>IP_ZEWNĘTRZNE_SERWERA</b> 1194<br /><br />
nobind<br /><br />
persist-key<br /><br />
persist-tun<br /><br />
cipher AES-256-CBC<br /><br />
auth-user-pass<br /><br />
reneg-sec 14400<br /><br />
auth-nocache<br /><br />
comp-lzo<br /><br />
tun-mtu 1500<br /><br />
script-security 3<br /><br />
remote-cert-tls server<br /><br />
ca [inline]<br /><br />
tls-auth [inline] 1<br /><br />
<ca><br /><br />
<b>ZAWARTOŚĆ PLIKU ca.crt</b><br /><br />
</ca><br /><br />
<tls-auth><br /><br />
<b>ZAWARTOŚĆ PLIKU ta.key</b><br /><br />
</tls-auth></code></p><br />
<br />
<p>Jeżeli przerzucamy cały ruch przez nasz serwer VPN należy jeszcze pamiętać o odpowiedniej konfiguracji firewalla i przełączania pakietów:<br /><br />
<code>echo &#34;1&#34; > /proc/sys/net/ipv4/ip_forward<br /><br />
iptables -A FORWARD -i eth0 -o tap0 -m state --state ESTABLISHED,RELATED -j ACCEPT<br /><br />
iptables -A FORWARD -s 110.119.202.0/24 -o eth0 -j ACCEPT<br /><br />
iptables -t nat -A POSTROUTING -s 10.119.202.0/24 ! -d 10.119.202.0/24 -o eth0 -j MASQUERADE</code></p><br />
<br />
<p>Możemy uruchomić już nasz serwer VPN (dla testów: openvpn -config /etc/openvpn/vpn-server.conf) i połączyć się wpisując openvpn -config vpn-server-client.ovpn. W przypadku, gdy wszystko okaże się działające możemy zautomatyzować start, zmieniając odpowiednie wpisy w pliku <i>/etc/default/openvpn.</i></p><br />
<br />
<p>Jeżeli z jakichś powodów chcemy routować ruch tylko niektórym użytkownikom, należy w katalogu <i>/etc/openvpn/ccd</i> utworzyć plik <b>Nazwa_użytkownika</b> i zawrzeć w nim odpowiednie opcje konfiguracyjne: <code>push &#34;redirect-gateway def1&#34;</code>, pamiętając, aby usunąć tą opcję w konfigu głównym. Dzięki dodatkowym plikom konfiguracyjnym można również powiedzieć, że klient może trasować pakiety do swojej lokalnej sieci lub w dowolną sieć. Możliwości jest pełno, zapraszam do eksperymentowania.</p><br />
<br />
<p>W załączeniu znajduje się gotowa konfiguracja z użytkownikiem guest i hasłem guest, powinna zadziałać w większości przypadków, ale zalecam do utworzenia własnej konfiguracji.</p><hr />Komentarze (4)<br /><strong>Publikowane komentarze są prywatnymi opiniami użytkowników witryny Michała Sternadela. Witryna Michała Sternadela nie ponosi odpowiedzialności za treść tych opinii.</strong><ul><li><b><a href="http://sternadel.pl/blog/?id=190#80">#4</a><br /></b>Autor: Michał Sternadel<br />Treść: Można spróbować użyć DNSMasq i podać mu w konfiguracji wygenerowany plik hosts na podstawie ipp.txt: cat /etc/openvpn/ipp.txt |awk -F&amp;#39;,&amp;#39; {&amp;#39;print $2 &amp;#34; &amp;#34; $1&amp;#39;} &gt;/etc/openvpn/hosts<br />
Uruchamiać przez: dnsmasq -H /etc/openvpn/hosts (...)<br />
Pozdrawiam.<br />Dodano: 14.10.2016, 16:23:04</li><li><b><a href="http://sternadel.pl/blog/?id=190#79">#3</a><br /></b>Autor: Lukasz<br />Treść: Masz jakiś sprawdzony sposób na rozwiązywanie nazw hostów wykorzystując do tego np plik ipp.txt ?<br />Dodano: 09.10.2016, 12:34:56</li><li><b><a href="http://sternadel.pl/blog/?id=190#74">#2</a><br /></b>Autor: Maciej Ziemirski<br />Treść: Po wpisaniu polecenia &amp;#34;iptables -A FORWARD -i eth0 -o tap0 -m state -state ESTABLISHED,RELATED -j ACCEPT&amp;#34; wywala komunikat ze niema takiego polecenia i i nie można się połączyć z serwerem. Debian 7 x64<br />Dodano: 11.01.2015, 13:29:30</li><li><b><a href="http://sternadel.pl/blog/?id=190#72">#1</a><br /></b>Autor: ZigZag<br />Treść: To działa! Dzięki.<br />Dodano: 27.12.2013, 10:33:57</li></ul><hr />]]></description>
<author><![CDATA[Sternadel Michał]]></author>
<guid isPermaLink="true" >http://sternadel.pl/blog/?id=190</guid>
</item>
</channel>
</rss>