In een vorige post kan je lezen hoe je een VPN tunnel kan opzetten met het PPTP protocol. Echter hiervoor moet de uitgaande poort tcp port 1723 open staan. Blijkt dat op alle plaatsen waar ik ben geweest die poort iedere keer toe stond.
Mocht ik nu eens een tunnel kunnen maken op een poort die altijd open staat zoals poort 443 (https)?
Maar probleem/uitdaging... ik heb slechts één IP adres. Hierachter draait een Exchange, HTTPS websites (op Apache) en nu ook OpenVPN.
Exchange oplossen, daar ga ik me gemakkelijk van af maken. Als ik op een laptop werk, dan moet ik maar een VPN tunnel maken. En voor die Android phones, die moeten maar connecteren op poort 1443. Die heb ik hier intern ook geforward naar de Exchange.
Maar dan heb ik nog de https websites en OpenVPN die beiden op poort 443 moeten werken.
De zoektocht op Google gaf me niet direct iets om een 'NAT' te doen op hostname. Alles werkt op poort niveau. Forward poort 444 naar interne server AA op poort 443.
Maar ik heb nog geen firewall, router of software gevonden die poort 443 met hostname hostAA.domein.be forward naar interne server AA op poort 443 en die poort 443 voor hostBB.domein.be forward naar interne server BB op poort 443.
Helaas.
Maar er is wel een software sslh (http://www.rutschle.net/sslh) die de pakketten (de eerste toch) inspecteert en zo kan zien welk soort trafiek het is. bv SSH, HTTPS, OpenVPN, tinc of XMPP.
Great. Dan kan ik deze trafiek forwarden naar waar ik die wil!
In het kort:
Todo: sslh, pas in de config de hostname aan zodat er slechts op één interface wordt geluisterd (daar zend je al de 443 trafiek naartoe vanaf je router).
Pas de apache config aan zodat https luistert op localhost:443 ipv *:443
start sslh en apache.
Install OpenVPN en config die voor tcp op poort 1194 (ja de standaard poort). Maar laat sslh die trafiek forwarden naar poort 1194.
SSLH
yum install sslh -y #vi /etc/sysconfig/sslh vi /etc/sslh.cfg
listen: ( { host: "ip.van.deze.server"; port: "443"; } ); protocols: ( { name: "ssh"; service: "ssh"; host: "localhost"; port: "22"; }, { name: "openvpn"; host: "ip.van.deze.server"; port: "1194"; }, # { name: "xmpp"; host: "localhost"; port: "5222"; }, # { name: "http"; host: "localhost"; port: "80"; }, { name: "ssl"; host: "localhost"; port: "443"; log_level: 0; }, { name: "anyprot"; host: "localhost"; port: "443"; } );
pas de lijn aan: thelonious -> IP van de server (niet 127.0.0.1 of localhost)
systemctl enable sslh.service
pas ssl.conf aan van apache (/etc/httpd/conf.d/ssl.conf)
Listen localhost:443
Zorg dat apache niet meer luistert op het IP-adres, zet die even af
systemctl stop httpd
Start sslh
systemctl start sslh
Check als er fouten zijn
systemctl status sslh
Start Apache terug
systemctl start httpd
OpenVPN Certificaten
yum install openvpn easy-rsa -y cd /usr/share/easy-rsa/2.0 vi vars
export KEY_COUNTRY="BE" export KEY_PROVINCE="West-Vlaanderen" export KEY_CITY="Ruiselede" export KEY_ORG="Reynaert" export KEY_EMAIL="info@reynaert.be" export KEY_OU="Intranet"
source ./vars ./clean-all ./build-ca
Wanneer de Name [EasyRSA] wordt gevraagd kan je bv invoeren: Server-CA
./build-key-server server
Ook hier terug wanneer de Name [EasyRSA] wordt gevraagd kan je bv invoeren: Server-CRT
teken het certificaat en commit het.
Copieer de keys
cp -pR /usr/share/easy-rsa/2.0/keys /etc/openvpn/keys
Config voor certificaten van clients
cd /usr/share/easy-rsa/2.0
Genereer de keys voor een client hier client01, maar dit kan ook een voornaam zijn of ...
./build-key client01
kopieer de "ca.crt", "client01.crt", "client01.key"
Voorbeeld ovpn file.
Plak de certificaten tussen de certificaat tags
# This configuration is for $CN #viscosity dns full #viscosity usepeerdns true #viscosity dhcp true tls-client pull client dev tun proto tcp remote hostname.van.WAN 443 redirect-gateway def1 nobind persist-key persist-tun comp-lzo verb 3 ... --> plak hier ca.crt ... --> plak hier client01.crt ... --> plak hier client01.key # #... # #remote-cert-tls server #ns-cert-type server verify-x509-name 'C=XX, ST=XX, L=XX, O=XX, OU=XX, CN=XX, name=XX, emailAddress=XX' subject key-direction 1 cipher AES-256-CBC tls-version-min 1.2 #auth SHA512 tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
Om de XX te vervangen door de juiste data kan je dit gebruiken:
openssl x509 -in keys/server.crt -text|grep Subject:|sed 's|/name=|, name=|g;s|/emailAddress=|, emailAddress=|g;s|.*Subject: ||g'
OpenVPN
Maak eenDiffie-Hellman bestand
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Configureer Open VPN (server)
standaard staat er niks in de /etc/openvpn directory, vertrek vanaf de voorbeeld bestanden
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/ cd /etc/openvpn/ vi server.conf
listen to 127.0.0.1 only (since we are using sslh) ;proto udp is goed. (Note: De traffic over de VPN tunnel zal/kan dan wel tcp zijn) Maar helaas kan sslh dit niet aan. proto tcp ca keys/ca.crt cert keys/server.crt key keys/server.key Zet de server in Bridge mode. dev tap0 ;server 10.8.0.0 255.255.255.0 server-bridge 10.11.94.160 255.255.255.0 10.11.94.161 10.11.94.169 Forceer DNS push "dhcp-option DNS 10.11.94.50" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" Laat toe dat meerdere clients connectern met dezelfde keys duplicate-cn #Andere settings: keepalive 10 120 # indien compressie actief wordt gezet moet dit ook gedaan worden voor de clients comp-lzo persist-key persist-tun log /var/log/openvpn.log log-append /var/log/openvpn.log verb 3 #Wanneer server (in bridge) wordt gebruikt moet onderstaande in comment ;explicit-exit-notify 1
Settings voor de brige mode
Install bridge utils
yum install bridge-utils net-tools -y
Copieer openvpn startup en shutdowwn
cp /usr/share/doc/openvpn-*/sample/sample-scripts/bridge-start /etc/openvpn/openvpn-startup cp /usr/share/doc/openvpn-*/sample/sample-scripts/bridge-stop /etc/openvpn/openvpn-shutdown chmod 755 /etc/openvpn/openvpn-startup /etc/openvpn/openvpn-shutdown vi /etc/openvpn/openvpn-startup
eth="eth0" # check welke adapter er gebruikt word: ip ad eth_ip="start.van.ip.address" # IP voor bridge interface -> komt overeen met start van de DHCP pool die je hebt voorzien eth_netmask="255.255.255.0" # subnet mask eth_broadcast="10.11.94.255"# broadcast address # voeg toe op het einde van bestand/config: dit definieerd de gateway eth_gw="ip.van.de.gateway" route add default gw $eth_gw
Copieer de settings voor de bridge service
cp /usr/lib/systemd/system/openvpn@.service /usr/lib/systemd/system/openvpn-bridge.service vi /usr/lib/systemd/system/openvpn-bridge.service
Pas aan onder de sectie [Service]
[Service] PrivateTmp=true Type=forking PIDFile=/var/run/openvpn/openvpn.pid ExecStartPre=/bin/echo 1 > /proc/sys/net/ipv4/ip_forward ExecStartPre=/etc/openvpn/openvpn-startup ExecStart=/usr/sbin/openvpn --daemon --writepid /var/run/openvpn/openvpn.pid --cd /etc/openvpn/ --config server.conf ExecStopPost=/etc/openvpn/openvpn-shutdown ExecStopPost=/bin/echo 0 > /proc/sys/net/ipv4/ip_forward
Klaar om de server te starten
systemctl start openvpn-bridge
En start bij booten
systemctl enable openvpn-bridge