Redirect 443 packets to VPN channel

  1. #!/sbin/runscript
  2. # Distributed under the terms of the GNU General Public License v2
  3. IFACE=$(netstat -rn | grep UG | awk ‘NR==1{print($8)}’)
  4. ITUN=”tun0″
  5. TBL=”VPN1″
  6. depend() {
  7.         use dnsmasq
  8. }
  9. start() {
  10.         # starting openVPN
  11.         /etc/init.d/openvpn.vpn1 start
  12.         # wait until VPN is fully operationnal [ route is built ]
  13.         while [ -z “$(route -n | awk ‘/'”$ITUN”‘/&&/255/ {print($1)}’)” ]; do sleep .25; done
  14.         # getting our VPN IP, range & mask
  15.         ITUNADDR=$(ifconfig $ITUN | awk ‘/dr:/ { gsub(/.*:/,””,$2); print($2); }’)
  16.         TUNRANGE=$(route -n | awk ‘/tun0/ && /255/ {print($1)}’)
  17.         TUNMASK=$(route -n | awk ‘/tun0/ && /255/ {print($3)}’)
  18.         # adding $TBL table if necessary
  19.         if [ ! -n “$(grep “200 $TBL” /etc/iproute2/rt_tables)” ]; then
  20.                 echo “200 $TBL” >> /etc/iproute2/rt_tables
  21.         fi
  22.         # re-add standard nameserver
  23.         echo “nameserver 127.0.0.1” > /etc/resolv.conf
  24.         # making route to VPN
  25.         ip route add default dev $ITUN table $TBL
  26.         # marked packets follows VPN route
  27.         ip rule add fwmark 0x45 table $TBL
  28.         # accept packets from VPN
  29.         iptables -A INPUT -i $ITUN -j ACCEPT
  30.         # some services are marked to follow the route
  31.         iptables -t mangle -A OUTPUT -p udp –dport 53 -j MARK –set-mark 0x45
  32.         iptables -t mangle -A OUTPUT -p tcp –dport 443 -j MARK –set-mark 0x45
  33.         iptables -t mangle -A OUTPUT -p tcp –dport 8080 -j MARK –set-mark 0x45
  34.         # binding tun’s ip to tun’s interface
  35.         iptables -t nat -A POSTROUTING -o $ITUN -j SNAT –to $ITUNADDR
  36.         # force output packets (from VPN) to go out through VPN too
  37.         iptables -t mangle -A OUTPUT -s $ITUNADDR -j MARK –set-mark 0x45
  38.         # disable ALL source-address verification filtering
  39.         for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 0 > $i; done
  40. }
  41. stop() {
  42.         # getting our VPN IP, range & mask
  43.         #ITUNADDR=$(ifconfig $ITUN | awk ‘NR==2{print $2}’ | sed ‘s/adr://g’)
  44.         ITUNADDR=$(ifconfig $ITUN | awk ‘/dr:/ { gsub(/.*:/,””,$2); print($2); }’)
  45.         TUNRANGE=$(route -n | awk ‘/tun0/ && /255/ {print($1)}’)
  46.         TUNMASK=$(route -n | awk ‘/tun0/ && /255/ {print($3)}’)
  47.         # stoping openVPN
  48.         /etc/init.d/openvpn.vpn1 stop
  49.         # removing VPN route if is present
  50.         if [ ! -z “$(route -n | awk ‘/'”$ITUN”‘/&&/255/ {print($1)}’)” ]; then
  51.                 ip route del default dev $ITUN table $TBL
  52.         fi
  53.         # remove route for marked packets
  54.         ip rule del fwmark 0x45 table $TBL
  55.         # remove accept packets from VPN
  56.         iptables -D INPUT -i $ITUN -j ACCEPT
  57.         # remove iptables packet marking
  58.         iptables -t mangle -D OUTPUT -p udp –dport 53 -j MARK –set-mark 0x45
  59.         iptables -t mangle -D OUTPUT -p tcp –dport 443 -j MARK –set-mark 0x45
  60.         iptables -t mangle -D OUTPUT -p tcp –dport 8080 -j MARK –set-mark 0x45
  61.         # removing binding
  62.         iptables -t nat -D POSTROUTING -o $ITUN -j SNAT –to $ITUNADDR
  63.         # remove output packets to go out throuth VPN
  64.         iptables -t mangle -D OUTPUT -s $ITUNADDR -j MARK –set-mark 0x45
  65.         # re-enable ALL source-address verification filtering
  66.         for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $i; done
  67.         #echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
  68. }

Leave a Reply