Configure Multiple PPTP VPNs on Tomato Based Router
I have a VPN setup from my router to work so that I don't have to dial one up when I need to get to some server from home. However, I also live in Canada and want to be able to purchase stuff from Google Play that I can't get here, namely music, and be able to get US Netflix, Amazon Prime bonuses, etc. So I needed to set up a second PPTP VPN, since the US endpoint I have access to is a Windows server with RRAS. Unfortunately, the GUI doesn't support two PPTP VPNs, so I had to figure out how to script it.
tl;dr
Also, note that Microsoft PPTP is broken. If you have any choice, don't use PPTP, use something that hasn't been cracked with 100% certainty, and that can't be reliably broken in less than a day. Use IPSec.
The process should be similar for other VPN types, find the config file and copypasta; I haven't tried it though, so I can't promise.
So, I dug around to find how the VPN actually works, and found that the configuration was stored in /etc/vpn/options.vpn. This is run at startup when the option is configured. So I enabled jffs, and set up a startup script to connect my second VPN. The startup script follows:
#!/bin/sh /usr/sbin/pppd file /jffs/options.vpn /usr/sbin/iptables --insert FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables --table nat --insert POSTROUTING --out-interface ppp1 --jump MASQUERADE
The VPN options file:
lock noauth refuse-eap lcp-echo-failure 3 lcp-echo-interval 2 maxfail 0 persist plugin pptp.so pptp_server IPAddress_of_VPN_Server idle 0 ip-up-script /jffs/ip-up ip-down-script /jffs/ip-down ipparam kelokepptpd mtu 1450 mru 1450 user vpn_username password password nomppe-stateful unit 1
The ip-up and ip-down scripts set up firewall rules, routes, etc.
ip-up:
#!/bin/sh # Wait 30 seconds to be sure that VPN connects sleep 30 DEFAULTROUTE=$(/bin/nvram get pptp_client_dfltroute) REMOTESUB=$(/bin/nvram get pptp2_client_srvsub) REMOTENET=$(/bin/nvram get pptp2_client_srvsubmsk) case "$6" in kelokepptpd) if [ $DEFAULTROUTE -eq 1 ]; then REMOTESUB="0.0.0.0" REMOTENET="0.0.0.0" /sbin/route add default dev $1 else # Add routes for Google music /sbin/route add -net 74.125.225.0 netmask 255.255.255.248 ppp1 /sbin/route add 74.125.225.9 ppp1 /sbin/route add 74.125.225.14 ppp1 /sbin/route add -net 74.125.225.20 netmask 255.255.255.252 ppp1 /sbin/route add -net 74.125.225.96 netmask 255.255.255.240 ppp1 /sbin/route add -net 74.125.225.40 netmask 255.255.255.248 ppp1 # Repeat above for Netflix and Amazon fi # Add firewall rules for traffic for each route, Google Play is here, others snipped /usr/sbin/iptables --insert OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.248 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert INPUT --source 74.125.225.0/255.255.255.248 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.248 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 74.125.225.0/255.255.255.248 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables --insert OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.9/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert INPUT --source 74.125.225.9/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 0.0.0.0/0.0.0.0 --des1`tination 74.125.225.9/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 74.125.225.9/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables --insert OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.240 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert INPUT --source 74.125.225.14/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 74.125.225.14/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.14/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables --insert OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.19/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert INPUT --source 74.125.225.19/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.19/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 74.125.225.19/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables --insert OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.110/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert INPUT --source 74.125.225.110/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.110/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 74.125.225.110/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables --insert OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.248 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert INPUT --source 74.125.225.0/255.255.255.248 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.248 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 74.125.225.0/255.255.255.248 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables --insert OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.96/255.255.255.240 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert INPUT --source 74.125.225.96/255.255.255.240 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.96/255.255.255.240 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 74.125.225.96/255.255.255.240 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables --insert OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.224 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert INPUT --source 74.125.225.0/255.255.255.224 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.224 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables --insert FORWARD --source 74.125.225.0/255.255.255.224 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables --insert FORWARD --protocol tcp --tcp-flags SYN if [ "$(/bin/nvram get pptp_client_nat)" = "1" ]; then /usr/sbin/iptables --table nat --append POSTROUTING --out-interface ppp1 --jump MASQUERADE fi /sbin/service dnsmasq restart ;; *) esac exit 0
ip-down just tears everything down:
#!/bin/sh DEFAULTROUTE=$(/bin/nvram get pptp_client_dfltroute) REMOTESUB=$(/bin/nvram get pptp2_client_srvsub) REMOTENET=$(/bin/nvram get pptp2_client_srvsubmsk) case "$6" in kelokepptpd) if [ $DEFAULTROUTE -eq 1 ]; then REMOTESUB="0.0.0.0" REMOTENET="0.0.0.0" /sbin/route del default dev $1 else # Delete routes for Google Play /sbin/route del -net 74.125.225.0 netmask 255.255.255.224 ppp1 /sbin/route del 74.125.225.9 ppp1 /sbin/route del 74.125.225.14 ppp1 /sbin/route del 74.125.225.19 ppp1 /sbin/route del 74.125.225.110 ppp1 fi /usr/sbin/iptables -D OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.248 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D INPUT --source 74.125.225.0/255.255.255.224 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.248 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D FORWARD --source 74.125.225.0/255.255.255.248 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables -D OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.9/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D INPUT --source 74.125.225.9/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.9/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D FORWARD --source 74.125.225.9/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables -D OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.240 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D INPUT --source 74.125.225.14/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.14/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D FORWARD --source 74.125.225.14/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables -D OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.19/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D INPUT --source 74.125.225.19/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.19/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D FORWARD --source 74.125.225.19/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables -D OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.110/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D INPUT --source 74.125.225.110/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.110/255.255.255.255 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D FORWARD --source 74.125.225.110/255.255.255.255 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu /usr/sbin/iptables -D OUTPUT --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.240 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D INPUT --source 74.125.225.0/255.255.255.240 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --source 0.0.0.0/0.0.0.0 --destination 74.125.225.0/255.255.255.240 --jump ACCEPT --out-interface ppp1 /usr/sbin/iptables -D FORWARD --source 74.125.225.0/255.255.255.240 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --in-interface ppp1 /usr/sbin/iptables -D FORWARD --protocol tcp --tcp-flags SYN,RST SYN --jump TCPMSS --clamp-mss-to-pmtu if [ "$(/bin/nvram get pptp_client_nat)" = "1" ]; then /usr/sbin/iptables --table nat -D POSTROUTING --out-interface ppp1 --jump MASQUERADE fi /sbin/service dnsmasq restart ;; *) esac exit 0