PPTP + Linux

Konfiguracja tunelu PPTP w środowisku Linux (Debian, Mint, Ubuntu)

Opracowane na podstawie: https://wiki.archlinux.org/index.php/PPTP_Client

Instalacja oprogramowania klienckiego do obsługi PPTP:

root@debian_lx ~ # apt-get install pptp-linux

Konfiguracja tunelu z użyciem komendy: pptpsetup

Dodawanie (konfigurowanie) tunelu:

root@debian_lx ~ # pptpsetup --create hamnet_tunnel --server gw.hamnet.pl --username sp6xx-miasto --password H4Sl0!123 --encrypt

lub:

root@debian_lx ~ # pptpsetup --create hamnet_tunnel --server 176.121.81.54 --username sp6xx-miasto --password H4Sl0!123 --encrypt

Usuwanie istniejącej konfiguracji tunelu:

root@debian_lx ~ # pptpsetup --delete hamnet_tunnel

Konfiguracja routingu

Po dodaniu tunelu konieczne jest dodanie routingu domyślnego, który będzie ustawiany w chwilę po zestawieniu połączenia PPTP:

Ustawiamy routing do sieci 44.128.0.0/10 poprzez zestawiony tunel. Należy stworzyć plik: /etc/ppp/ip-up.d/routes oraz skopiować do niego poniższą zawartość:

#!/bin/bash
# This script is called with the following arguments:
# Arg Name
# $1 Interface name
# $2 The tty
# $3 The link speed
# $4 Local IP number
# $5 Peer IP number
# $6 Optional ``ipparam'' value foo
/bin/ip r a 44.128.0.0/10 via $4

Po zapisaniu pliku należy ustawić na nim flagę: 'x' która pozwoli na uruchomienie skryptu.

root@debian_lx ~ # chmod +rx /etc/ppp/ip-up.d/routes

Testowe uruchomienie tunelu

W celu przetestowania konfiguracji, uruchamiamy:

root@debian_lx ~ # pon hamnet_tunnel debug dump logfd 2 nodetach

Jeżeli wszystko jest ok, połączenie zostanie zestawione, a sama komenda nie zakończy działania, wychodząc do wiersza poleceń.

Weryfikacja pracy tunelu

W celu sprawdzenia zestawionego tunelu, używając innego terminalu wykonujemy komendę:

root@debian_lx ~ # ifconfig ppp0
ppp0      Link encap:Point-to-Point Protocol  
          inet addr:44.132.96.6  P-t-P:44.132.96.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1446  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:74 (74.0 B)  TX bytes:1354 (1.3 KB)

Adres 44.132.96.1 jest w tym przypadku adresem IP po drugiej (zdalnej) stronie zestawionego tunelu. Możemy go użyc, aby przetestować zestawiony tunel przy pomocy komendy ping:

root@debian_lx ~ # ping 44.132.96.1
PING 44.132.96.1 (44.132.96.1) 56(84) bytes of data.
64 bytes from 44.132.96.1: icmp_seq=1 ttl=64 time=41.2 ms
64 bytes from 44.132.96.1: icmp_seq=2 ttl=64 time=42.3 ms
64 bytes from 44.132.96.1: icmp_seq=3 ttl=64 time=41.3 ms
^C
--- 44.132.96.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 41.274/41.667/42.331/0.527 ms

Działanie komendy ping, przerywamy poprzez CTRL+c. Podobnie, zatrzymujemy uruchomiony wcześniej tunel w trybie DEBUG.

Jeżeli tunel został zestawiony pomyślnie, możemy go teraz uruchomić bez opcji debug, tak aby pracował w tle:

Testowy (Ręczny) start oraz zatrzymanie pracy klienta PPTP

Uruchomienie:

root@debian_lx ~ # pon hamnet_tunnel

Zatrzymanie

root@debian_lx ~ # poff hamnet_tunnel

Ważne jest także, by zwrócić uwagę, czy nasza wcześniej zdefiniowana reguła routingu została także prawidłowo dodana. W tablicy routingu powinna istnieć reguła podobna do poniższej:

root@debian_lx ~ # ip r l | grep 44.0.0.0
44.128.0.0/10 via 44.132.96.6 dev ppp0 

Automatyczny start klienta PPTP wraz ze startem systemu.

Aby tunel uruchamiał się automatycznie, wraz ze startem systemu, w przypadku systemow z systemd, najprościej jest stworzyć plik w poniższej lokalizacji:

# cat /etc/systemd/system/pptp.service
[Unit]
Description=HamNet Tunnel
Requires=network-online.target
After=network.target

[Service]
Type=forking
Restart=always
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/pon hamnet_tunnel
ExecStop=/usr/bin/poff hamnet_tunnel

[Install]
WantedBy=multi-user.target

Po stworzeniu pliku, dokonujemy jego włączenia oraz uruchomienia usługi:

# systemctl enable pptp.service
# systemctl start pptp.service

Odczekujemy chwilę aby tunel PPTP zdążył się zestawić i sprawdzamy status:

# systemctl status pptp.service
● pptp.service - My Service
   Loaded: loaded (/etc/systemd/system/pptp.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-02-24 23:48:34 GMT; 8min ago
  Process: 1451 ExecStart=/usr/bin/pon hamnet_tunnel (code=exited, status=0/SUCCESS)
 Main PID: 1452 (pppd)
    Tasks: 4 (limit: 4915)
   CGroup: /system.slice/pptp.service
           ├─1452 /usr/sbin/pppd call hamnet_tunnel
           ├─1453 sh -c pptp 213.108.12.174 --nolaunchpppd
           ├─1455 pptp 213.108.12.174 --nolaunchpppd
           └─1467 pptp 213.108.12.174 --nolaunchpppd

Feb 24 23:48:36 debian_lx pppd[1452]: local  IP address 44.132.96.6
Feb 24 23:48:36 debian_lx pppd[1452]: remote IP address 44.132.96.1
Feb 24 23:49:35 debian_lx pptp[1467]: anon log[logecho:pptp_ctrl.c:719]: Echo Reply received.
Feb 24 23:50:35 debian_lx pptp[1467]: anon log[logecho:pptp_ctrl.c:719]: Echo Reply received.
Feb 24 23:51:35 debian_lx pptp[1467]: anon log[logecho:pptp_ctrl.c:719]: Echo Reply received.

Użycie powyższego rozwiązania jest o tyle praktyczne, że systemd będzie pilnował aby proces pptp pracował nieustannie. W wypadku zerwania połączenia, lub też przypadkowego usunięcia procesu spowoduje jego ponowne uruchomienie i zestawienie tunelu.

Start klienta PPTP w systemach bez systemd

W przypadku starszych wersji systemu możemy użyć do uruchomienia tunelu wpisu w pliku /etc/rc.local

sleep 20 && /usr/bin/pon hamnet_tunnel &

Warto zweryfikować czy aby na pewno "/usr/bin/pon" jest właściwą lokalizacją, uruchamiając:

# ls -l /usr/bin/pon
-rwxr-xr-x 1 root root 1362 Dec  4  2015 /usr/bin/pon

Informacje dodatkowe o plikach konfiguracyjnych

Powyższy opis bazuje na komendzie pptpsetup, która automatycznie konfiguruje tunel PPTP. Możliwe jest także przeprowadzanie ręcznych zmian lub też sprawdzenia wygenerowanej konfiguracji. Poniżej opisane pliki zawierają informacje konieczne do działania tunelu, które powinny zostać automatycznie skonfigurowane:

root@debian_lx ~ # grep -v ^# /etc/ppp/options.pptp 
lock
noauth
refuse-pap
refuse-eap
refuse-chap
refuse-mschap
nobsdcomp
nodeflate

Nazwa użytkownika, nazwa tunelu oraz hasło:

root@debian_lx ~ # grep -v ^# /etc/ppp/chap-secrets
sp6xx-miasto hamnet_tunnel "H4Sl0!123" *

Ważne, aby plik zawierający hasło miał ustawione flagi protekcji w następujący sposób:

root@debian_lx ~ # chmod 0600 /etc/ppp/chap-secrets

Adres bramy do zestawienia połączenia PPTP:

root@debian_lx ~ # cat /etc/ppp/peers/hamnet_tunnel 
# written by pptpsetup
pty "pptp 213.108.12.174 --nolaunchpppd"
lock
noauth
nobsdcomp
nodeflate
name sp6xx-miasto
remotename hamnet_tunnel
ipparam hamnet_tunnel
require-mppe-128

Włączenie forwardowania pakietów pomiędzy interfejsami.

W celu włączenia forwardowania pakietów (pracy kernela jako router) konieczne jest włączenie wpisu w pliku konfiguracyjnym:

Domyślnie opcja uruchamiająca forward pomiędzy interfejsami jest wykomentowana:

# grep ip_forward /etc/sysctl.d/99-sysctl.conf
#net.ipv4.ip_forward=1

Należy usunąć znak '#' poprzedzający powyższą linię, oraz przeładować zmiany:

# nano /etc/sysctl.d/99-sysctl.conf
ctrl+x

Przeładować zmiany, oraz sprawdzić aktywne wartość. (powinno być to: 1)

# sysctl --system

# cat /proc/sys/net/ipv4/ip_forward
1

Konfiguracja podsieci HamNET

W przypadku systemu Debian oraz pochodnych (ubuntu, mint, etc), statyczna konfiguracja interfejsów znajduje sie w katalogu "/etc/network/interfaces.d/". Wystarczy umieścić w nim plik konfiguracyjny dla przydzielonej podsieci:

# cat /etc/network/interfaces.d/enp0s8
auto enp0s8
iface enp0s8 inet static
        address 44.132.20.1
        netmask 255.255.255.224

Restart systemu lub też ręczna aktywacja interfejsu powinna zakończyć proces konfiguracji:

# ifup enp0s8
# ip a s enp0s8
3: enp0s8:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:d7:75:3c brd ff:ff:ff:ff:ff:ff
    inet 44.132.20.1/27 brd 44.132.12.31 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fed7:753c/64 scope link 
       valid_lft forever preferred_lft forever

Konfiguracja urządzenia końcowego.

Ostatnim krokiem powinno być skonfigurowanie urządzenia klienckiego podłączonego do nowo skonfigurowanego interfejsu:

W przypadku zastosowania powyżej rozpatrywanej podsieci, klient (komputer lub urządzenie sieciowe) mogłby otrzymać następujące ustawienia:

  • IP: 44.132.20.2
  • Maska: 255.255.255.224 lub /27
  • Brama: 44.132.20.1