— a humbly committed student 2019/01/19 10:31
The purpose of this wiki is to show users how to configure an OpenVPN Server on an OpenWrt 18.01 router that connects to the tor network.
This example contains one OpenWrt router configured as the OpenVPN server and having it also generate the security certs for the client files that will be given to the end user. In this example, the Linksys WRT 3200acm router with OpenWrt 18.01 was used, tested, and validated to work. It has also worked on OpenWrt 17.01.
These procedures are primarily done on the cli on the routers config files with limited configuration via the Luci GUI. Due to me not being able to attach screenshots, I have done the configuration through the routers config files via an ssh session into the router.
create-configs.sh edits the following config files:
It is recommended to be familiar with the following wiki articles to perform this task.
In this example, it is expected that the user has reviewed the recommended guides listed above and was able to successfully create a tor VLAN that connects to the tor network and in addition was able to follow the OpenVPN Basics guide and successfully create an OpenVPN server.
1. /etc/openvpn
Link to the original cert generating that generate scripts from the OpenVPN Basic tutorial for reference:
create-certs.sh
create-certs.sh
#!/bin/sh # Installing packages opkg update opkg install openssl-util openvpn-openssl # Creating Directory Structure VPN_DIR="/etc/openvpn" PKI_DIR="$VPN_DIR/ssl" if [ -d "$PKI_DIR" ] then rm -rf "$PKI_DIR" fi mkdir -p "$PKI_DIR" chmod -R 600 "$PKI_DIR" cd "$PKI_DIR" touch index.txt index echo 1000 > serial cp -f /etc/ssl/openssl.cnf "$PKI_DIR" # Customizing openssl.cnf PKI_CONF="$PKI_DIR/openssl.cnf" sed -i " s:\\\\:/:g /^dir/ s:=.*:= $PKI_DIR: /^new_certs_dir/ s:=.*:= $PKI_DIR: /.*Name/ s:= match:= optional: /organizationName_default/ s:= .*:= WWW Ltd.: /stateOrProvinceName_default/ s:= .*:= London: /countryName_default/ s:= .*:= GB: /default_days/ s:=.*:= 3650: /default_bits/ s:=.*:= 4096: " "$PKI_CONF" cat << "EOF" >> "$PKI_CONF" [ vpnserver ] keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth [ vpnclient ] keyUsage = digitalSignature extendedKeyUsage = clientAuth EOF # Generating Server PSK and CA, Server, & Client Certs # Generating Certifcate Authority Cert & Key openssl req -batch -nodes -new -keyout "ca.key" -out "ca.crt" -x509 -config "$PKI_CONF" -days "3650" # Generating Server Cert & Key openssl req -batch -nodes -new -keyout "vpnserver.key" -out "vpnserver.csr" -subj "/CN=vpnserver" -config "$PKI_CONF" # Signing Server Cert openssl ca -batch -keyfile "ca.key" -cert "ca.crt" -in "vpnserver.csr" -out "vpnserver.crt" -config "$PKI_CONF" -extensions "vpnserver" # Generating Client Cert & Key # PASSPHRASE MUST BE SET (4 chars minimum, 16+ chars recommended) openssl req -batch -new -keyout "vpnclient.key" -out "vpnclient.csr" -subj "/CN=vpnclient" -config "$PKI_CONF" # Signing Client Cert openssl ca -batch -keyfile "ca.key" -cert "ca.crt" -in "vpnclient.csr" -out "vpnclient.crt" -config "$PKI_CONF" -extensions "vpnclient" # Generating OpenVPN TLS PSK openvpn --genkey --secret "tc.pem" # Generating Diffie-Hellman Cert # May take a while to complete (~25m on WRT3200ACM) openssl dhparam -out "dh.pem" 2048 # Correcting Permissions chmod 600 tc.pem dh.pem ca.key vpnserver.key vpnclient.key # Copying Certs & Keys to $VPN_DIR cp tc.pem dh.pem ca.crt vpnserver.* vpnclient.* "$VPN_DIR" # Returning to initial working directory cd - # Done
Customized the bash script to create certs for the tor network. Upon review the reader may notice that the output of the cert files are saved to /etc/openvpn/tor, this was done for organizational purposes. The output filenaes were also change to reflect they are associated with the tor VPN we are creating.
Note: document these items' locations as they will be referred to in section 3. /etc/config/openvpn configuration file and section 7. Create the end-users torvpnclient.ovpn file.:
01.create-certs.tor.sh
Click to see less
#!/bin/sh # Installing packages #opkg update #opkg install openssl-util openvpn-openssl # Creating Directory Structure VPN_DIR="/etc/openvpn/tor" PKI_DIR="$VPN_DIR/ssl" if [ -d "$PKI_DIR" ] then rm -rf "$PKI_DIR" fi mkdir -p "$PKI_DIR" chmod -R 600 "$PKI_DIR" cd "$PKI_DIR" touch index.txt index echo 1000 > serial cp -f /etc/ssl/openssl.cnf "$PKI_DIR" # Customizing openssl.cnf PKI_CONF="$PKI_DIR/openssl.cnf" sed -i " s:\\\\:/:g /^dir/ s:=.*:= $PKI_DIR: /^new_certs_dir/ s:=.*:= $PKI_DIR: /.*Name/ s:= match:= optional: /organizationName_default/ s:= .*:= tor-Infraverse: /stateOrProvinceName_default/ s:= .*:= Yorkshire: /countryName_default/ s:= .*:= UK: /default_days/ s:=.*:= 3650: /default_bits/ s:=.*:= 4096: " "$PKI_CONF" cat << "EOF" >> "$PKI_CONF" [ torvpnserver ] keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth [ torvpnclient ] keyUsage = digitalSignature extendedKeyUsage = clientAuth EOF # Generating Server PSK and CA, Server, & Client Certs # Generating Certifcate Authority Cert & Key openssl req -batch -nodes -new -keyout "ca.key" -out "ca.crt" -x509 -config "$PKI_CONF" -days "3650" # Generating Server Cert & Key openssl req -batch -nodes -new -keyout "torvpnserver.key" -out "torvpnserver.csr" -subj "/CN=torvpnserver" -config "$PKI_CONF" # Signing Server Cert openssl ca -batch -keyfile "ca.key" -cert "ca.crt" -in "torvpnserver.csr" -out "torvpnserver.crt" -config "$PKI_CONF" -extensions "torvpnserver" # Generating Client Cert & Key # PASSPHRASE MUST BE SET (4 chars minimum, 16+ chars recommended) openssl req -batch -new -keyout "torvpnclient.key" -out "torvpnclient.csr" -subj "/CN=torvpnclient" -config "$PKI_CONF" # Signing Client Cert openssl ca -batch -keyfile "ca.key" -cert "ca.crt" -in "torvpnclient.csr" -out "torvpnclient.crt" -config "$PKI_CONF" -extensions "torvpnclient" # Generating OpenVPN TLS PSK openvpn --genkey --secret "tc.pem" # Generating Diffie-Hellman Cert # May take a while to complete (~25m on WRT3200ACM) openssl dhparam -out "dh.pem" 2048 # Correcting Permissions chmod 600 tc.pem dh.pem ca.key torvpnserver.key torvpnclient.key # Copying Certs & Keys to $VPN_DIR cp tc.pem dh.pem ca.crt torvpnserver.* torvpnclient.* "$VPN_DIR" # Returning to initial working directory cd - # Done
2. config interface 'torvpn' in this example there are multiple vlans and tor is configured as being on interface tun2. It may be tun0 if only one network was configured/created via the procedures listed in the OpenVPN Basic tutorial.
/etc/config/network
Click to see less
config interface 'loopback' option ifname 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config globals 'globals' option ula_prefix 'fdfb:7e04:aca7::/48' config interface 'lan' option type 'bridge' option ifname 'eth0.1' option proto 'static' option netmask '255.255.255.0' option ip6assign '60' option ipaddr '192.168.0.1' option gateway '192.168.0.1' option broadcast '192.168.0.255' option dns '8.8.8.8' config interface 'wan' option ifname 'eth1.2' option proto 'dhcp' option hostname 'infraverse.network' config interface 'wan6' option ifname 'eth1.2' option proto 'dhcpv6' config switch option name 'switch0' option reset '1' option enable_vlan '1' config switch_vlan option device 'switch0' option vlan '1' option vid '1' option ports '0t 1 2 3 5t' config switch_vlan option device 'switch0' option vlan '2' option ports '4 6t' option vid '2' config interface 'slave' option type 'bridge' option proto 'static' option ipaddr '172.16.0.1' option netmask '255.255.0.0' option ifname 'eth0.3 radio1' option gateway '172.16.0.1' option broadcast '172.16.255.255' config interface 'tor' option proto 'static' option ipaddr '10.1.1.1' option netmask '255.0.0.0' option type 'bridge' option ifname 'eth0.4' config switch_vlan option device 'switch0' option vlan '3' option vid '3' option ports '0t 5t' config switch_vlan option device 'switch0' option vlan '4' option vid '4' option ports '0t 5t' config interface 'lanvpn' option proto 'none' option ifname 'tun0' config interface 'slavevpn' option proto 'none' option ifname 'tun1' config interface 'torvpn' option proto 'none' option ifname 'tun2'
3. This configuration has multiple VPNs configured. Observe the torvpn configurations.
Important to take note of the following items: * port being used as this will be used in section 4. firewall * the location of the certs being used generated in section 1. when running the 01.create-certs.tor.sh bash script * the list network being used which is the local tor network/vlan interface
/etc/config/openvpn
Click to see less
config openvpn 'custom_config' option config '/etc/openvpn/my-vpn.conf' config openvpn 'sample_server' option port '1194' option proto 'udp' option dev 'tun' option ca '/etc/openvpn/ca.crt' option cert '/etc/openvpn/server.crt' option key '/etc/openvpn/server.key' option dh '/etc/openvpn/dh1024.pem' option server '10.8.0.0 255.255.255.0' option ifconfig_pool_persist '/tmp/ipp.txt' option keepalive '10 120' option compress 'lzo' option persist_key '1' option persist_tun '1' option user 'nobody' option status '/tmp/openvpn-status.log' option verb '3' config openvpn 'sample_client' option client '1' option dev 'tun' option proto 'udp' list remote 'my_server_1 1194' option resolv_retry 'infinite' option nobind '1' option persist_key '1' option persist_tun '1' option user 'nobody' option ca '/etc/openvpn/ca.crt' option cert '/etc/openvpn/client.crt' option key '/etc/openvpn/client.key' option compress 'lzo' option verb '3' config openvpn 'lanvpn' option enabled '1' option verb '11' option log '/var/log/openvpn/openvpn.log' option log_append '/var/log/openvpn/openvpn.log' option dev 'tun0' option port '1999' option proto 'udp' option server '192.168.200.0 255.255.255.0' option client_to_client '1' option compress 'lzo' option keepalive '10 120' option persist_tun '1' option persist_key '1' option dh '/etc/openvpn/lan/dh.pem' option tls_crypt '/etc/openvpn/lan/tc.pem' option ca '/etc/openvpn/lan/ca.crt' option cert '/etc/openvpn/lan/lanvpnserver.crt' option key '/etc/openvpn/lan/lanvpnserver.key' list push 'redirect-gateway def1' list push 'route 192.168.0.0 255.255.255.0' list push 'dhcp-option DNS 192.168.0.1' list push 'compress lzo' list push 'persist-tun' list push 'persist-key' list push 'dhcp-option DOMAIN lan' config openvpn 'slavevpn' option enabled '1' option verb '3' option port '1111' option proto 'udp' option server '172.16.200.0 255.255.255.0' option client_to_client '1' option compress 'lzo' option keepalive '10 120' option persist_tun '1' option persist_key '1' option dh '/etc/openvpn/slave/dh.pem' option tls_crypt '/etc/openvpn/slave/tc.pem' option ca '/etc/openvpn/slave/ca.crt' option cert '/etc/openvpn/slave/slavevpnserver.crt' option key '/etc/openvpn/slave/slavevpnserver.key' list push 'redirect-gateway def1' list push 'route 172.16.0.0 255.255.0.0' list push 'dhcp-option DNS 192.168.0.1' list push 'compress lzo' list push 'persist-tun' list push 'persist-key' list push 'dhcp-option DOMAIN lan' option dev 'tun1' config openvpn 'torvpn' option enabled '1' option verb '3' option port '666' option proto 'udp' option server '10.1.200.0 255.255.255.0' option client_to_client '1' option compress 'lzo' option keepalive '10 120' option persist_tun '1' option persist_key '1' option dh '/etc/openvpn/tor/dh.pem' option tls_crypt '/etc/openvpn/tor/tc.pem' option ca '/etc/openvpn/tor/ca.crt' option cert '/etc/openvpn/tor/torvpnserver.crt' option key '/etc/openvpn/tor/torvpnserver.key' list push 'redirect-gateway def1' list push 'route 10.1.1.0 255.0.0.0' list push 'dhcp-option DNS 10.1.1.1' list push 'compress lzo' list push 'persist-tun' list push 'persist-key' list push 'dhcp-option DOMAIN lan' option dev 'tun2'
4. Configurations for the firewall to allow torvpn ports. They are very similar to the firewall configurations discussed in the Tor tutorial
/etc/config/firewall
Click to see less
config defaults option syn_flood '1' option input 'ACCEPT' option output 'ACCEPT' option forward 'REJECT' config zone option name 'lan' list network 'lan' option input 'ACCEPT' option output 'ACCEPT' option forward 'ACCEPT' config zone option name 'wan' list network 'wan' list network 'wan6' option input 'REJECT' option output 'ACCEPT' option forward 'REJECT' option masq '1' option mtu_fix '1' config rule option name 'Allow-DHCP-Renew' option src 'wan' option proto 'udp' option dest_port '68' option target 'ACCEPT' option family 'ipv4' config rule option name 'Allow-Ping' option src 'wan' option proto 'icmp' option icmp_type 'echo-request' option family 'ipv4' option target 'ACCEPT' config rule option name 'Allow-IGMP' option src 'wan' option proto 'igmp' option family 'ipv4' option target 'ACCEPT' config rule option name 'Allow-DHCPv6' option src 'wan' option proto 'udp' option src_ip 'fc00::/6' option dest_ip 'fc00::/6' option dest_port '546' option family 'ipv6' option target 'ACCEPT' config rule option name 'Allow-MLD' option src 'wan' option proto 'icmp' option src_ip 'fe80::/10' list icmp_type '130/0' list icmp_type '131/0' list icmp_type '132/0' list icmp_type '143/0' option family 'ipv6' option target 'ACCEPT' config rule option name 'Allow-ICMPv6-Input' option src 'wan' option proto 'icmp' list icmp_type 'echo-request' list icmp_type 'echo-reply' list icmp_type 'destination-unreachable' list icmp_type 'packet-too-big' list icmp_type 'time-exceeded' list icmp_type 'bad-header' list icmp_type 'unknown-header-type' list icmp_type 'router-solicitation' list icmp_type 'neighbour-solicitation' list icmp_type 'router-advertisement' list icmp_type 'neighbour-advertisement' option limit '1000/sec' option family 'ipv6' option target 'ACCEPT' config rule option name 'Allow-ICMPv6-Forward' option src 'wan' option dest '*' option proto 'icmp' list icmp_type 'echo-request' list icmp_type 'echo-reply' list icmp_type 'destination-unreachable' list icmp_type 'packet-too-big' list icmp_type 'time-exceeded' list icmp_type 'bad-header' list icmp_type 'unknown-header-type' option limit '1000/sec' option family 'ipv6' option target 'ACCEPT' config rule option name 'Allow-IPSec-ESP' option src 'wan' option dest 'lan' option proto 'esp' option target 'ACCEPT' config rule option name 'Allow-ISAKMP' option src 'wan' option dest 'lan' option dest_port '500' option proto 'udp' option target 'ACCEPT' config include option path '/etc/firewall.user' config include 'miniupnpd' option type 'script' option path '/usr/share/miniupnpd/firewall.include' option family 'any' option reload '1' config zone option name 'slave' option forward 'REJECT' option output 'ACCEPT' option network 'slave' option input 'REJECT' config forwarding option dest 'wan' option src 'slave' config rule option target 'ACCEPT' option proto 'tcp udp' option dest_port '53' option name 'Slave dns' option src 'slave' config rule option target 'ACCEPT' option proto 'udp' option dest_port '67-68' option name 'slave dhcp' option src 'slave' config zone option name 'tor' option forward 'REJECT' option output 'ACCEPT' option network 'tor' option input 'ACCEPT' option syn_flood '1' option conntrack '1' config rule option src 'tor' option proto 'udp' option dest_port '67' option target 'ACCEPT' option name 'tor DHCP' config rule option src 'tor' option proto 'tcp' option dest_port '9040' option target 'ACCEPT' option name 'tor transport' config rule option src 'tor' option proto 'udp' option dest_port '9053' option target 'ACCEPT' option name 'tor dns' config redirect option name 'Redirect-Tor-Traffic' option src 'tor' option src_dip '!10.1.1.1' option dest_port '9040' option proto 'tcp' option target 'DNAT' config redirect option name 'Redirect-Tor-DNS' option src 'tor' option src_dport '53' option dest_port '9053' option proto 'udp' option target 'DNAT' config rule option name 'Allow-LAN-OpenVPN' option src '*' option dest_port '1999' option proto 'tcp udp' option target 'ACCEPT' config zone option name 'lanvpn' option network 'lanvpn' option masq '1' option output 'ACCEPT' option input 'ACCEPT' option forward 'ACCEPT' option mtu_fix '1' config rule option name 'Allow-SLAVE-OpenVPN' option src '*' option dest_port '1111' option proto 'tcp udp' option target 'ACCEPT' config zone option name 'slavevpn' option network 'slavevpn' option masq '1' option input 'ACCEPT' option output 'ACCEPT' option forward 'ACCEPT' option mtu_fix '1' config rule option name 'Allow-tor-OpenVPN' option src '*' option dest_port '666' option proto 'tcp udp' option target 'ACCEPT' config zone option name 'torvpn' option network 'torvpn' option masq '1' option input 'ACCEPT' option output 'ACCEPT' option forward 'ACCEPT' option mtu_fix '1' config forwarding option dest 'wan' option src 'slavevpn' config forwarding option dest 'wan' option src 'torvpn' config forwarding option dest 'wan' option src 'lanvpn' config forwarding option dest 'slave' option src 'slavevpn' config forwarding option dest 'tor' option src 'torvpn' config forwarding option dest 'lan' option src 'lanvpn' config forwarding option dest 'lanvpn' option src 'wan' config forwarding option dest 'wan' option src 'lan' config forwarding option dest 'wan' option src 'tor' config forwarding option dest 'tor' option src 'wan' config rule option target 'ACCEPT' option dest_port '67' option name 'torvpn-DHCP' option src 'torvpn' option proto 'udp' config rule option target 'ACCEPT' option proto 'tcp' option dest_port '9040' option name 'torvpn-transport' option src 'torvpn' config rule option enabled '1' option target 'ACCEPT' option proto 'udp' option dest_port '9053' option name 'torvpn-DNS' option src 'torvpn' config redirect option target 'DNAT' option dest_port '9040' option name 'Redirect-torvpn-Traffic' option proto 'tcp' option src 'torvpn' option src_dip '!10.1.200.1' option dest 'lan' config redirect option target 'DNAT' option proto 'udp' option name 'Redirect-Tor-DNS' option src 'torvpn' option src_dport '53' option dest_port '9053'
5. Additional configurations for the firewall via the /etc/firewall.user file to allow torvpn and tor network port forwarders. They are very similar to the firewall configurations discussed in the Tor tutorial
/etc/firewall.user
Click to see less
# This file is interpreted as shell script. # Put your custom iptables rules here, they will # be executed with each firewall (re-)start. # Internal uci firewall chains are flushed and recreated on reload, so # put custom rules into the root chains e.g. INPUT or FORWARD or into the # special user chains, e.g. input_wan_rule or postrouting_lan_rule. iptables -A PREROUTING -t nat -p udp --dport 53 -i br-lan -j DNAT --to 192.168.0.1:53 iptables -t nat -A PREROUTING -i wlan1-2 -p udp --dport 53 -j REDIRECT --to-ports 9053 iptables -t nat -A PREROUTING -i wlan1-2 -p tcp --syn -j REDIRECT --to-ports 9040 iptables -t nat -A PREROUTING -i eth0.4 -p udp --dport 53 -j REDIRECT --to-ports 9053 iptables -t nat -A PREROUTING -i eth0.4 -p tcp --syn -j REDIRECT --to-ports 9040 iptables -t nat -A PREROUTING -i tun2 -p udp --dport 53 -j REDIRECT --to-ports 9053 iptables -t nat -A PREROUTING -i tun2 -p tcp --syn -j REDIRECT --to-ports 9040
6. Configuration of the /etc/tor file. The torvpn network was added at the end of the file and have been commented for your reference.
/etc/tor
Click to see less
## Configuration file for a typical Tor user ## Last updated 22 December 2017 for Tor 0.3.2.8-rc. ## (may or may not work for much older or much newer versions of Tor.) ## ## Lines that begin with "## " try to explain what's going on. Lines ## that begin with just "#" are disabled commands: you can enable them ## by removing the "#" symbol. ## ## See 'man tor', or https://www.torproject.org/docs/tor-manual.html, ## for more options you can use in this file. ## ## Tor will look for this file in various places based on your platform: ## https://www.torproject.org/docs/faq#torrc ## Tor opens a SOCKS proxy on port 9050 by default -- even if you don't ## configure one below. Set "SOCKSPort 0" if you plan to run Tor only ## as a relay, and not make any local application connections yourself. #SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections. #SOCKSPort 192.168.0.1:9100 # Bind to this address:port too. ## Entry policies to allow/deny SOCKS requests based on IP address. ## First entry that matches wins. If no SOCKSPolicy is set, we accept ## all (and only) requests that reach a SOCKSPort. Untrusted users who ## can access your SOCKSPort may be able to learn about the connections ## you make. #SOCKSPolicy accept 192.168.0.0/16 #SOCKSPolicy accept6 FC00::/7 #SOCKSPolicy reject * ## Logs go to stdout at level "notice" unless redirected by something ## else, like one of the below lines. You can have as many Log lines as ## you want. ## ## We advise using "notice" in most cases, since anything more verbose ## may provide sensitive information to an attacker who obtains the logs. ## ## Send all messages of level 'notice' or higher to /var/log/tor/notices.log Log notice file /var/log/tor/notices.log ## Send every possible message to /var/log/tor/debug.log #Log debug file /var/log/tor/debug.log ## Use the system log instead of Tor's logfiles Log notice syslog ## To send all messages to stderr: #Log debug stderr ## Uncomment this to start the process in the background... or use ## --runasdaemon 1 on the command line. This is ignored on Windows; ## see the FAQ entry if you want Tor to run as an NT service. RunAsDaemon 1 ## The directory for keeping all the keys/etc. By default, we store ## things in $HOME/.tor on Unix, and in Application Data\tor on Windows. DataDirectory /var/lib/tor ## The port on which Tor will listen for local connections from Tor ## controller applications, as documented in control-spec.txt. #ControlPort 9051 ## If you enable the controlport, be sure to enable one of these ## authentication methods, to prevent attackers from accessing it. #HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C #CookieAuthentication 1 ############### This section is just for location-hidden services ### ## Once you have configured a hidden service, you can look at the ## contents of the file ".../hidden_service/hostname" for the address ## to tell people. ## ## HiddenServicePort x y:z says to redirect requests on port x to the ## address y:z. #HiddenServiceDir /var/lib/tor/hidden_service/ #HiddenServicePort 80 127.0.0.1:80 #HiddenServiceDir /var/lib/tor/other_hidden_service/ #HiddenServicePort 80 127.0.0.1:80 #HiddenServicePort 22 127.0.0.1:22 ################ This section is just for relays ##################### # ## See https://www.torproject.org/docs/tor-doc-relay for details. ## Required: what port to advertise for incoming Tor connections. #ORPort 9001 ## If you want to listen on a port other than the one advertised in ## ORPort (e.g. to advertise 443 but bind to 9090), you can do it as ## follows. You'll need to do ipchains or other port forwarding ## yourself to make this work. #ORPort 443 NoListen #ORPort 127.0.0.1:9090 NoAdvertise ## The IP address or full DNS name for incoming connections to your ## relay. Leave commented out and Tor will guess. #Address noname.example.com ## If you have multiple network interfaces, you can specify one for ## outgoing traffic to use. ## OutboundBindAddressExit will be used for all exit traffic, while ## OutboundBindAddressOR will be used for all OR and Dir connections ## (DNS connections ignore OutboundBindAddress). ## If you do not wish to differentiate, use OutboundBindAddress to ## specify the same address for both in a single line. #OutboundBindAddressExit 10.0.0.4 #OutboundBindAddressOR 10.0.0.5 ## A handle for your relay, so people don't have to refer to it by key. ## Nicknames must be between 1 and 19 characters inclusive, and must ## contain only the characters [a-zA-Z0-9]. #Nickname ididnteditheconfig ## Define these to limit how much relayed traffic you will allow. Your ## own traffic is still unthrottled. Note that RelayBandwidthRate must ## be at least 75 kilobytes per second. ## Note that units for these config options are bytes (per second), not ## bits (per second), and that prefixes are binary prefixes, i.e. 2^10, ## 2^20, etc. #RelayBandwidthRate 100 KBytes # Throttle traffic to 100KB/s (800Kbps) #RelayBandwidthBurst 200 KBytes # But allow bursts up to 200KB (1600Kb) ## Use these to restrict the maximum traffic per day, week, or month. ## Note that this threshold applies separately to sent and received bytes, ## not to their sum: setting "40 GB" may allow up to 80 GB total before ## hibernating. ## ## Set a maximum of 40 gigabytes each way per period. #AccountingMax 40 GBytes ## Each period starts daily at midnight (AccountingMax is per day) #AccountingStart day 00:00 ## Each period starts on the 3rd of the month at 15:00 (AccountingMax ## is per month) #AccountingStart month 3 15:00 ## Administrative contact information for this relay or bridge. This line ## can be used to contact you if your relay or bridge is misconfigured or ## something else goes wrong. Note that we archive and publish all ## descriptors containing these lines and that Google indexes them, so ## spammers might also collect them. You may want to obscure the fact that ## it's an email address and/or generate a new address for this purpose. ## ## If you are running multiple relays, you MUST set this option. ## #ContactInfo Random Person <nobody AT example dot com> ## You might also include your PGP or GPG fingerprint if you have one: #ContactInfo 0xFFFFFFFF Random Person <nobody AT example dot com> ## Uncomment this to mirror directory information for others. Please do ## if you have enough bandwidth. #DirPort 9030 # what port to advertise for directory connections ## If you want to listen on a port other than the one advertised in ## DirPort (e.g. to advertise 80 but bind to 9091), you can do it as ## follows. below too. You'll need to do ipchains or other port ## forwarding yourself to make this work. #DirPort 80 NoListen #DirPort 127.0.0.1:9091 NoAdvertise ## Uncomment to return an arbitrary blob of html on your DirPort. Now you ## can explain what Tor is if anybody wonders why your IP address is ## contacting them. See contrib/tor-exit-notice.html in Tor's source ## distribution for a sample. #DirPortFrontPage /etc/tor/tor-exit-notice.html ## Uncomment this if you run more than one Tor relay, and add the identity ## key fingerprint of each Tor relay you control, even if they're on ## different networks. You declare it here so Tor clients can avoid ## using more than one of your relays in a single circuit. See ## https://www.torproject.org/docs/faq#MultipleRelays ## However, you should never include a bridge's fingerprint here, as it would ## break its concealability and potentially reveal its IP/TCP address. ## ## If you are running multiple relays, you MUST set this option. ## #MyFamily $keyid,$keyid,... ## Uncomment this if you do *not* want your relay to allow any exit traffic. ## (Relays allow exit traffic by default.) #ExitRelay 0 ## Uncomment this if you want your relay to allow IPv6 exit traffic. ## (Relays only allow IPv4 exit traffic by default.) #IPv6Exit 1 ## A comma-separated list of exit policies. They're considered first ## to last, and the first match wins. ## ## If you want to allow the same ports on IPv4 and IPv6, write your rules ## using accept/reject *. If you want to allow different ports on IPv4 and ## IPv6, write your IPv6 rules using accept6/reject6 *6, and your IPv4 rules ## using accept/reject *4. ## ## If you want to _replace_ the default exit policy, end this with either a ## reject *:* or an accept *:*. Otherwise, you're _augmenting_ (prepending to) ## the default exit policy. Leave commented to just use the default, which is ## described in the man page or at ## https://www.torproject.org/documentation.html ## ## Look at https://www.torproject.org/faq-abuse.html#TypicalAbuses ## for issues you might encounter if you use the default exit policy. ## ## If certain IPs and ports are blocked externally, e.g. by your firewall, ## you should update your exit policy to reflect this -- otherwise Tor ## users will be told that those destinations are down. ## ## For security, by default Tor rejects connections to private (local) ## networks, including to the configured primary public IPv4 and IPv6 addresses, ## and any public IPv4 and IPv6 addresses on any interface on the relay. ## See the man page entry for ExitPolicyRejectPrivate if you want to allow ## "exit enclaving". ## #ExitPolicy accept *:6660-6667,reject *:* # allow irc ports on IPv4 and IPv6 but no more #ExitPolicy accept *:119 # accept nntp ports on IPv4 and IPv6 as well as default exit policy #ExitPolicy accept *4:119 # accept nntp ports on IPv4 only as well as default exit policy #ExitPolicy accept6 *6:119 # accept nntp ports on IPv6 only as well as default exit policy #ExitPolicy reject *:* # no exits allowed ## Bridge relays (or "bridges") are Tor relays that aren't listed in the ## main directory. Since there is no complete public list of them, even an ## ISP that filters connections to all the known Tor relays probably ## won't be able to block all the bridges. Also, websites won't treat you ## differently because they won't know you're running Tor. If you can ## be a real relay, please do; but if not, be a bridge! #BridgeRelay 1 ## By default, Tor will advertise your bridge to users through various ## mechanisms like https://bridges.torproject.org/. If you want to run ## a private bridge, for example because you'll give out your bridge ## address manually to your friends, uncomment this line: #PublishServerDescriptor 0 ## Configuration options can be imported from files or folders using the %include ## option with the value being a path. If the path is a file, the options from the ## file will be parsed as if they were written where the %include option is. If ## the path is a folder, all files on that folder will be parsed following lexical ## order. Files starting with a dot are ignored. Files on subfolders are ignored. ## The %include option can be used recursively. #%include /etc/torrc.d/ #%include /etc/torrc.custom User tor PidFile /var/run/tor.pid Log notice file /var/log/tor/notices.log Log debug file /var/log/tor/debug.log GeoIPFile /usr/share/tor/geoip GeoIPv6File /usr/share/tor/geoip6 MaxCircuitDirtiness 60 ExitNodes {us} StrictNodes 1 VirtualAddrNetworkIPv4 10.192.0.0/10 AutomapHostsSuffixes .onion,.exit AutomapHostsOnResolve 1 TransPort 10.1.1.1:9040 DNSPort 10.1.1.1:9053 SocksPort 10.1.1.1:9050 TransPort 10.1.200.1:9040 #openvpn tor network interface added DNSPort 10.1.200.1:9053 #openvpn tor network interface added SocksPort 10.1.200.1:9050 #openvpn tor network interface added #SocksBindAddress 192.168.2.1:9050 #SocksBindAddress 192.168.1.1:9050
7. Create the end-users torvpnclient.ovpn file.
Note: notice that the reference files in the script were the same file locations of where the script in scetion 1. output the certs to
03.create-ovpn.tor.sh
03.create-ovpn.tor.sh
#!/bin/sh # Obtaining server address from WAN-interface IP source /lib/functions/network.sh network_find_wan WAN_IF network_get_ipaddr SERVER_ADDR "$WAN_IF" # Obtaining server address from DDNS client service SERVER_FQDN="$(uci -q get $(uci -q show ddns \ | sed -n -e "s/^\(.*\)\.enabled='1'$/\1/p" \ | head -n 1).lookup_host)" if [ -n "$SERVER_FQDN" ] then SERVER_ADDR="$SERVER_FQDN" fi # Setting configuration parameters SERVER_PORT="$(uci get openvpn.torvpn.port)" SERVER_PROTO="$(uci get openvpn.torvpn.proto)" CLIENT_DEV="$(uci get openvpn.torvpn.dev | sed -e "s/\d*$//")" CLIENT_COMPR="$(uci get openvpn.torvpn.compress)" VPN_DIR="/etc/openvpn/tor" TC_KEY="$(sed -e "/^#/d;/^\w/N;s/\n//" "$VPN_DIR/tc.pem")" CA_CERT="$(openssl x509 -in "$VPN_DIR/ca.crt")" # Generating .ovpn-files grep -l -e "TLS Web Client Authentication" "$VPN_DIR"/*.crt \ | sed -e "s/^.*\///;s/\.[^.]*$//" \ | while read CLIENT_ID do CLIENT_CERT="$(openssl x509 -in "$VPN_DIR/$CLIENT_ID.crt")" CLIENT_KEY="$(cat "$VPN_DIR/$CLIENT_ID.key")" CLIENT_CONF="$VPN_DIR/$CLIENT_ID.ovpn" cat << EOF > "$CLIENT_CONF" verb 3 nobind dev $CLIENT_DEV client remote $SERVER_ADDR $SERVER_PORT $SERVER_PROTO fast-io compress $CLIENT_COMPR auth-nocache remote-cert-tls server <tls-crypt> $TC_KEY </tls-crypt> <ca> $CA_CERT </ca> <cert> $CLIENT_CERT </cert> <key> $CLIENT_KEY </key> EOF done # Setting permissions chmod 600 "$VPN_DIR"/*.ovpn # Showing generated .ovpn-files head -v -n -0 "$VPN_DIR"/*.ovpn # Done
8. Reboot the router:
reboot now
9. Verify if the tor
process is running Note: if tor is not displayed simply run tor by typing tor in the cli
ps -ef | grep -i tor
Output should resemble this:
tor 4726 1 0 Jun25 ? 00:01:23 /usr/sbin/tor --runasdaemon 0 root 13093 21825 0 02:33 pts/0 00:00:00 grep -i tor
10. Similarly you can tail the log to see the following output
tail -f /tmp/log/tor
Notice Tor has successfully opened a circuit. Looks like client functionality is working.
Jan 26 10:58:47.317 [notice] Tor 0.3.2.10 (git-31cc63deb69db819) running on Linux with Libevent 2.0.22-stable, OpenSSL 1.0.2o, Zlib 1.2.11, Liblzma N/A, and Libzstd N/A. Jan 26 10:58:47.318 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://www.torproject.org/download/download#warning Jan 26 10:58:47.318 [notice] Read configuration file "/etc/tor/torrc". Jan 26 10:58:47.327 [notice] You configured a non-loopback address '10.1.1.1:9053' for DNSPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:58:47.327 [notice] You configured a non-loopback address '10.1.200.1:9053' for DNSPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:58:47.327 [notice] You configured a non-loopback address '10.1.1.1:9040' for TransPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:58:47.327 [notice] You configured a non-loopback address '10.1.200.1:9040' for TransPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:58:47.330 [notice] Scheduler type KIST has been enabled. Jan 26 10:58:47.330 [notice] You configured a non-loopback address '10.1.1.1:9050' for SocksPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:58:47.330 [notice] You configured a non-loopback address '10.1.200.1:9050' for SocksPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:58:47.331 [notice] You configured a non-loopback address '10.1.1.1:9053' for DNSPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:58:47.331 [notice] You configured a non-loopback address '10.1.200.1:9053' for DNSPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:58:47.331 [notice] You configured a non-loopback address '10.1.1.1:9040' for TransPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:58:47.331 [notice] You configured a non-loopback address '10.1.200.1:9040' for TransPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:58:47.331 [notice] Opening Socks listener on 10.1.1.1:9050 Jan 26 10:58:47.331 [notice] Opening Socks listener on 10.1.200.1:9050 Jan 26 10:58:47.332 [notice] Opening DNS listener on 10.1.1.1:9053 Jan 26 10:58:47.332 [notice] Opening DNS listener on 10.1.200.1:9053 Jan 26 10:58:47.332 [notice] Opening Transparent pf/netfilter listener on 10.1.1.1:9040 Jan 26 10:58:47.332 [notice] Opening Transparent pf/netfilter listener on 10.1.200.1:9040
11. Export the torvpnclient.ovpn file via winscp or scp command via ssh session and test it on the clients machine. How to use winscp and/or the scp command in a ssh session is beyond the scope of this tutorial.
12. Try connecting to the newly created torvpn and test its connectivity with check tor https://cdn.instructables.com/FHN/5956/IK2X86XF/FHN5956IK2X86XF.LARGE.jpg
13. If you ever need to start and stop the tor service:
/etc/init.d/tor start /etc/init.d/tor stop /etc/init.d/tor restart
14. You can also find the process number from the ps -ef | grep -i tor
and kill ###
its pid number.
Jan 26 10:41:07.564 [notice] Tor 0.3.2.10 (git-31cc63deb69db819) running on Linux with Libevent 2.0.22-stable, OpenSSL 1.0.2o, Zlib 1.2.11, Liblzma N/A, and Libzstd N/A. Jan 26 10:41:07.565 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://www.torproject.org/download/download#warning Jan 26 10:41:07.565 [notice] Read configuration file "/etc/tor/torrc". Jan 26 10:41:07.574 [notice] You configured a non-loopback address '10.1.1.1:9053' for DNSPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:41:07.574 [notice] You configured a non-loopback address '10.1.200.1:9053' for DNSPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:41:07.574 [notice] You configured a non-loopback address '10.1.1.1:9040' for TransPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:41:07.574 [notice] You configured a non-loopback address '10.1.200.1:9040' for TransPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:41:07.577 [notice] Scheduler type KIST has been enabled. Jan 26 10:41:07.577 [notice] You configured a non-loopback address '10.1.1.1:9050' for SocksPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:41:07.577 [notice] You configured a non-loopback address '10.1.200.1:9050' for SocksPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:41:07.578 [notice] You configured a non-loopback address '10.1.1.1:9053' for DNSPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:41:07.578 [notice] You configured a non-loopback address '10.1.200.1:9053' for DNSPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:41:07.578 [notice] You configured a non-loopback address '10.1.1.1:9040' for TransPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:41:07.578 [notice] You configured a non-loopback address '10.1.200.1:9040' for TransPort. This allows everybody on your local network to use your machine as a proxy. Make sure this is what you wanted. Jan 26 10:41:07.578 [notice] Opening Socks listener on 10.1.1.1:9050 Jan 26 10:41:07.579 [notice] Opening Socks listener on 10.1.200.1:9050 Jan 26 10:41:07.579 [warn] Could not bind to 10.1.200.1:9050: Address not available Jan 26 10:41:07.579 [notice] Opening DNS listener on 10.1.1.1:9053 Jan 26 10:41:07.579 [notice] Opening DNS listener on 10.1.200.1:9053 Jan 26 10:41:07.579 [warn] Could not bind to 10.1.200.1:9053: Address not available Jan 26 10:41:07.579 [notice] Opening Transparent pf/netfilter listener on 10.1.1.1:9040 Jan 26 10:41:07.580 [notice] Opening Transparent pf/netfilter listener on 10.1.200.1:9040 Jan 26 10:41:07.580 [warn] Could not bind to 10.1.200.1:9040: Address not available Jan 26 10:41:07.580 [notice] Closing partially-constructed Socks listener on 10.1.1.1:9050 Jan 26 10:41:07.580 [notice] Closing partially-constructed DNS listener on 10.1.1.1:9053 Jan 26 10:41:07.580 [notice] Closing partially-constructed Transparent pf/netfilter listener on 10.1.1.1:9040 Jan 26 10:41:07.580 [warn] Failed to parse/validate config: Failed to bind one of the listener ports. Jan 26 10:41:07.581 [err] Reading config failed--see warnings above.
route
command
route
Click to see less
root@infraverse:/etc/config# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default cpe-66-75-96-1. 0.0.0.0 UG 0 0 0 eth1.2 10.0.0.0 * 255.0.0.0 U 0 0 0 br-tor 66.75.96.0 * 255.255.248.0 U 0 0 0 eth1.2 172.16.0.0 * 255.255.0.0 U 0 0 0 br-slave 192.168.0.0 * 255.255.255.0 U 0 0 0 br-lan
/etc/init.d/openvpn restart
command.
route
command again.
route
Click to see less
root@infraverse:/etc/config# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default cpe-66-75-96-1. 0.0.0.0 UG 0 0 0 eth1.2 10.0.0.0 * 255.0.0.0 U 0 0 0 br-tor 10.1.200.0 10.1.200.2 255.255.255.0 UG 0 0 0 tun2 10.1.200.2 * 255.255.255.255 UH 0 0 0 tun2 66.75.96.0 * 255.255.248.0 U 0 0 0 eth1.2 172.16.0.0 * 255.255.0.0 U 0 0 0 br-slave 172.16.200.0 172.16.200.2 255.255.255.0 UG 0 0 0 tun1 172.16.200.2 * 255.255.255.255 UH 0 0 0 tun1 192.168.0.0 * 255.255.255.0 U 0 0 0 br-lan 192.168.200.0 192.168.200.2 255.255.255.0 UG 0 0 0 tun0 192.168.200.2 * 255.255.255.255 UH 0 0 0 tun0