---
slug: "openssl-vpn-all-member-in-segment"
title: "Setting Up Site-to-Site VPN with OpenVPN"
description: "Notes on installing OpenVPN on an Ubuntu server and setting up a site-to-site VPN."
url: "https://www.ytyng.com/en/blog/openssl-vpn-all-member-in-segment"
publish_date: "2018-06-29T12:58:14Z"
created: "2018-06-29T12:58:14Z"
updated: "2026-02-27T03:58:16.802Z"
categories: []
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/caefd858ad8f4df39af309fd89cfe028.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "en"
---

# Setting Up Site-to-Site VPN with OpenVPN

<h1>Server</h1>
<p>OpenVPN + Bridge</p>
<p>This time, with TCP.</p>
<p></p>
<p>Installing OpenVPN on Ubuntu 16.04 LTS<br /><a href="https://gtrt7.com/blog/linux/ubuntu-openvpn">https://gtrt7.com/blog/linux/ubuntu-openvpn</a></p>
<p>This was extremely helpful. If you follow this article, there should be no issues.</p>
<p>This is how my server.conf turned out:</p>
<pre>port 1194<br /><br />proto tcp-server<br />tcp-nodelay<br /><br />dev tap0<br /><br />ca ca.crt<br />cert server.crt<br />key server.key<br />dh dh2048.pem<br />tls-auth ta.key 0<br /><br />ifconfig-pool-persist /var/log/openvpn/ipp.txt<br /><br />server-bridge 192.168.1.50 255.255.255.0 192.168.1.20 192.168.1.49<br /><br />push "route 192.168.1.0 255.255.255.0"<br /><br />push "redirect-gateway def1 bypass-dhcp"<br /><br />client-to-client<br /><br />keepalive 10 120<br /><br />cipher AES-256-CBC<br />auth SHA512<br /><br />compress lz4-v2<br />push "compress lz4-v2"<br /><br />user nobody<br />group nogroup<br /><br />persist-key<br />persist-tun<br /><br />status /var/log/openvpn/openvpn-status.log<br /><br />log         /var/log/openvpn/openvpn.log<br />log-append  /var/log/openvpn/openvpn.log<br /><br />verb 3<br /><br />;mute 20</pre>
<p></p>
<p>Starting</p>
<pre>sudo systemcctl start <a href="mailto:openvpn@server">openvpn@server</a></pre>
<p></p>
<p>By bridging the network on this server, you can communicate within the same segment.</p>
<p>OpenVPN 2.0 Ethernet Bridging Japanese Translation<br /> <a href="https://www.gsais.kyoto-u.ac.jp/staff/liang/oss/ovpn2_ether_ja.html">https://www.gsais.kyoto-u.ac.jp/staff/liang/oss/ovpn2_ether_ja.html</a></p>
<p>Using this information as a reference, I created a script (as-is)</p>
<pre><span>#!/bin/bash<br /></span><span><br /></span><span>###########################################<br /></span><span># Start an Ethernet bridge on Linux<br /></span><span># Dependency: bridge-utils<br /></span><span>###########################################<br /></span><span><br /></span><span># Bridge interface<br /></span>br=<span>"br0"<br /></span><span><br /></span><span># List of TAP interfaces to bridge<br /></span><span># For example tap="tap0 tap1 tap2"<br /></span>tap=<span>"tap0"<br /></span><span><br /></span><span># Physical Ethernet interface to bridge with the above TAP interfaces<br /></span>eth=<span>"enp2s0"<br /></span>eth_ip=<span>"192.168.1.50"<br /></span>eth_netmask=<span>"255.255.255.0"<br /></span>eth_broadcast=<span>"192.168.1.255"<br /></span>gw=<span>"192.168.1.1"<br /></span><span><br /></span><span><br /></span><span>for </span>t <span>in </span>$tap; <span>do<br /></span><span>    </span>openvpn --mktun --dev $t<br /><span>done<br /></span><span><br /></span>brctl addbr $br<br />brctl addif $br $eth<br /><br /><span>for </span>t <span>in </span>$tap; <span>do<br /></span><span>    </span>brctl addif $br $t<br /><span>done<br /></span><span><br /></span>sleep <span>1<br /></span><span><br /></span><span>for </span>t <span>in </span>$tap; <span>do<br /></span><span>    </span>ifconfig $t 0.0.0.0 promisc up<br /><span>done<br /></span><span><br /></span>sleep <span>1<br /></span><span><br /></span>ifconfig $eth 0.0.0.0 promisc up<br /><br />ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast<br /><br />route add default gw $gw</pre>
<p></p>
<p>Once the server side is done, install the client on a Mac and check its operation.</p>
<p>Tunnelblick | Free open source OpenVPN VPN client server software for Mac OS X and macOS<br /><a href="https://tunnelblick.net/">https://tunnelblick.net/</a></p>
<p></p>
<h1>Client Router</h1>
<p>To allow everyone on the client-side segment to access, we will NAT the client to function as a router.</p>
<p>Client configuration file</p>
<p>Save as /etc/openvpn/client.conf</p>
<pre>client<br /><br />dev tap0<br />proto tcp<br /><br />remote openvpn.example.com 1194<br /><br />resolv-retry infinite<br />nobind<br /><br />persist-key<br />persist-tun<br /><br />ca ca.crt<br />cert my-client.crt<br />key my-client.key<br />tls-auth ta.key 1<br />cipher AES-256-CBC<br />auth SHA512<br /><br />compress lz4-v2<br /><br />verb 3</pre>
<p></p>
<p>Starting</p>
<pre>sudo systemcctl start <a href="mailto:openvpn@server">openvpn@server</a></pre>
<p></p>
<p>Once started, check connectivity on the running machine.</p>
<p></p>
<p>Then, use iptables to configure routing</p>
<p>Creating a router on Ubuntu 16.04 - Qiita<br /><a href="https://qiita.com/nanbuwks/items/fe8145fc8b989be9d427">https://qiita.com/nanbuwks/items/fe8145fc8b989be9d427</a></p>
<p>This article was helpful.</p>
<pre>net.ipv4.ip_forward=1</pre>
<p>After that</p>
<p></p>
<pre>sudo iptables -t nat -F
sudo iptables -F
sudo iptables -L</pre>
<pre>sudo iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE
sudo  iptables -A FORWARD -i tap0 -o enp0s1 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo  iptables -A FORWARD -i enp0s1 -o tap0 -j ACCEPT</pre>
<p></p>
<p>With this, the router to the OpenVPN server is complete.</p>
<p>Then, using static routing at the client site</p>
<p>Route all packets destined for 192.168.1.0/24 to the router machine.</p>
<p>This way, everyone at the site can use the VPN without any additional configuration.</p>
<p></p>
<p>One IP address is assigned per client key,</p>
<p>so you cannot reuse the same client key on multiple devices.</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
