Jump to content

Recommended Posts

6 часов назад, DennoN сказал:

mv /opt/etc/cron.hourly/add-bird4_routes.sh /opt/etc/cron.

после точки подставляешь нужную папку

cron.1min/    cron.hourly/   cron.weekly/
cron.5mins/    cron.daily/    cron.monthly/

типа, такая команда?
mv /opt/etc/cron.hourly/add-bird4_routes.sh /opt/etc/cron.5mins/

Link to comment
Share on other sites

В 09.07.2023 в 22:47, DennoN сказал:

Reeker вообще в главном скрипте add-bird4_routes.sh можно было проверить, что в переменной URLS только коммунити лист, а не основной + коммунтити лист. Должно было помочь.

у меня некоторые сайты открываются через впн, есть другой выход? или все сайты записывать нужно в isp лист чтобы не открывались через впн?

Link to comment
Share on other sites

Всем привет! 
Спасибо автору за отличное решение!
Вчера Стал счастливым  обладателем KN-1811, обновил до 4.04 установил по инструкции на внутреннюю память ультры, вариант BGP, 1vpn wireguar,  поставил графический интерфейс. Все работает, но:

– Нужно добавить adobe.com что бы заходил через vpn
– Megamarket.ru чтобы шел через провайдера. 

В графическом интерфейсе добавил:

adobe.com в /opt/root/Bird4Static/lists/user-vpn.list

Megamarket.ru в /opt/root/Bird4Static/lists/user-isp.list

перезапускал сервис и через графический интерфейс и командами  S70bird stop и S70bird start но ничего не помнялось…

Подскажите, может я некорректно установил bird4? Или помогите как исправить?  

 

Link to comment
Share on other sites

1 час назад, Игорь Жук сказал:

Всем привет! 
Спасибо автору за отличное решение!
Вчера Стал счастливым  обладателем KN-1811, обновил до 4.04 установил по инструкции на внутреннюю память ультры, вариант BGP, 1vpn wireguar,  поставил графический интерфейс. Все работает, но:

– Нужно добавить adobe.com что бы заходил через vpn
– Megamarket.ru чтобы шел через провайдера. 

В графическом интерфейсе добавил:

adobe.com в /opt/root/Bird4Static/lists/user-vpn.list

Megamarket.ru в /opt/root/Bird4Static/lists/user-isp.list

перезапускал сервис и через графический интерфейс и командами  S70bird stop и S70bird start но ничего не помнялось…

Подскажите, может я некорректно установил bird4? Или помогите как исправить?  

 

А такой пробовали ./Bird4Static/scripts/add-bird4_routes.sh ?

Link to comment
Share on other sites

  • 3 weeks later...
В 27.08.2023 в 19:14, Игорь Жук сказал:

перезапускал сервис и через графический интерфейс 

Не помню указал ли, для того чтобы скрипт отрабатывал через вызов со страницы UI нужно дать на него права 777, иначе у пользователя под которым крутится php не будет прав на исполнение и обновление не произойдёт

и да, обновление всегда проходит через запуск ./Bird4Static/scripts/add-bird4_routes.sh

Link to comment
Share on other sites

В 27.08.2023 в 17:14, Игорь Жук сказал:

Всем привет! 
Спасибо автору за отличное решение!
Вчера Стал счастливым  обладателем KN-1811, обновил до 4.04 установил по инструкции на внутреннюю память ультры, вариант BGP, 1vpn wireguar,  поставил графический интерфейс. Все работает, но:

– Нужно добавить adobe.com что бы заходил через vpn
– Megamarket.ru чтобы шел через провайдера. 

В графическом интерфейсе добавил:

adobe.com в /opt/root/Bird4Static/lists/user-vpn.list

Megamarket.ru в /opt/root/Bird4Static/lists/user-isp.list

перезапускал сервис и через графический интерфейс и командами  S70bird stop и S70bird start но ничего не помнялось…

Подскажите, может я некорректно установил bird4? Или помогите как исправить?  

 

У меня тоже есть проблемка, после добавления хостов в user-isp.list - сайт перестает вовсе открываться.
Заметил это как раз на примере Megamarket.
По умолчанию в данном файле находится keenetic.com, он тоже изначально не открывается.

Использовал варианты скрипта: список/BGP

P.S. Пока писал пост, и этот форум перестал работать :D
Пришлось закомментировать строчку с keenetic.com

Edited by Никита Герасимов
Link to comment
Share on other sites

54 минуты назад, DennoN сказал:

@Никита Герасимовпервый пост Возможные проблемы пункт 2

Screenshot_20230918_161409.jpg

Спасибо! Как-то пропустил и правда...
Я пока обошел статическим маршрутом в самом интерфейсе кинетика

Link to comment
Share on other sites

Здравствуйте. По какой причине может приостанавливать работу Bird4? Наблюдается после простоя сети ночью. Утром после рестарта скрипта работает нормально.

Edited by eda100
дополнение
Link to comment
Share on other sites

В 20.10.2022 в 00:11, nnm сказал:

для bird4static добавил управление в ext-ui

после установки ext-ui добавить файл

/opt/share/www/ext-ui/addons/editlist.php 

со следующим содержимым:

  Показать содержимое

 

<?php

// configuration
$url = 'http://ip.of.your.router:88/ext-ui/addons/editlist.php';
$uservpn = '/opt/root/Bird4Static/lists/user-vpn.list';
$uservpn1 = '/opt/root/Bird4Static/lists/user-vpn1.list';
$uservpn2 = '/opt/root/Bird4Static/lists/user-vpn2.list';
$userisp = '/opt/root/Bird4Static/lists/user-isp.list';

// check if form has been submitted
if (isset($_POST['vpn-text']))
{
    // save the text contents
    file_put_contents($uservpn, $_POST['vpn-text']);

    // redirect to form again
    header(sprintf('Location: %s', $url));
    printf('<a href="%s">Moved</a>.', htmlspecialchars($url));
    exit();
}

if (isset($_POST['vpn-text1']))
{
    // save the text contents
    file_put_contents($uservpn1, $_POST['vpn-text1']);

    // redirect to form again
    header(sprintf('Location: %s', $url));
    printf('<a href="%s">Moved</a>.', htmlspecialchars($url));
    exit();
}

if (isset($_POST['vpn-text2']))
{
    // save the text contents
    file_put_contents($uservpn2, $_POST['vpn-text2']);

    // redirect to form again
    header(sprintf('Location: %s', $url));
    printf('<a href="%s">Moved</a>.', htmlspecialchars($url));
    exit();
}


if (isset($_POST['isp-text']))
{
    // save the text contents
    file_put_contents($userisp, $_POST['isp-text']);

    // redirect to form again
    header(sprintf('Location: %s', $url));
    printf('<a href="%s">Moved</a>.', htmlspecialchars($url));
    exit();
}


// read the textfile
$text = file_get_contents($uservpn);
$text1 = file_get_contents($uservpn1);
$text2 = file_get_contents($uservpn2);
$textisp = file_get_contents($userisp);

?>

<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- HTML form0 -->
<form id="selector" action="" method="post">
<input type="button" id="vpn" name="vpn" onclick="document.getElementById('uservpn').style.display='block'; document.getElementById('uservpn1').style.display='none'; document.getElementById('uservpn2').style.display='none'; document.getElementById('userisp').style.display='none'; return false;" value="user-vpn.list"/>
<input type="button" id="vpn1" name="vpn1" onclick="document.getElementById('uservpn1').style.display='block'; document.getElementById('uservpn').style.display='none'; document.getElementById('uservpn2').style.display='none'; document.getElementById('userisp').style.display='none'; return false;" value="user-vpn1.list"/>
<input type="button" id="vpn2" name="vpn2" onclick="document.getElementById('uservpn2').style.display='block'; document.getElementById('uservpn').style.display='none'; document.getElementById('uservpn1').style.display='none'; document.getElementById('userisp').style.display='none'; return false;" value="user-vpn2.list"/>
<input type="button" id="second" name="second" onclick="document.getElementById('userisp').style.display='block'; document.getElementById('uservpn').style.display='none'; document.getElementById('uservpn1').style.display='none'; document.getElementById('uservpn2').style.display='none'; return false;" value="user-isp.list"/>
</form>

<!-- HTML form1 -->
<div id="uservpn" style="display:none;">
<form id="vpn" action="" method="post" onsubmit="document.getElementById('uservpn').style.display='none'; return true;">
<legend>VPN list</legend>
<textarea name="vpn-text" style="width:100%; height:30%;"><?php echo htmlspecialchars($text); ?></textarea>
<input type="submit" value="Save&close"/>
<input type="reset" value="Reset changes"/>
</form>
</div>
<!-- HTML form1 -->
<div id="uservpn1" style="display:none;">
<form id="vpn1" action="" method="post" onsubmit="document.getElementById('uservpn1').style.display='none'; return true;">
<legend>VPN1 list</legend>
<textarea name="vpn-text1" style="width:100%; height:30%;"><?php echo htmlspecialchars($text1); ?></textarea>
<input type="submit" value="Save&close"/>
<input type="reset" value="Reset changes"/>
</form>
</div>

<div id="uservpn2" style="display:none;">
<form id="vpn2" action="" method="post" onsubmit="document.getElementById('uservpn2').style.display='none'; return true;">
<legend>VPN2 list</legend>
<textarea name="vpn-text2" style="width:100%; height:30%;"><?php echo htmlspecialchars($text2); ?></textarea>
<input type="submit" value="Save&close"/>
<input type="reset" value="Reset changes"/>
</form>
</div>

<div id="userisp" style="display:none;">
<form id="isp" action="" method="post" onsubmit="document.getElementById('userisp').style.display='none'; return true;">
<legend>ISP list</legend>
<textarea name="isp-text" style="width:100%; height:30%;"><?php echo htmlspecialchars($textisp); ?></textarea>
<input type="submit" value="Save&close"/>
<input type="reset" value="Reset changes"/>
</form>
</div>

<form action="runbird4static.php">
    <input type="submit" value="Restart service">
</form>

 

 

и этот, для кнопки перезапуска сервиса

/opt/share/www/ext-ui/addons/runbird4static.php

* для работы кнопки перезапуска сервиса нужно выдать права 777 на файл /opt/root/Bird4Static/scripts/add-bird4_routes.sh

  Показать содержимое

 

<?php
shell_exec("/opt/root/Bird4Static/scripts/add-bird4_routes.sh");
header('Location: http://192.168.33.1:88/ext-ui/addons/editlist.php');
?>

файл /opt/share/www/ext-ui/index.html отредактировать, добавив после строки

<meta charset="utf-8" />

свою строку обеспечивающую адаптивное отображение на мобильных устройствах:

<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"/>

 

а перед этой строкой:

<a href="addons/info/index.php" target="myframe" title="System Health and Information"><img src="addons/img/btn/linfo.png"></a>

вставить свою строку с дополнительной кнопкой:

<a href="addons/editlist.php" target="myframe" title="Edit vpn list"><img src="addons/img/btn/vpn.png"></a>

ну или в любое удобное место в том же списке.

кроме этого нужно положить какую-нибудь иконку размером 48х48 по адресу /opt/share/www/ext-ui/addons/img/btn/vpn.png например такую: vpn_PNG48.png.297e126b340ab3cc1678f532d054a7ad.png

на выходе получается такая страница:

image.png.e29449e6c39573813a1879dc13369a76.png

нажатие на кнопку в верхнем ряду открывает соответствующий лист

нажатие на кнопку Save&close сохраняет лист и скрывает его с глаз долой.

Кнопка Restart service перезапускает сервис bird4static

image.png.363536ad315eba3cb6d9c6bed7426370.png

 

p.s. я ненастоящий сварщик, я маску на стройке нашёл, так что замечания или улучшения горячо приветствуются. 

 

Не подскажите в чём может быть проблема, всё сделал по инструкции, файлы открываются для редактирования, но сохраняет с символом ^M в конце каждой строки

znsf4MRWbl.png

Edited by 2028426
Link to comment
Share on other sites

23 часа назад, 2028426 сказал:

Не подскажите в чём может быть проблема, всё сделал по инструкции, файлы открываются для редактирования, но сохраняет с символом ^M в конце каждой строки

znsf4MRWbl.png

решение пока никто не предложил, выкрутился с помощью dos2unix

orXyItAtIy.png

Edited by 2028426
Link to comment
Share on other sites

  • 3 weeks later...

Здравствуйте!

Спасибо, скрипты отлично работают. Настроил таким образом, что трафик маршрутизируется на интерфейс Wireguard, затем обфусцируется в shadowsocks и уходит на сервер.

Сейчас хочу исключить из этой цепочки Wireguard, только не совсем понимаю как. На какой интерфейс направлять трафик для VPN, если интерфейса Wireguard не будет? Просто в переменной VPN прописать 127.0.0.1 и порт, на котором висит тоннель?

Edited by Mikhail_YAR
Link to comment
Share on other sites

Привет! 

 

В последнее время после начал замечать в диагностике такую картину: 

Окт 22 22:05:01
cron[2723]
(root) CMD (/opt/bin/run-parts /opt/etc/cron.5mins^I)
Окт 22 22:05:01
cron[2724]
(root) CMD (/opt/bin/run-parts /opt/etc/cron.1min^I)

После выполнении команды ls -l /opt/etc/crontab BusyBox выдаёт это: 

Цитата

-rw-------    1 root     root           492 Aug 24 14:01 /opt/etc/crontab
~ #  ls -l /opt/etc/cron.*
/opt/etc/cron.1min:

/opt/etc/cron.5mins:

/opt/etc/cron.d:

/opt/etc/cron.daily:

/opt/etc/cron.hourly:
lrwxrwxrwx    1 root     root            49 Oct 22 19:22 add-bird4_routes.sh -> /opt/root/Bird4Static/scripts/add-bird4_routes.sh

/opt/etc/cron.monthly:

/opt/etc/cron.weekly:

По ощущениям, интернет начал проседать из-за постоянного обновления кроны, но как найти в чем проблема я не в силах. Буду рад помощи.

Edited by abelman
Редактирование текста
Link to comment
Share on other sites

2 hours ago, abelman said:

По ощущениям, интернет начал проседать из-за постоянного обновления кроны, но как найти в чем проблема я не в силах. Буду рад помощи.

Попробуй запускать раз в день с помощью следующей команды:

mv /opt/etc/cron.hourly/add-bird4_routes.sh /opt/etc/cron.daily/

или раз в неделю:

mv /opt/etc/cron.hourly/add-bird4_routes.sh /opt/etc/cron.weekly/

Link to comment
Share on other sites

В 25.09.2023 в 09:27, 2028426 сказал:

Не подскажите в чём может быть проблема, всё сделал по инструкции, файлы открываются для редактирования, но сохраняет с символом ^M в конце каждой строки

znsf4MRWbl.png

оно вообще-то не мешает, если что)

да не особо красиво, но у меня все работало

В 17.10.2023 в 22:23, Mikhail_YAR сказал:

Сейчас хочу исключить из этой цепочки Wireguard, только не совсем понимаю как. На какой интерфейс направлять трафик для VPN, если интерфейса Wireguard не будет? Просто в переменной VPN прописать 127.0.0.1 и порт, на котором висит тоннель?

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

22 часа назад, abelman сказал:

В последнее время после начал замечать в диагностике такую картину: 

опять же. это логи крона о том, что он запускает скрипты. если в /opt/etc/cron.1min ничего нет, то оно ничего и не делает, но лог об этом есть

Edited by DennoN
Link to comment
Share on other sites

  • 3 weeks later...

Планирую подключить еще второго интернет провайдера (резерв), как в таком случае будет работать bird4? Можно как-то указать интерфейс 2х провайдеров?

Link to comment
Share on other sites

@Andreycko работа на 2 isp не планировалась. согласно схеме в первом посте все что указывает пользователь - прилетает с одинаковыми приоритетом (кроме варианта, где нужно открывать ресурсы через любой впн, без разницы какой, там приориет пониже, чем у force записей)

так то код выложен, можно свой вариант создать)

Ну а так по факту, если провайдер, который указывается для направления трафика в него отвалился, то в теории трафик пойдет просто игнорируя записи об этом провайдере, согласно другим марщрутам

 

  • Thanks 1
Link to comment
Share on other sites

Подскажите, а можно как то добавить все под домены? 

Например *.unity.com

Сейчас я добавляю unity.com

А вот packages.unity.com и download.packages.unity.com уже не открываются

Edited by bjornfree
Link to comment
Share on other sites

1 час назад, bjornfree сказал:

Подскажите, а можно как то добавить все под домены?

не-а. это не реализуемо через bird. он по факту домены в ip превращает и работает с ip адресами только. про домены он ничего не знает, и сами домены превращаются в ip адреса при запуске скрипта обычным запросом типа
"скажи какие ip адреса у unity.com и добавь эти ip адреса в маршрутизацию". А превратить непонятный *.unity.com  в ip адрес оно не может

только если узнать какие ip адреса принадлежат unity и все их добавить. Но кстати у меня packages.unity.com и download.packages.unity.com выдается один и тот же ip для обоих, так что можно попробовать добавить

unity.com и packages.unity.com например. но это не значит, что все что в *.unity.com будет ходить через впн. только те ip адреса, который на момент запуска скрипта отдал днс сервер

Link to comment
Share on other sites

Товарищи, все настроил но хочу понять. По умолчанию, все маршруты проходят через провайдера если не указано обратного, верно? Просто как-бы, я не настраивал ни инсту, ни rutracker, а они разблокированы и по какому маршруту ходят из 2х - не знаю. При установке выбирал BGP. Как  что прояснитиь?

Edited by Sr_psycho
Link to comment
Share on other sites

50 минут назад, DennoN сказал:

не-а. это не реализуемо через bird. он по факту домены в ip превращает и работает с ip адресами только.

Дело в том что напримере unity.com, адрес днс меняется чуть ли не каждые 5 секунд, во всяком случае когда перезапрашиваю постоянно новые айпишники. cron.1min тоже не поможет в такой ситуации?

Link to comment
Share on other sites

В 11.11.2023 в 13:21, DennoN сказал:

@Andreycko работа на 2 isp не планировалась. согласно схеме в первом посте все что указывает пользователь - прилетает с одинаковыми приоритетом (кроме варианта, где нужно открывать ресурсы через любой впн, без разницы какой, там приориет пониже, чем у force записей)

так то код выложен, можно свой вариант создать)

Ну а так по факту, если провайдер, который указывается для направления трафика в него отвалился, то в теории трафик пойдет просто игнорируя записи об этом провайдере, согласно другим марщрутам

 

Код то есть, но у меня не хватит ума что-то там свое добавить) если вдруг будете искать что добавить в скрипт, буду очень благодарен если его научите включать обход на 2х провайдерах)  (как раз сегодня подключил, на 1 основном работает а на 2м резервном нет).

Link to comment
Share on other sites

28 минут назад, bjornfree сказал:

cron.1min тоже не поможет в такой ситуации?

я бы не сильно надеялся. он меняется может меняться от запроса к запросу, и в bird попадет 1 адрес, а в браузер уже другой. можно просто в днс сервере указать, что вот такой-то ip - это unity.com. как с аватарками на юбтубе делали

46 минут назад, Sr_psycho сказал:

При установке выбирал BGP. Как  что прояснитиь?

если бгп, то значит берутся ip адреса с сервера, который выбрали при установке. их 2. один даунлоад, второй нетворк, у них списки отличаются

и вот эти Ip адреса заворачиваются в туннель. все остальное попадает в провайдера. ну и то что в пользовательских файлах указано Bird4Static/lists/user-(vpn|isp).list в зависимости от того какой файл и чем заполнен, то идет либо в впн либо в провайдера

куда ходят - берем имя сайта и делаем трасерт с компа (гугл в помощь по запросу tracert ) к этому сайту и к сайту который точно идет через провайдера. если видим, что светится Ip туннеля - значит через впн. если провайдера - значит провайдера. можно побаловать сайт например 2iip.ru в файл с впн запустить скрипт и выполнить трасерт, а потом в файл с впн и все так же сделать. так придет понимание чем маршруты отличаются

3 минуты назад, Andreycko сказал:

если вдруг будете искать что добавить в скрипт, буду очень благодарен если его научите включать обход на 2х провайдерах)

пока в планах не было. сам конфиг добавить не сложно, но нужно же автоустановку делать, что бы была возможность выбора и задания нужных шлюзов... А это уже много времени) Там же надо обыгрывать случаи, когда 1 провайдер и 1 или 2 впна (это все реализовано) и так же нужно делать когда 2 провайдера и 1 или 2 впна. И из аккуратной схемы это уже превращается в какого-то монстра, которого тяжело поддерживать

  • Thanks 2
Link to comment
Share on other sites

Подскажите пожалуйста, что конкретно значит " 3 - antifilter.network with vpn 10.75.66.20 ( you need install vpn first https://antifilter.netw "? 

1. Этот VPN тоннель необходимо предварительно поднять в роутере и указывать как один из интерфейсов vpn1/2 , или скрипт сам через него тащит списки когда обнаруживает сеть с этим адресом?

2. Нужен ли вариант №3 вообще, если  у меня уже есть два соединения WG - WARP и собственный сервер на VPS. Оба они уже указаны как inerface 1/2. 
Вот я и запутался слегка.
PS IP серый за натом провайдера.

Edited by Sr_psycho
Link to comment
Share on other sites

@Sr_psycho

1) это значит, что перед использованием скрипта на роутере нужно поднять соединение с сервисом, настроить в боте нужные списки и только потом ставить скрипт

2) этот вариант позволяет с серым адресом или динамическим белым выбрать что конкретно будет отдавать сервис. Другие 2 варианта через bgp такой возможности не предоставляют. Ну и если серый ip, то тут как я понимаю только этот вариант. В первых двух нужен белый адрес, для того что бы хоть что-нибудь работало.

  • Thanks 1
Link to comment
Share on other sites

Подскажите пожалуйста, я выполнил команду 

mv /opt/etc/cron.1min/add-bird4_routes.sh /opt/etc/cron.weekly/

и

./Bird4Static/scripts/add-bird4_routes.sh

Но в логах все равно присутствует обновление раз в минуту нагружая cpu 

Скрытый текст
cron[29111]
(root) CMD (/opt/bin/run-parts /opt/etc/cron.1min^I)
Ноя 17 17:16:15
 
ndhcpc
GigabitEthernet0/Vlan4: received ACK for xxx.xx.xx.xxx from xxx.xx.xx.x lease 300 sec.
Ноя 17 17:17:01

 

Что я так не так сделал? Или что идет не так, а может и так?🤔

Edited by Sr_psycho
Link to comment
Share on other sites

55 минут назад, Sr_psycho сказал:

Подскажите пожалуйста, я выполнил команду 

mv /opt/etc/cron.1min/add-bird4_routes.sh /opt/etc/cron.weekly/

и

./Bird4Static/scripts/add-bird4_routes.sh

Но в логах все равно присутствует обновление раз в минуту нагружая cpu 

  Показать содержимое
cron[29111]
(root) CMD (/opt/bin/run-parts /opt/etc/cron.1min^I)
Ноя 17 17:16:15
 
ndhcpc
GigabitEthernet0/Vlan4: received ACK for xxx.xx.xx.xxx from xxx.xx.xx.x lease 300 sec.
Ноя 17 17:17:01

 

Что я так не так сделал? Или что идет не так, а может и так?🤔

у меня вообще от команды mv /opt/etc/cron.1min/add-bird4_routes.sh /opt/etc/cron.weekly/ такое

Screenshot_22.jpg

Edited by Kazantsev
Link to comment
Share on other sites

Консоль сообщает, что в этой папке нет этого самого скрипта 

add-bird4_routes.sh

Его в начале туда нужно положить как я понял, скопировав из папки root\Bird4Static\scripts\, потом привязать командой 

./Bird4Static/scripts/add-bird4_routes.sh

А когда Вы захотите изменить план загрузки, то уже перемещаете его этой командой →

mv /opt/etc/cron.1min/add-bird4_routes.sh /opt/etc/cron.weekly/

из папки в папку в зависимости от желаемого плана загрузок.

1min

5min

hourly

daily

weekly

monthly

Где → mv - это переместить файл скрипта add-bird4_routes.sh из начальной папки /cron.1min/ и положить его в /opt/etc/cron.weekly/

Edited by Sr_psycho
Link to comment
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...