mirror of
https://gitlab.com/shorewall/code.git
synced 2024-12-25 15:48:56 +01:00
71c448e6c7
git-svn-id: https://shorewall.svn.sourceforge.net/svnroot/shorewall/trunk@2629 fbd18981-670d-0410-9b5c-8dc0c1a9a2bb
420 lines
13 KiB
XML
420 lines
13 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
|
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
|
<article id="OPENVPN">
|
|
<!--$Id$-->
|
|
|
|
<articleinfo>
|
|
<title>OpenVPN Tunnels</title>
|
|
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Simon</firstname>
|
|
|
|
<surname>Mater</surname>
|
|
</author>
|
|
|
|
<author>
|
|
<firstname>Tom</firstname>
|
|
|
|
<surname>Eastep</surname>
|
|
</author>
|
|
</authorgroup>
|
|
|
|
<pubdate>2005-08-30</pubdate>
|
|
|
|
<copyright>
|
|
<year>2003</year>
|
|
|
|
<year>2004</year>
|
|
|
|
<year>2005</year>
|
|
|
|
<holder>Simon Mater</holder>
|
|
|
|
<holder>Thomas M. Eastep</holder>
|
|
</copyright>
|
|
|
|
<legalnotice>
|
|
<para>Permission is granted to copy, distribute and/or modify this
|
|
document under the terms of the GNU Free Documentation License, Version
|
|
1.2 or any later version published by the Free Software Foundation; with
|
|
no Invariant Sections, with no Front-Cover, and with no Back-Cover
|
|
Texts. A copy of the license is included in the section entitled
|
|
<quote><ulink url="GnuCopyright.htm">GNU Free Documentation
|
|
License</ulink></quote>.</para>
|
|
</legalnotice>
|
|
</articleinfo>
|
|
|
|
<caution>
|
|
<para><emphasis role="bold">This article applies to Shorewall 3.0 and
|
|
later. If you are running a version of Shorewall earlier than Shorewall
|
|
3.0.0 then please see the documentation for that
|
|
release.</emphasis></para>
|
|
</caution>
|
|
|
|
<para>OpenVPN is a robust and highly configurable VPN (Virtual Private
|
|
Network) daemon which can be used to securely link two or more private
|
|
networks using an encrypted tunnel over the internet. OpenVPN is an Open
|
|
Source project and is <ulink
|
|
url="http://openvpn.sourceforge.net/license.html">licensed under the
|
|
GPL</ulink>. OpenVPN can be downloaded from <ulink
|
|
url="http://openvpn.net/">http://openvpn.net/</ulink>.</para>
|
|
|
|
<para>OpenVPN support was added to Shorewall in version 1.3.14.</para>
|
|
|
|
<warning>
|
|
<para>The default port number for OpenVPN changed from 5000 to 1194 in
|
|
Shorewall version 2.2.0 RC2. This change follows OpenVPN 2.0 which also
|
|
changed its default port to 1194. In the text that follows, where you see
|
|
Port 1194 this can also refer to port 5000 depending on which version of
|
|
Shorewall and OpenVPN that you are using.</para>
|
|
</warning>
|
|
|
|
<section>
|
|
<title>Preliminary Reading</title>
|
|
|
|
<para>I recommend reading the <ulink url="VPNBasics.html">VPN
|
|
Basics</ulink> article if you plan to implement any type of VPN.</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Bridging two Masqueraded Networks</title>
|
|
|
|
<para>Suppose that we have the following situation:</para>
|
|
|
|
<graphic fileref="images/TwoNets1.png" />
|
|
|
|
<para>We want systems in the 192.168.1.0/24 subnetwork to be able to
|
|
communicate with the systems in the 10.0.0.0/8 network. This is
|
|
accomplished through use of the
|
|
<filename>/etc/shorewall/tunnels</filename> file and the
|
|
<filename>/etc/shorewall/policy file</filename> and OpenVPN.</para>
|
|
|
|
<para>While it was possible to use the Shorewall start and stop script to
|
|
start and stop OpenVPN, I decided to use the init script of OpenVPN to
|
|
start and stop it.</para>
|
|
|
|
<para>On each firewall, you will need to declare a zone to represent the
|
|
remote subnet. We'll assume that this zone is called <quote>vpn</quote>
|
|
and declare it in <filename>/etc/shorewall/zones</filename> on both
|
|
systems as follows.</para>
|
|
|
|
<blockquote>
|
|
<para><filename>/etc/shorewall/zones</filename> — Systems A &
|
|
B</para>
|
|
|
|
<programlisting>#ZONE TYPE OPTIONS IN OUT
|
|
# OPTIONS OPTIONS
|
|
vpn plain</programlisting>
|
|
</blockquote>
|
|
|
|
<para>On system A, the 10.0.0.0/8 will comprise the <emphasis
|
|
role="bold">vpn</emphasis> zone.</para>
|
|
|
|
<blockquote>
|
|
<para>In <filename>/etc/shorewall/interfaces</filename> on system
|
|
A:</para>
|
|
|
|
<programlisting>#ZONE INTERFACE BROADCAST OPTIONS
|
|
vpn tun0</programlisting>
|
|
</blockquote>
|
|
|
|
<para>In <filename>/etc/shorewall/tunnels</filename> on system A, we need
|
|
the following:</para>
|
|
|
|
<blockquote>
|
|
<programlisting>#TYPE ZONE GATEWAY GATEWAY ZONE
|
|
openvpn net 134.28.54.2</programlisting>
|
|
</blockquote>
|
|
|
|
<note>
|
|
<para>Shorewall versions prior to 2.2.0 Beta 1 enforced use of the same
|
|
port number for both the source and destination port.</para>
|
|
|
|
<para>Some OpenVPN clients (notabley on <trademark>Windows</trademark>)
|
|
do not use the same source and destination ports which can cause
|
|
problems. If system B is a Windows system or if you find that Shorewall
|
|
is blocking the UDP port 1194 traffic from the remote gateway and you
|
|
are running a version of Shorewall prior to 2.2.0 Beta 1, then you will
|
|
want the following entry in <filename>/etc/shorewall/tunnels</filename>
|
|
instead of the one above:</para>
|
|
|
|
<programlisting>#TYPE ZONE GATEWAY GATEWAY ZONE
|
|
generic:udp:1194 net 134.28.54.2</programlisting>
|
|
</note>
|
|
|
|
<para>This entry in <filename>/etc/shorewall/tunnels</filename> opens the
|
|
firewall so that OpenVPN traffic on the default port 1194/udp will be
|
|
accepted to/from the remote gateway. If you change the port used by
|
|
OpenVPN to 7777, you can define /etc/shorewall/tunnels like this:</para>
|
|
|
|
<blockquote>
|
|
<para>/etc/shorewall/tunnels with port 7777:</para>
|
|
|
|
<programlisting>#TYPE ZONE GATEWAY GATEWAY ZONE
|
|
openvpn:7777 net 134.28.54.2</programlisting>
|
|
</blockquote>
|
|
|
|
<para>This is the OpenVPN config on system A:</para>
|
|
|
|
<blockquote>
|
|
<programlisting>dev tun
|
|
local 206.162.148.9
|
|
remote 134.28.54.2
|
|
ifconfig 192.168.99.1 192.168.99.2
|
|
up ./route-a.up
|
|
tls-server
|
|
dh dh1024.pem
|
|
ca ca.crt
|
|
cert my-a.crt
|
|
key my-a.key
|
|
comp-lzo
|
|
verb 5</programlisting>
|
|
</blockquote>
|
|
|
|
<para>Similarly, On system B the 192.168.1.0/24 subnet will comprise the
|
|
<emphasis role="bold">vpn</emphasis> zone</para>
|
|
|
|
<blockquote>
|
|
<para>In <filename>/etc/shorewall/interfaces</filename> on system
|
|
B:</para>
|
|
|
|
<programlisting>#ZONE INTERFACE BROADCAST OPTIONS
|
|
vpn tun0 192.168.1.255</programlisting>
|
|
</blockquote>
|
|
|
|
<para>In <filename>/etc/shorewall/tunnels</filename> on system B, we
|
|
have:</para>
|
|
|
|
<blockquote>
|
|
<programlisting>#TYPE ZONE GATEWAY GATEWAY ZONE
|
|
openvpn net 206.191.148.9</programlisting>
|
|
</blockquote>
|
|
|
|
<para>And in the OpenVPN config on system B:</para>
|
|
|
|
<blockquote>
|
|
<programlisting>dev tun
|
|
local 134.28.54.2
|
|
remote 206.162.148.9
|
|
ifconfig 192.168.99.2 192.168.99.1
|
|
up ./route-b.up
|
|
tls-client
|
|
ca ca.crt
|
|
cert my-b.crt
|
|
key my-b.key
|
|
comp-lzo
|
|
verb 5</programlisting>
|
|
</blockquote>
|
|
|
|
<para>You will need to allow traffic between the <quote>vpn</quote> zone
|
|
and the <quote>loc</quote> zone on both systems -- if you simply want to
|
|
admit all traffic in both directions, you can use the policy file:</para>
|
|
|
|
<blockquote>
|
|
<para><filename>/etc/shorewall/policy </filename>on systems A &
|
|
B</para>
|
|
|
|
<programlisting>#SOURCE DEST POLICY LOG LEVEL
|
|
loc vpn ACCEPT
|
|
vpn loc ACCEPT</programlisting>
|
|
</blockquote>
|
|
|
|
<para>On both systems, restart Shorewall and start OpenVPN. The systems in
|
|
the two masqueraded subnetworks can now talk to each other.</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Roadwarrior</title>
|
|
|
|
<para>OpenVPN 2.0 provides excellent support for roadwarriors. Consider
|
|
the setup in the following diagram:</para>
|
|
|
|
<graphic fileref="images/Mobile.png" />
|
|
|
|
<para>On the gateway system (System A), we need a zone to represent the
|
|
remote clients — we'll call that zone <quote>road</quote>.</para>
|
|
|
|
<blockquote>
|
|
<para><filename>/etc/shorewall/zones</filename> — System A:</para>
|
|
|
|
<programlisting>#ZONE TYPE OPTIONS IN OUT
|
|
# OPTIONS OPTIONS
|
|
road plain</programlisting>
|
|
</blockquote>
|
|
|
|
<para>On system A, the remote clients will comprise the <emphasis
|
|
role="bold">road</emphasis> zone.</para>
|
|
|
|
<blockquote>
|
|
<para>In <filename>/etc/shorewall/interfaces</filename> on system
|
|
A:</para>
|
|
|
|
<programlisting>#ZONE INTERFACE BROADCAST OPTIONS
|
|
road tun+</programlisting>
|
|
</blockquote>
|
|
|
|
<para>In <filename>/etc/shorewall/tunnels</filename> on system A, we need
|
|
the following:</para>
|
|
|
|
<blockquote>
|
|
<programlisting>#TYPE ZONE GATEWAY GATEWAY ZONE
|
|
openvpn:1194 net 0.0.0.0/0</programlisting>
|
|
</blockquote>
|
|
|
|
<para>If you are running Shorewall 2.4.3 or later, you might prefer the
|
|
following in <filename>/etc/shorewall/tunnels</filename> on system A.
|
|
Specifying the tunnel type as openvpnserver has the advantage that the VPN
|
|
connection will still work if the client is behind a gateway/firewall that
|
|
uses NAT.</para>
|
|
|
|
<blockquote>
|
|
<programlisting>#TYPE ZONE GATEWAY GATEWAY ZONE
|
|
openvpnserver:1194 net 0.0.0.0/0</programlisting>
|
|
</blockquote>
|
|
|
|
<para>We want the remote systems to have access to the local LAN — we do
|
|
that with an entry in <filename>/etc/shorewall/policy</filename> (assume
|
|
that the local LAN comprises the zone <quote>loc</quote>).</para>
|
|
|
|
<blockquote>
|
|
<programlisting>#SOURCE DESTINATION POLICY
|
|
road loc ACCEPT</programlisting>
|
|
</blockquote>
|
|
|
|
<para>The OpenVPN configuration file on system A is something like the
|
|
following:</para>
|
|
|
|
<blockquote>
|
|
<programlisting>dev tun
|
|
|
|
server 192.168.2.0 255.255.255.0
|
|
|
|
dh dh1024.pem
|
|
|
|
ca /etc/certs/cacert.pem
|
|
|
|
crl-verify /etc/certs/crl.pem
|
|
|
|
cert /etc/certs/SystemA.pem
|
|
key /etc/certs/SystemA_key.pem
|
|
|
|
port 1194
|
|
|
|
comp-lzo
|
|
|
|
user nobody
|
|
|
|
group nogroup
|
|
|
|
ping 15
|
|
ping-restart 45
|
|
ping-timer-rem
|
|
persist-tun
|
|
persist-key
|
|
|
|
verb 3</programlisting>
|
|
</blockquote>
|
|
|
|
<para>Configuration on the remote clients follows a similar line. We
|
|
define a zone to represent the remote LAN:</para>
|
|
|
|
<blockquote>
|
|
<para><filename>/etc/shorewall/zones</filename> — System B:</para>
|
|
|
|
<programlisting>#ZONE TYPE OPTIONS IN OUT
|
|
# OPTIONS OPTIONS
|
|
home plain</programlisting>
|
|
</blockquote>
|
|
|
|
<para>On system A, the hosts accessible through the tunnel will comprise
|
|
the <emphasis role="bold">home</emphasis> zone.</para>
|
|
|
|
<blockquote>
|
|
<para>In <filename>/etc/shorewall/interfaces</filename> on system
|
|
B:</para>
|
|
|
|
<programlisting>#ZONE INTERFACE BROADCAST OPTIONS
|
|
home tun0</programlisting>
|
|
</blockquote>
|
|
|
|
<para>In <filename>/etc/shorewall/tunnels</filename> on system B, we need
|
|
the following:</para>
|
|
|
|
<blockquote>
|
|
<programlisting>#TYPE ZONE GATEWAY GATEWAY ZONE
|
|
openvpn:1194 net 206.162.148.9</programlisting>
|
|
</blockquote>
|
|
|
|
<para>Again in you are running Shorewall 2.4.3 or later, in
|
|
<filename>/etc/shorewall/tunnels</filename> on system B you might
|
|
prefer:</para>
|
|
|
|
<blockquote>
|
|
<programlisting>#TYPE ZONE GATEWAY GATEWAY ZONE
|
|
openvpnclient:1194 net 206.162.148.9</programlisting>
|
|
</blockquote>
|
|
|
|
<para>We want the remote clien to have access to the local LAN — we do
|
|
that with an entry in <filename>/etc/shorewall/policy</filename>.</para>
|
|
|
|
<blockquote>
|
|
<programlisting>#SOURCE DESTINATION POLICY
|
|
$FW home ACCEPT</programlisting>
|
|
</blockquote>
|
|
|
|
<para>The OpenVPN configuration on the remote clients is along the
|
|
following line:</para>
|
|
|
|
<blockquote>
|
|
<programlisting>dev tun
|
|
remote 206.162.148.9
|
|
up /etc/openvpn/home.up
|
|
|
|
tls-client
|
|
pull
|
|
|
|
ca /etc/certs/cacert.pem
|
|
|
|
cert /etc/certs/SystemB.pem
|
|
key /etc/certs/SystemB_key.pem
|
|
|
|
port 1194
|
|
|
|
user nobody
|
|
group nogroup
|
|
|
|
comp-lzo
|
|
|
|
ping 15
|
|
ping-restart 45
|
|
ping-timer-rem
|
|
persist-tun
|
|
persist-key
|
|
|
|
verb 3</programlisting>
|
|
</blockquote>
|
|
|
|
<para>If you want multiple remote clients to be able to communicate openly
|
|
with each other then you must:</para>
|
|
|
|
<orderedlist>
|
|
<listitem>
|
|
<para>Include the <emphasis role="bold">client-to-client</emphasis>
|
|
directive in the server's OpenVPN configuration; and</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Specify the <emphasis role="bold">routeback</emphasis> option on
|
|
the <filename class="devicefile">tun+</filename> device in <ulink
|
|
url="Documentation.htm#Interfaces">/etc/shorewall/interfaces</ulink>.</para>
|
|
</listitem>
|
|
</orderedlist>
|
|
|
|
<para>If you want to selectively allow communication between the clients,
|
|
then see <ulink
|
|
url="http://www.iut-lannion.fr/ZONZON/memos_index.php?part=Network&section=WRTMemo&subsec=vpnwithshorewall">this
|
|
article</ulink> by Marc Zonzon</para>
|
|
</section>
|
|
</article> |