CentOS 7, https websites en OpenVPN beiden op poort 443

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

 

Terug naar overzicht nieuws