September 2015 Archives

Phing, запрос перед выполнением

Изобретая очередной костыль, сирчеь deploy-конфиг, выпилил базу данных и конфиги с рабочего проекта.
Благо предыдущий таск бэкапил все и вся. Теперь буду осторожнее и напишу таск, который спрашивает, уверен ли я в том, что делаю.
Собственно вот:
<target name="test">
    <!-- propertyname есть аргмент arg1, с которым идет сравнение в equals -->
        <input propertyname="confirm" defaultValue="no" validargs="yes,no">This action will erase the database. Are you sure? </input>
        <if>
            <equals arg1="${confirm}" arg2="yes" />
            <then>
                <!-- Последовательно вызываем нужные таски, как если бы использовали depends-->
                <phingcall target="clean" />
                <phingcall target="composer" />
                <phingcall target="db" />
                <phingcall target="migrate" />
            </then>
            <else>
                <!-- Иначе прерываем исполнение -->
                <echo>Execution stopped</echo>
            </else>
        </if>
    </target>
Теперь Phing попробует разубедить нас в нашей правоте, тем самым экономя вазелин разнородного начальства.

Раздача IPv6 по OpenVPN туннелю

IPv6 когда то придет в массы. Быть может к нашей пенсии. Мы же, как можем, приближаем этот момент. С выделенными адресами ситуация все ухудшается. В некоторых регионах страны Ростелеком перестал выдавать белые адреса физическим лицам. А белый адрес страсть как нужен, для адекватной работы 4to6. Можно периодически дергать API туннельного брокера, сообщая свой IPv4, но кому это нужно, когда проще купить виртуалку со статикой?
IPv6 это круто, модно, молодежно. И порой даже быстро. Но нафиг не нужно провайдерам.
Задача: Выпустить корпоративную сеть в мир по IPv6.
Имеется: VDS на flops.ru со статикой и туннель от he.net.
Настройка тунеля хорошо описана на сайте he.net, при создании туннеля даже выдается конфиг под разные ОС. Дополнительно нужно получить /48 подсеть.
Шаманим на сервере:
apt-get install openvpn radvd iptables-persistent
echo ipv6 >> /etc/modules
echo net.ipv6.conf.all.forwarding=1 >> /etc/sysctl.conf
echo net.ipv6.conf.default.forwarding=1 >> /etc/sysctl.conf
iptables -A FORWARD -s 10.0.1.0/24 -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
service iptables-persistent save
touch /etc/openvpn/route.sh
chmod +x /etc/openvpn/route.sh
Как генерировать сертификаты описано в документации к OpenVPN, приводить не буду.
Конфиг OpenVPN /etc/openvpn/server.conf:
# Тип севера
tls-server
# Порт сервера
port 1194
# Разработчик OpenVPN рекомендует UDP, но его не умеет Mikrotik, который я юзаю.
proto tcp
# Интерфейс
dev tap
# Сертификаты сервера
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
tls-auth /etc/openvpn/keys/ta.key 0
# Список заблокированых сертификатов
crl-verify /etc/openvpn/keys/crl.pem
# Директория с конфигами статических клиентов
client-config-dir /etc/openvpn/ccd
# Адрес внутренней VPN сети
server 10.0.1.0 255.255.255.0
ifconfig 10.0.1.1 255.255.255.0
# DNS сервер
push "dhcp-option DNS 10.0.1.1"
# Адрес I
Pv6 шлюза в мир
push "route-ipv6 2001:470:xxxx:1::/64"
# Не «передергивать» сетевое устройство при перезапуске демона
persist-tun
#
script-security 3
# Скрипт который правит роутинг при запуске сервера
up /etc/openvpn/route.sh
#
client-to-client
# Каждые 10 секунд посылать ping на удаленный хост, и, если за 30 секунд не было получено ни одного пакета - то перезапускать туннель
keepalive 10 30
# Шифрование
cipher BF-CBC
# Файл статуса сервера
status /var/log/openvpn-stat
# Файл лога сервера
log-append /var/log/openvpn.log
Файл /etc/openvpn/route.sh:
#!/bin/sh
ip addr add 2001:470:xxxx:1::1/64 dev tap0
Конфиг radvd /etc/radvd.conf:
interface tap0
{
    AdvSendAdvert on;
    prefix 2001:470:xxx:1::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
        };
};
Конфиг сети (eth0 смотрит в мир) /etc/network/interfaces:
auto eth0
iface eth0 inet static
	# IP адрес 
	address xxx.xxx.xxx.xxx
	# Маска сети
	netmask 255.255.255.0
	# Широковещательный адрес
	broadcast xxx.xxx.xxx.xxx
	# Шлюз 
	gateway xxx.xxx.xxx.xxx
	# DNS
	dns-nameserver 127.0.0.1
	# IPv6 адрес
	up ip addr add 2001:470:xxxx:0::1/64 dev eth0
Конфиг OpenVPN клиента выглядит примерно так:
tls-client
client
proto tcp
remote xxx.xxx.xxx.xxx 1194
dev tap
tls-auth /etc/openvpn/keys/ta.key 1
dh /etc/openvpn/keys/dh1024.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/10.0.1.2.crt
key /etc/openvpn/keys/10.0.1.2.key
cipher BF-CBC
keepalive 10 30
log-append /var/log/openvpn.log
persist-tun
Перезагружаем сервер. Для фанатов работы без перезагрузки могу сказать, что устройство sit0 (на котором поднимается туннель) не придет, даже если включить модуль ipv6 руками. Ну вот не придет, хоть ты тресни. Ну или я ниасилил.
Подключаемся клиентом к vpn и проверяем:
ping6 -n ya.ru -c 4
Должно выйти примерно так:
PING ya.ru(2a02:6b8::3) 56 data bytes
64 bytes from 2a02:6b8::3: icmp_seq=1 ttl=56 time=158 ms
64 bytes from 2a02:6b8::3: icmp_seq=2 ttl=56 time=123 ms
64 bytes from 2a02:6b8::3: icmp_seq=3 ttl=56 time=121 ms
64 bytes from 2a02:6b8::3: icmp_seq=4 ttl=56 time=122 ms

--- ya.ru ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 121.274/131.460/158.149/15.443 ms