Jump to content
ankar84

Выборочный роутинг через VPN туннель

Recommended Posts

Пишу по мотивам моего поста в курилке, который сейчас уже в архиве, а мог бы быть многим полезен.

Иногда на форуме и в канале я вижу вопросы по реализации выборочной маршрутизации некоторых ресурсов через поднятый на роутере VPN туннель, такой как OpenVPN или Wireguard.

Мой скрипт очень простой и эффективный способ перейти на любимый ресурс, даже если он по какой-то причине заблокирован на территории страны.

Многие инструкции предлагают обойти блокировку вообще всего, что заблокировано. Но вряд ли кто-то постоянно посещает все эти заблокированные ресурсы. Многим достаточно разблокировать лишь несколько своих нужных ресурсов.

Скрытый текст

#!/bin/sh
for i in `cat /opt/root/vpnsitelist.txt`; do
        for j in `nslookup $i | egrep -v 127.0.0.1 | awk '/Addr/ {print $3}' | egrep -v ":"`; do
                EXISTS=`ip route show $j | wc -l`
                if [ $EXISTS -eq 0 ]
                then
                        #route add -host $j dev ovpn_br0 #Необходимо раскомментировать, если у вас используется OpenVPN туннель
			route add -host $j dev nwg0 #Если у вас используется Wireguard туннель (как у меня)
                        logger "Add $j host to static route to unblock $i"
                fi
                if [ $EXISTS -eq 1 ]
                then
                        logger "Host $j is already in static route to unblock $i"
                fi
        done
done
exit 0 

 

Небольшие комментарии по скрипту.

/opt/root/vpnsitelist.txt - это обычный текстовый файл, где в каждой строке находится адрес заблокированного ресурса

127.0.0.1 - это ваш DNS сервер. У меня используется AdGuardDNS в режиме DoT/DoH из прошивки. У вас может быть другой. Узнать какой у вас можно выполнив команда nslookup ya.ru на роутере.

Скрытый текст

image.png.b186de0ddccf8982d8b666286a3f3f18.png

ovpn_br0 - имя интерфейса туннеля OpenVPN. У вас может немного отличаться, чтобы посмотреть какой именно у вас воспользуйтесь командой ifconfig 

nwg0 - имя интерфейса туннеля Wireguard. У вас может немного отличаться, чтобы посмотреть какой именно у вас воспользуйтесь командой ifconfig 

Для тех у кого OpenVPN скрипт удобно разместить в директории /opt/etc/ndm/openvpn-up.d/ и сделать симлинк в крон

ln -s /opt/etc/ndm/openvpn-up.d/1-unblock-static-route /opt/etc/cron.hourly/01unblock

Выполнять скрипт в кроне с какой-либо периодичностью я рекомендую потому, что IP адреса заблокированных ресурсов могут часто меняться и нужно добавлять маршруты для них.

У тех у кого Wireguard можно разместить скрипт в /opt/etc/ndm/ifstatechanged.d но тут нужна доработка по отслеживанию поднятия туннеля.

Дополнения и улучшения скрипта приветствуются.

Edited by ankar84
  • Upvote 9

Share this post


Link to post
Share on other sites

Согласен. Частенько приходится вручную менять IP адреса для прежних ресурсов.

А ваш скрипт добавляет только первый IP адрес для домена или все какие находятся?

А эти маршруты будут видны в веб-интерфейсе среди Статических или оно как-то параллельно работает?

Edited by keenet07

Share this post


Link to post
Share on other sites
9 часов назад, keenet07 сказал:

А ваш скрипт добавляет только первый IP адрес для домена или все какие находятся?

Должен оба адреса добавлять.

9 часов назад, keenet07 сказал:

А эти маршруты будут видны в веб-интерфейсе среди Статических или оно как-то параллельно работает?

Да, там все наглядно отображается. То есть это по сути просто автоматизированный способ добавить нужные маршруты в веб-конфигуратор.

Как раз когда писал инструкцию раздумывал указать ли про это, видимо нужно было.

Выглядит вот так:

Скрытый текст

image.thumb.png.3bad7df2edaa8b5a270106b40eb2a126.png

 

Edited by ankar84
  • Thanks 1
  • Upvote 1

Share this post


Link to post
Share on other sites

Теперь вижу. Но добавляются они в список Действующие маршруты IPv4, которые в вебе видны, но не редактируются и не удаляются. В общем системные.

На счёт множественных IP адресов доменов. Их может быть и не два, а больше. Если добавятся не все, то ресурс может открываться не стабильно. Через раз.

И ещё следует предусмотреть вариант автоматического удаления ныне не действующих IP адресов из списка, иначе они будут просто накапливаться в таблице маршрутизации.

Бывали случаи домен содержит 4 адреса, а через некоторое время уже 1. Старые получается, останутся в таблице.

В общем, если будет желание, доработайте.

Edited by keenet07

Share this post


Link to post
Share on other sites

Запускаю скрипт, а в ответ приходит: nslookup: can't resolve 'telegra.ph': Temporary failure in name resolution

И так по каждому адресу, который в списке. Но если просто ввести nslookup telegra.ph - то отрабатывает нормально и выдаёт адрес.

В чём может быть проблема?

Share this post


Link to post
Share on other sites
2 часа назад, Andrey Che сказал:

Запускаю скрипт, а в ответ приходит: nslookup: can't resolve 'telegra.ph': Temporary failure in name resolution

И так по каждому адресу, который в списке. Но если просто ввести nslookup telegra.ph - то отрабатывает нормально и выдаёт адрес.

В чём может быть проблема?

У себя тоже встречаю такие ошибки время от времени, но чаще скрипт всё же выполняется корректно и без ошибок. Возможно данные ошибки как-то связаны с DNS, о чем в них и написано, собственно. Но в чём именно заключается проблема мне не известно.

Share this post


Link to post
Share on other sites
On 1/25/2020 at 11:03 AM, ankar84 said:

У себя тоже встречаю такие ошибки время от времени, но чаще скрипт всё же выполняется корректно и без ошибок. Возможно данные ошибки как-то связаны с DNS, о чем в них и написано, собственно. Но в чём именно заключается проблема мне не известно.

Здравствуйте, у меня keenetic настроен по инструкции https://habr.com/ru/post/428992/

Я настроил wireguard как сервер. Я бы хотел при подключении со своего телефона, использовать возможности обхода как в статье https://habr.com/ru/post/428992/ подключаясь через wireguard. Можно ли через ваш скрипт, сделать такую настройку?

Share this post


Link to post
Share on other sites
В 28.01.2020 в 18:54, Сергей Грищенко сказал:

Можно ли через ваш скрипт, сделать такую настройку?

Мой скрипт подойдёт, если у вас есть VPN подключение (OpenVPN или wireguard) и вы хотите пускать через это VPN подключение не весь трафик к заблокированным ресурсам, а только к нужным только вам заблокированным ресурсам.

Кстати, как вариант проверки работы схемы я добавил адрес 2ip.ua в файл и теперь на 2ip.ru виду свой реальный внешний IP, а на 2ip.ua вижу внешний адрес VPN подключения - значит скрипт работает 

Share this post


Link to post
Share on other sites
2 минуты назад, ankar84 сказал:

Кстати, как вариант проверки работы схемы я добавил адрес 2ip.ua в файл и теперь на 2ip.ru виду свой реальный внешний IP, а на 2ip.ua вижу внешний адрес VPN подключения - значит скрипт работает 

Скорее это значит, что как минимум однажды скрипт сработал, а в целом это показывает, лишь то что ваш VPN подключен и работает.

Share this post


Link to post
Share on other sites

Я бы создал отдельную таблицу.

Пусть есть список исключений /opt/etc/unblock-vpn.txt

Spoiler

### Телеграмм
t.me
tdesktop.com
telegra.ph
telesco.pe
telegram.me
telegram.org
telegram.dog
graph.org
91.108.4.0/22
91.108.8.0/22
91.108.12.0/22
91.108.16.0/22
91.108.56.0/22
95.161.64.0/20
149.154.160.0/22
149.154.164.0/22
149.154.168.0/22
149.154.172.0/22

 

Делаем скрипт /opt/bin/unblock_vpn.sh, который будет обрабатывать такой файл и помещать маршруты в таблицу 1000

Spoiler

#!/bin/sh

cut_local() {
	grep -vE 'localhost|^0\.|^127\.|^10\.|^172\.16\.|^192\.168\.|^::|^fc..:|^fd..:|^fe..:'
}

until ADDRS=$(dig +short google.com @localhost -p 53) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done
ip route flush table 1000

while read line || [ -n "$line" ]; do

	[ -z "$line" ] && continue
	[ "${line:0:1}" = "#" ] && continue

	cidr=$(echo $line | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}')
	if [ ! -z "$cidr" ]; then
		ip route add table 1000 $cidr via 10.64.0.1 dev nwg1 2>/dev/null
		continue
	fi

	addr=$(echo $line | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')
	if [ ! -z "$addr" ]; then
		ip route add table 1000 $addr via 10.64.0.1 dev nwg1 2>/dev/null
		continue
	fi

	dig A +short $line @localhost -p 53 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | cut_local | awk '{system("ip route add table 1000 "$1" via 10.64.0.1 dev nwg1 2>/dev/null")}'

done < /opt/etc/unblock-vpn.txt

 

Вешаем ndm-триггер /opt/etc/ndm/ifstatechanged.d/100-add_antizapret_route.sh на подключение к VPN

Spoiler

#!/bin/sh

[ "$1" == "hook" ] || exit 0
[ "$id" == "Wireguard1" ] || exit 0

case ${change}-${connected}-${link}-${up} in
	link-no-down-down)
		ip rule del iif br0 table 1000 priority 1777 2>/dev/null
	;;
	link-yes-up-up)
		ip rule add iif br0 table 1000 priority 1777 2>/dev/null
	;;
esac

exit 0

 

Добавляем символьную ссылку на скрипт /opt/bin/unblock_vpn.sh  в cron для еже-сек,мин,дневн обновления списка ip.

Достоинства или недостатки:

- маршруты не видны на сайте

- таблица маршрутов при каждом обновлении очищается

unblock_vpn.sh 100-add_antizapret_route.sh

Edited by avn
  • Thanks 1
  • Upvote 2

Share this post


Link to post
Share on other sites

А если просто переподключить интерфейс VPN в роутере?
Вроде, при отключении интерфейса, маршруты назначенные на него теряются и при последующем поднятии обновятся на актуальные, без ненужного мусора.

Можно через крон назначить переподключение интерфейса каждую ночь и все будет чиститься автоматом

Кто разбирается, подскажите, будет такая схема работать? и если да, то как ее заскриптовать на роутере?

Share this post


Link to post
Share on other sites
В 06.02.2020 в 20:27, avn сказал:

Я бы создал отдельную таблицу.

Вообще, когда я перечитал пожелания @keenet07 чуть выше как раз пришел к такой идее. Но у меня совсем нет скилов в сетях под Linux.

Но идея были именно такой. 

Строим таблицу. В настройках таблицы и только в них заложено, что все содержимое этой таблицы должно ходить через определенный интерфейс (WG в нашем случае).

В кроне очищаем таблицу, и забиваем таблицу пусть даже моим алгоритмом через nslookup.

Таким образом после выполнения скрипта получаем только актуальный список адресов для маршрутизации их через VPN.

@avn большое вам спасибо! скорее всего то, что вы написали мне и нужно было. Просто ваши скрипты мне нужно изучить и "переварить" построчно ;)

В 06.02.2020 в 20:27, avn сказал:

ip route add table 1000 $cidr via 10.64.0.1 dev nwg1 2>/dev/null

я так понимаю тут 10.64.0.1 это адрес роутера в туннеле WG?

В 06.02.2020 в 20:27, avn сказал:

dig A +short $line @localhost -p 53 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | cut_local | awk '{system("ip route add table 1000 "$1" via 10.64.0.1 dev nwg1 2>/dev/null")}'

Правильно ли я понимаю, что если у меня в файле только fqdn ресурсов для обхода, то мне нужна только эта строка?

Share this post


Link to post
Share on other sites
В 06.02.2020 в 20:27, avn сказал:

маршруты не видны на сайте

Это минус для диагностики. 

Подскажите, есть же какие-то команды, которыми можно будет диагностировать работу скрипта. 

Типа

# ip rule list
# ip route

 

Share this post


Link to post
Share on other sites

Полный набор скриптов, которые работают у меня во вложении.

Стоит обратить внимание:

1. unblock_vpn.sh  10.64.0.1 - это шлюз vpn соединения, nwg1 - интерфейс Wireguard1 vpn соединения.

2. 100-add_unblock_route.sh - Wireguard1 - имя vpn соединения.

3. Кроме этих скриптов ничего не нужно. При поднятии интерфейса Wireguard1 система заново подгрузит маршруты до точек из файла /opt/etc/unblock-vpn.txt.

4. Так же маршруты раз в сутки будут обновляться самостоятельно, см. cron.daily.

8 hours ago, ankar84 said:

я так понимаю тут 10.64.0.1 это адрес роутера в туннеле WG?

Правильно ли я понимаю, что если у меня в файле только fqdn ресурсов для обхода, то мне нужна только эта строка?

Да, если у Вас только fqdn - то только эта строка и нужна.

Диагностика - проста

ip route show table 1000

Так же можно в скрипт unblock_vpn.sh добавить такую строку:

logger "$(ip route show table 1000 | wc -l) ips added to route table 1000"

Тогда будете видеть в логе соответствующую запись при обновлении маршрутов.

 

изображение.png

backup-Unblock.tar.gz

  • Thanks 1

Share this post


Link to post
Share on other sites
10 часов назад, avn сказал:

Полный набор скриптов, которые работают у меня во вложении.

Сейчас попробовал установить ваши скрипты. 

Вот сразу несколько моментов для тех, кто делает это с нуля.

Ставим утилиту dig

opkg install bind-dig

Делаем скрипты исполняемыми:

chmod +x /opt/bin/unblock_vpn.sh
chmod +x /opt/etc/ndm/ifstatechanged.d/100-add_unblock_route.sh

Делаем ссылку в крон

ln -s /opt/bin/unblock_vpn.sh /opt/etc/cron.hourly/01unblock

Так же подправил шлюз, имя подключения и имя файла с целями на выборочную маршрутизацию на свои.

Дополнительно отмечу, что данная схема по умолчанию работает для устройств в Домашней сети (те устройства, что ходят через интерфейс br0)

Если вы, к примеру, подключаетесь к роутеру по L2TP и хотите так же обращаться к нужным ресурсам через VPN то необходимо добавить следующую строку:

ip rule add iif l2tp0 table 1000 priority 1778

То есть в моем случае скрипт уже будет выглядеть вот так:

#!/bin/sh

[ "$1" == "hook" ] || exit 0
[ "$change" == "link" ] || exit 0
[ "$id" == "Wireguard0" ] || exit 0

case ${id}-${change}-${connected}-${link}-${up} in
	Wireguard0-link-no-down-down)
		ip route flush table 1000
		ip rule del iif br0 table 1000 priority 1777 2>/dev/null
		ip rule del iif l2tp0 table 1000 priority 1778 2>/dev/null
	;;
	Wireguard0-link-yes-up-up)
		ip rule add iif br0 table 1000 priority 1777 2>/dev/null
		ip rule add iif l2tp0 table 1000 priority 1778 2>/dev/null
		/opt/bin/unblock_vpn.sh &
	;;
esac

exit 0

Итог:

image.png.554361a3a38329481da9600746eb8f0a.png

Скрытый текст

~ # ip route show table 1000
5.129.186.222 via 172.16.82.1 dev nwg0
46.148.17.243 via 172.16.82.1 dev nwg0
77.123.139.189 via 172.16.82.1 dev nwg0
81.17.30.51 via 172.16.82.1 dev nwg0
91.108.4.0/22 via 172.16.82.1 dev nwg0
91.108.8.0/22 via 172.16.82.1 dev nwg0
91.108.12.0/22 via 172.16.82.1 dev nwg0
91.108.16.0/22 via 172.16.82.1 dev nwg0
91.108.56.0/22 via 172.16.82.1 dev nwg0
91.132.60.13 via 172.16.82.1 dev nwg0
91.132.60.14 via 172.16.82.1 dev nwg0
95.161.64.0/20 via 172.16.82.1 dev nwg0
104.27.140.68 via 172.16.82.1 dev nwg0
104.27.141.68 via 172.16.82.1 dev nwg0
104.27.180.254 via 172.16.82.1 dev nwg0
104.27.181.254 via 172.16.82.1 dev nwg0
104.28.14.51 via 172.16.82.1 dev nwg0
104.28.15.51 via 172.16.82.1 dev nwg0
104.222.176.202 via 172.16.82.1 dev nwg0
108.174.10.10 via 172.16.82.1 dev nwg0
149.154.160.0/22 via 172.16.82.1 dev nwg0
149.154.164.0/22 via 172.16.82.1 dev nwg0
149.154.167.99 via 172.16.82.1 dev nwg0
149.154.168.0/22 via 172.16.82.1 dev nwg0
149.154.172.0/22 via 172.16.82.1 dev nwg0
185.48.59.9 via 172.16.82.1 dev nwg0
185.81.128.108 via 172.16.82.1 dev nwg0
186.2.163.90 via 172.16.82.1 dev nwg0
188.166.3.205 via 172.16.82.1 dev nwg0
195.82.146.214 via 172.16.82.1 dev nwg0

~ # ip rule list
0:      from all lookup local
10:     from all fwmark 0xffffcff lookup main
164:    from all fwmark 0xffffd00 lookup 42
165:    from all fwmark 0xffffd00 lookup unspec blackhole
166:    from all fwmark 0xffffd01 lookup 43
167:    from all fwmark 0xffffd01 lookup unspec blackhole
222:    from 172.16.82.1 lookup 84
248:    from all lookup 248
1777:   from all iif br0 lookup 1000
32766:  from all lookup main
32767:  from all lookup default

 

@avn выражаю огромную благодарность за реализацию выборочного обхода через таблицу.

@keenet07 в этой схеме учтены, кажется, все ваши пожелания вот отсюда - проверяйте.

Edited by ankar84
  • Thanks 1

Share this post


Link to post
Share on other sites

Сделал новый вариант скрипта у себя, но почему то трейс не идет через vpn, хотя таблица заполнена

ip route show table 1000
81.17.30.22 via 10.10.10.1 dev ppp0
81.17.30.51 via 10.10.10.1 dev ppp0
104.222.176.201 via 10.10.10.1 dev ppp0
149.154.167.99 via 10.10.10.1 dev ppp0
149.154.167.220 via 10.10.10.1 dev ppp0
185.165.168.122 via 10.10.10.1 dev ppp0
195.82.146.214 via 10.10.10.1 dev ppp0
 

Может что-то упустил?

Share this post


Link to post
Share on other sites
8 минут назад, Станислав Поветьев сказал:

Сделал новый вариант скрипта у себя, но почему то трейс не идет через vpn, хотя таблица заполнена

Что покажет ip rule list ?

И ppp0 это интерфейс для вашего туннеля и 10.10.10.1 это адрес роутера на интерфейсе ppp0 ?

Edited by ankar84

Share this post


Link to post
Share on other sites

 ip rule list
0:      from all lookup local
164:    from all fwmark 0xffffd00 lookup 42
165:    from all fwmark 0xffffd00 lookup unspec blackhole
219:    from 10.10.10.2 lookup 81
1777:   from all iif br0 lookup 1000
32766:  from all lookup main
32767:  from all lookup default
 

 

да ppp0 это интерфейс туннеля L2TP клиента на Кинетике, а 10.10.10.1 это конечный адрес сервера L2TP

Edited by Станислав Поветьев

Share this post


Link to post
Share on other sites
1 минуту назад, Станислав Поветьев сказал:

1777:   from all iif br0 lookup 1000

Нужное нам правило добавлено.

Осталось понять, откуда проверяете?

Если с компьютера в домашней сети, который ходит в интернет через интерфейс br0 роутера, то должно работать.

Если еще из какого-то сегмента сети, который сейчас ходит в интернет через какой-то другой интерфейс, то нужно его так же прописать, как я это делал в примере для l2tp

ip rule add iif l2tp0 table 1000 priority 1778

 

Share this post


Link to post
Share on other sites
2 минуты назад, ankar84 сказал:

Осталось понять, откуда проверяете?

Если с компьютера в домашней сети, который ходит в интернет через интерфейс br0 роутера, то должно работать.

Проверяю с самого роутера, мне нужно что бы сам роутер тоже обходил блокировку телеграм, иначе бот не работает на нём.

Кстати команда 

logger "$(ip route show table 1000 | wc -l) ips added to route table 1000"

ничего не выводит ни в консоль ни в логи кинетика почему то. 

Сам бинарник logger стоит в opkg

Share this post


Link to post
Share on other sites
4 минуты назад, Станислав Поветьев сказал:

Проверяю с самого роутера, мне нужно что бы сам роутер тоже обходил блокировку телеграм, иначе бот не работает на нём.

Да, трассировка на роутере у меня тоже показывает что запросы идут прямым путем, а не через VPN.

Но тут или просить помощи у @avn или может кто из других знатоков поможем.

6 минут назад, Станислав Поветьев сказал:

ничего не выводит ни в консоль ни в логи кинетика почему то. 

У меня выводит (скрин прикладывал к посту) добавил в самом конце скрипта unblock_vpn.sh после done

Share this post


Link to post
Share on other sites
4 minutes ago, Станислав Поветьев said:

Проверяю с самого роутера, мне нужно что бы сам роутер тоже обходил блокировку телеграм, иначе бот не работает на нём.

Кстати команда 


logger "$(ip route show table 1000 | wc -l) ips added to route table 1000"

ничего не выводит ни в консоль ни в логи кинетика почему то. 

Сам бинарник logger стоит в opkg

Если ничего не выводит, то скорее всего Вы переподняли соединение vpn

Если хотите что бы все отправлялось в vpn, то можно попробовать так:

ip rule add from all table 1000 priority 1776

 

  • Upvote 1

Share this post


Link to post
Share on other sites
1 минуту назад, avn сказал:

ip rule add from all table 1000 priority 1776

Подскажите, а эта команда добавит маршрутизацию только для таблицы 1000 но на всех интерфейсах роутера?

  • Thanks 1

Share this post


Link to post
Share on other sites
2 минуты назад, avn сказал:

Если ничего не выводит, то скорее всего Вы переподняли соединение vpn

Если хотите что бы все отправлялось в vpn, то можно попробовать так:


ip rule add from all table 1000 priority 1776

Всмысле "все"? Мне нужно что бы сам роутер тоже использовал эту таблицу маршрутов.

 

Share this post


Link to post
Share on other sites
1 minute ago, ankar84 said:

Подскажите, а эта команда добавит маршрутизацию только для таблицы 1000 но на всех интерфейсах роутера?

Все - читать как "маршруты таблицы 1000 со всех интерфейсов"

  • Thanks 2

Share this post


Link to post
Share on other sites
7 минут назад, avn сказал:

Все - читать как "маршруты таблицы 1000 со всех интерфейсов"

Спасибо, заработало.

 

15 минут назад, ankar84 сказал:

Да, трассировка на роутере у меня тоже показывает что запросы идут прямым путем, а не через VPN.

Но тут или просить помощи у @avn или может кто из других знатоков поможем.

У меня выводит (скрин прикладывал к посту) добавил в самом конце скрипта unblock_vpn.sh после done

Странно но у меня в логах тишина.

Share this post


Link to post
Share on other sites
15 минут назад, avn сказал:

Все - читать как "маршруты таблицы 1000 со всех интерфейсов"

Возможно большинству именно это подойдет как более простое и полное решение.

Спасибо!

Share this post


Link to post
Share on other sites

`logger -s` в терминале творит чудеса

Share this post


Link to post
Share on other sites
10 часов назад, TheBB сказал:

`logger -s` в терминале творит чудеса

У меня почему то не творит. Тишина как в терминале так и в логах морды.

Share this post


Link to post
Share on other sites
2 часа назад, Станислав Поветьев сказал:

У меня почему то не творит. Тишина как в терминале так и в логах морды.

~ # logger "$(ip route show table 1000 | wc -l) ips added to route table 1000"
~ # logger -s "$(ip route show table 1000 | wc -l) ips added to route table 1000"
root: 0 ips added to route table 1000
~ # 

???

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...