WHR-HP-G300N + OpenWrt + OpenVPN + PIA = Privacy

Ойрд блог бичээгүй юм байна. Ажил гэр 2-ын хооронд өдөр өнгөрөөд байгаа болохоор бичих ч зүйл алга.
Сая сүүлийн хэд хоног router-тэй зууралдаад. Би Private Internet Access(цаашид PIA гэж товчлоно) гэдэг компаны Virtual Private Network(цаашид VPN гэж товчлоно) ашигладаг юм. Laptop дээрээ програмыг нь суулгаад нээх асуудалгүй ашиглаж байсан юм. Тэгээд, нэг өдөр VPN-ээ асаачихсан үедээ Chromecast руугаа видео шидэх гэтэл, Chromecast компьютер дээр гарч ирдэггүй. Харин VPN-ээ унтраахаар гарч ирээд байна. Уг нь IP-аар ping хийхээр хариу өгөөд байгаа юм. Харин hostname-ээр нь ping хийхээр хариу өгдөггүй. Тэгээд интернетээр хайж байтал, угаасаа VPN асаачихаар, Chromecast гарч ирэхээ больчихдог юм байна.
Тэгээд шийдэл хайж байтал, router дээрээ OpenVPN-ээ тохируулвал, Local Area Network(цаашид LAN гэж товчлоно) дахь бүх төхөөрөмжүүд интернет рүү гарахдаа VPN-ээр дамжиж гарах юм байна. Угаасаа, ойлгомжтой л доо, зүгээр router дээр OpenVPN тохируулж болдог гэж мэдээгүй байсан юм. Жишээ нь би гэрээсээ www.google.com-руу орлоо гэхэд доорхи зураг шиг мэдээлэл дамжина гэсэн үг.
Untitled Diagram
OpenVPN нь өндөр нууцлалттай тул, намайг интернэтээр юу хийж байгааг мэдэх боломжгүй гэсэн үг. Дээрээс нь PIA нь дэлхийн нэлээн олон оронд сервер-үүдээ байрлуулсан тул, зарим нэг газар зүйн байрлалаар хязгаарлалт хийсэн веб сайт руу хандах боломжтой болж байгаа юм.
Янз бүрийн аргаар VPN үүсгэх боломжтой бөгөөд, миний мэдэхээр PPTP, L2TP/IPSec, OpenVPN. Энэ хуудсан дээр энэ 3 аргыг гоёоор харьцуулсан байна. Ер нь бол PPTP-г ерөөсөө битгий ашигла, болохгүй бол L2TP/IPSec-г ашигла, боломжтой бол OpenVPN-ыг ашигла гэсэн байгаа.
За тэгэхээр router дээрээ OpenVPN тохируулах ажилдаа оръё.

Original Firmware .vs DD-WRT .vs Tomato .vs OpenWrt
Original Firmware буюу router-ыг худалдаж авах үед суулгасан байсан үйлдлийн систем. OpenVPN ашиглах боломжгүй. PPTP болон L2TP/IPSec тохируулах боломжтойн хувьд боломжтой. Тэгэхдээ PPPoE-тэй зэрэг тохируулж болохгүй. Би Internet Service Provider-руугаа PPPoE-оор холбогддог тул, аль ч сонголт нь боломжгүй юм.
DD-WRT нь хувь хүмүүс хөгжүүлдэг router-ын үйлдлийн систем юм. DD-WRT нь маш олон төрөл байгаа тул, яг өөрийнхөө төхөөрөмжинд зориулж compile-дсан хувилбарыг нь суулгахгүй бол болохгүй. Уг нь OpenVPN тэй хувилбарууд байгаа боловч, тэдгээр нь 8MB болон түүнээс дээш санах ойтой router-үүд дээр л суух боломжтой. Харамсалтай нь минийх 4MB. Бас өөрөө янз бүрийн тохиргоо хийж болдоггүй, нэг л уян хатан биш санагдсан.
Tomato нь миний router дээр тохируулж compile-дсан хувилбар байхгүй байх шиг байна лээ.
Сүүлд тунаж үлдсэн нь OpenWrt. Нэлээн гар ажиллагаа ихтэй, гэхдээ тэрнийхээ хэмжээгээр уян хатан, бас элдэв судлах зүйл ихтэй. Харамсалтай нь 4MB санах ойтой тул, OpenVPN суулгах боломжгүй байлаа. Баахан оролдож оролдож, L2TP-ээр tunneling хийдэг болгов. L2TP нь өөрөө, нууцлалын хамгаалалтгүй тул, IPSec гэдэг протоколын дээгүүр урсаж байж, нууцлалтай болж байгаа юм. Тийм болохоор L2TP/IPSec гэж хамтад нь бичдэг байх.
IPSec тохируулах гэсэн боловч, бас л санах ой хүрэхгүй байна гэсэн асуудалтай тулгарав.
Бүүр аргаа бараад WHR-300HP2 гэдэг 8MB-ын санах ойтой router 35$ гэж байхаар нь Amazon дээрээс захиалчихлаа. Мөнгөнөөс илүүтэйгээр, шинэ router ирэхээр, хуучин router маань зүв зүгээр ажилладаг хэрнээ хог болох нь дээ гэж бодохоор л нэг л хайран санагдаад байв.
Тэгээд дахиад жаахан судалж үзлээ. ЭВРИКА!
Нэгэн Орос хэл дээр бичигдсэн нийтлэл дээр, 4MB санах ойтой router дээр OpenVPN суулгах боломжтой гэсэн байна. WHR-HP-G300N нь үндсэн санах ой нь 4MB ч гэсэн, шуурхай санах ой(цаашид RAM гэж товчлоно) нь 32MB юм. Өөрөөр хэлбэл RAM дээрээ OpenVPN суулгана. Мэдээж RAM тул, router-ын унтраах үед бүх мэдээлэл устна.
Тэгэхээр асаах болгондоо дахин дахин OpenVPN-ыг суулгана гэсэн үг.
Ингээд хэрхэн суулгаж чадсан тухайгаа бичье. Орос хэл дээрх нийтлэл дээрээс жаахан зөрөх тул(амихандаа сайжруулсан санаатай), алийг нь уншихаа өөрсдөө шийдээрэй.

1. OpenWrt суулгах
Хамгийн сүүлийн хувилбар болох Barrier Breaker 14.07-д нь зарим хэрэгцээтэй package-үүд олдохгүй байна гэсэн алдаа гараад байсан тул, тэрний өмнөх хувилбар болох Attitude Adjustment 12.09 RC2 буюу сүүлийн release-г суулгалаа. Эндээс өөрт хэрэгтэйгээ татаж аваарай. Миний router-д тохирох нь openwrt-ar71xx-generic-whr-hp-g300n-squashfs-factory.bin.
TFTP-ээр суулгах бол ****-tftp.bin, original firmware-ээс суулгах гэж байгаа бол ****-factory.bin, OpenWrt-ээ update хийх гэж байгаа бол ****-sysupgrade.bin гэсэн файлыг татаарай.

2. Хэрэгцээтэй package-үүдийг суулгах
Дараах 3 package-ийг үндсэн санах ойдоо суулгана.

opkg update
opkg install kmod-tun zlib liblzo

3. Router асах үед ажиллах script бичих
Дээр дурьдсанчлан, ROM дээр суулгаж байгаа тул, router унтрах үед бүх зүйл чинь устах болно. Тийм болохоор хэрэгцээтэй package-үүдийг асах үед шинээр ROM-руу суулгах script хэрэгтэй.
Доорх script нь үндсэн 3 үүрэгтэй.

  • Хэрэгцээтэй package-уудыг татаж авах
  • Татаж авсан ROM дээрх файлууд руу заасан symlink-ийг үндсэн санах ой дээр үүсгэх
  • Шинээр суусан daemon-уудыг ачааллах
#!/bin/sh /etc/rc.common

# This script installs packages into RAM

START=99
PACKAGES='libopenssl openvpn'
RAM_ROOT=/tmp/root

start() {
	echo removing old symlinks...
	remove_symlinks

	echo updating package list...
	opkg update > /dev/null

	echo root is $RAM_ROOT

	[ -d $RAM_ROOT ] && rm -rf $RAM_ROOT
	mkdir $RAM_ROOT
	cd $RAM_ROOT

	for PACKAGE in $PACKAGES
	do
		echo installing $PACKAGE...
		tar xzf $(opkg download $PACKAGE | grep Downloaded | cut -d\  -f4 | sed '$s/.$//')
		tar xzf data.tar.gz
		find . -maxdepth 1 -type f -exec rm {} \;
	done

	echo creating symlinks...
	create_symlinks

	echo starting daemons...
	start_daemons
}

remove_symlinks() {
	local SYMLINKS=`find / -type l -exec ls -l {} \; 2> /dev/null | grep $RAM_ROOT | awk '{print $(NF-2)}'`

	for SYMLINK in $SYMLINKS
	do
		echo removing $SYMLINK...
		rm -rf $SYMLINK 2> /dev/null
	done
}

create_symlinks() {
	local SOURCE_PATHS=`find $RAM_ROOT/`

	for SOURCE_PATH in $SOURCE_PATHS
	do
		local DESTINATION_PATH=${SOURCE_PATH#$RAM_ROOT}

		if [[ ! -f $DESTINATION_PATH ]] && [[ ! -d $DESTINATION_PATH ]]
		then
			echo "symlinking $SOURCE_PATH -> $DESTINATION_PATH..."
			ln -s $SOURCE_PATH $DESTINATION_PATH
		fi
	done
}

start_daemons() {
	local DAEMONS=`find $RAM_ROOT/etc/init.d/ -type f`

	for DAEMON in $DAEMONS
	do
		echo starting ${DAEMON#$RAM_ROOT/etc/init.d/}...
		${DAEMON#$RAM_ROOT} start
	done
}

Дээрх файлыг үүсгэсэний дараа дараах коммандаар идэвхжүүлнэ.

/etc/init.d/init_ram enable

4. OpenVPN-ы тохиргоо дээрээ PIA-г тохируулна
PIA-ын OpenVPN тохиргоо файлыг эндээс татаж авч болно. Гэхдээ энэ нийтлэлээс санаа авч доторхыг дараах байдлаар өөрчилсөн болно. Бас, OpenWrt дэх OpenVpn нь тохиргооны файлаа uci комманд ашиглан уншиж байсан тул, UCI формат руу хувиргасан болно.
Файлын жагсаалт

/etc/config/openvpn
/etc/openvpn/auth.conf
/etc/openvpn/ca.crt
/etc/openvpn/crl.pem

ca.crt болон crl.pem PIA-аас татаж авсан чигээрээ.
auth.conf нь дараах байдлаар

username
password

/etc/config/openvpn нь дараах байдалтай

package openvpn

config openvpn private_internet_access
	option enabled 1
	option client 1
	option dev tun
	option proto udp
	option remote "us-seattle.privateinternetaccess.com 1194"
	option resolv_retry infinite
	option nobind 1
	option persist_key 1
	option persist_tun 1
	option tls_client
	option remote_cert_tls server
	option ca /etc/openvpn/ca.crt
	option auth_user_pass /etc/openvpn/auth.conf
	option comp_lzo 1
	option verb 3
	option reneg_sec 0
	keepalive "10 120"

5. DNS тохиргоо
Энэ нийтлэлээс харвал, DNS нэмж өгөхгүй бол ажиллахгүй гэсэн тул PIA-ын DNS болох 209.222.18.222 болон 209.222.18.218-г нэмж өгнө.
Screen Shot 2014-10-22 at 12.04.18 AM

6. Firewall тохиргоо
2 янзаар тохируулж болно. Мэдээж хэд л бол хэдэн янзаар, гэхдээ маш энгийнээр бол 2 янзаар. Эхнийх нь дараах байдлаар
Untitled Diagram
Өөрөөр хэлбэл, VPN тасарвал шууд интернетгүй болно гэсэн үг. Миний хувьд энэ тохиргоог хэрэглэдэг. Яагаад гэвэл, санамсаргүй байдлаар VPN тасарчихаад байхад, ямар ч хамгаалалтгүй сүлжээнд байгаад баймааргүй болохоор. No VPN, No Internet гэсэн сонголт юм уу даа. Ингэж тохируулахын тулд дараах тохиргоог хийнэ.
Screen Shot 2014-10-22 at 12.22.19 AM
Дараагийн хувилбар нь бол, нэлээн уян хатан.
Untitled Diagram (1)
Зураг дээрээс тодорхой харж байгаа байх, өөрөөр хэлбэл, эхлээд VPN-ээр дамжиж интернет рүү гарах гэж үзнэ, хэрвээ VPN-ын холболт тасарсан бол ямар ч хамгаалалтгүй, шууд интернет рүү гарна гэсэн үг. Ингэж тохируулахын тулд дараах байдлаар тохируулна.
Screen Shot 2014-10-22 at 12.31.23 AM

7. Restart
Одоо router-ээ restart хийх үлдлээ. Restart хийх үед package интернетээс татаж авч суулгаж байгаа тул, жирийн үеийнхээс харьцангуй удаан асна. 3-4 минту? Гэхдээ үргэлж restart хийгээд байх биш, байнга асаалттай байлгадаг хүнд бол, not a big deal.

8. Тохиргоо зөв хийгдсэн эсэхийг шалгах
Дараах хуудсуудаар орж тохиргоогоо зөв хийгдсэн эсэхийг шалгаарай.

Бонус. Компьютерээсээ хялбар аргаар асааж, унтраах
Заримдаа VPN-ээ унтраах хэрэг гарна. Миний хувьд 2 тохиолдолд унтраадаг. Эхнийх нь том хэмжээний файл татах үед. Жишээ нь саяхан, Mac OS X Yosemite-г татах үед маш удаан байсан тул, VPN-ээ унтраасан. 2 дахь тохиолдол нь давхар VPN ашиглах үед. Ажлынхаа компьютерүүд рүү холбогдохын тулд мэдээллийн аюулгүй байдлын үүднээс, заавал компаний VPN-ээр дамжихгүй бол холбогдох боломжгүй байдаг. Тэгэхийн тулд компьютер дээрээ VPN програм асаагаад, router дээр бас нэг VPN ажиллавал, давхар давхар хурд унаад, юм хийхийн аргагүй удаан болдог.
Тийм болохоор, амархан бас хурдан аргаар VPN-ээ асааж унтрааж байх хэрэгтэй. Миний хувьд дараах script-ын ашигладаг.

BASENAME=`basename $0`
if [ -z "$1" ]
then
	echo "usage: $BASENAME (on|off)"
	exit 1
fi

if [ "$1" == "on" ]
then
	echo "turning on..."
	/etc/init.d/openvpn start
	cp -f /etc/config/firewall.vpn /etc/config/firewall
	/etc/init.d/firewall restart
	exit 0
fi

if [ "$1" == "off" ]
then
	echo "turning off..."
	/etc/init.d/openvpn stop
	cp -f /etc/config/firewall.wan /etc/config/firewall
	/etc/init.d/firewall restart
	exit 0
fi

echo "usage: $BASENAME (on|off)"
exit 1

firewall.vpn нь VPN-ээр дамжиж интернет рүү гарах тохиргоо. firewall.wan нь VPN-гүй үеийн тохиргоо.
Энэ script-ыг /sbin/vpn дотор бичиж өгвөл дараах байдлаар асааж унтрааж болно.

vpn on # асаах
vpn off # унтраах

эсвэл, заавал router рүүгээ SSH-ээр холбогдолгүйгээр, дараах байдлаар remote-оор дуудаж болно

ssh 192.168.1.1 vpn on # асаах
ssh 192.168.1.1 vpn off # унтраах

Төгсгөлд
Ямар router-ээс хамаараад үйлдлийн систем суулгах үед алдаа гаргаснаас болоод, router-ээсээ үүрд хагацах боломжтой гэдгийг санаарай. Тэгэхдээ миний router-ын хувьд TFTP-ээр original firmware-ыг нь буцаагаад суулгах боломжтой байсан.

За, bye!
Зав гарвал дахиад бичнээ.