воскресенье, 19 апреля 2015 г.

Дополнительный NAT при отладке juniper

Не часто, зато регулярно приходится иметь дело со всякими умными железками. Причем решаемые задачи от хрестоматийно простых, до "этого сделать нельзя, но очень надо". Так и в этот раз, после двух- или трехлетнего перерыва нужно сделать конфиг для Juniper SRX-100 (версия "B", который с маленькой памятью). Задача осложнена тем, что нужно заранее сделать и быстро-быстро переставить (больница, режим работы круглосуточный простои крайне не желательны). Нужно делать стенд и отлаживать. Ресурсов для деланья оного стенда нет, можно сгородить только половину от желаемого. С созданием source-nat проблем никаких. В результате имеем подключенный к внутренней сети девайс, который можно использовать в качестве дефолтового шлюза (один из интерфейсов вытолкнули наружу, правда через "лишний чужой" NAT). Прописали его на одном компе и погоняли. Все гладко. Надо настроить destination-nat, там полтора десятка разных пробросов, их, собственно и хочется погонять. Условием работы desination nat является использование того-же устройства в качестве default gateway (пакеты приходят с мира, имея настоящий обратный адрес, на который и уходят ответы сервера). Поскольку все те сервисы, которые надобно отладить, используют совершенно другой ip в качестве дефолта, отладка остановилась. Единственный выход - сделать доп. трансляцию адресов с тем, чтоб source-address в пакете был заменен на адрес интерфейса маршрутизатора. Вот этот конфиг, вернее его кусочки и приведем. На самом деле все оказалось не просто, а очень просто.
Раздел system, тут ничего интересного, приведен полностью на всякий случай.

version 11.2R4.3;
system {
    host-name gw1;
    time-zone Asia/Bangkok;
    root-authentication {
        encrypted-password "онтутбыл"; ## SECRET-DATA
    }
    name-server {
        208.67.222.222;
        208.67.220.220;
        8.8.8.8;
        77.88.8.8;
    }
    services {
        ssh;
        web-management {
            http {
                interface vlan.0;
            }
            https {
                system-generated-certificate;
                interface vlan.0;
            }
        }
    }
    syslog {
        archive size 100k files 3;
        user * {
            any emergency;
        }
        file messages {
            any critical;
            authorization info;
        }
        file interactive-commands {
            interactive-commands error;
        }
    }
    max-configurations-on-flash 5;
    max-configuration-rollbacks 5;
    license {
        autoupdate {
            url https://ae1.juniper.net/junos/key_retrieval;
        }
    }
    ntp {
        peer 10.0.0.3;
    }

}

Интерфейсы, даже вычистим серединку для экономии места. Пока стоит один внешний, все остальное в switching.

interfaces {
    fe-0/0/0 {
        unit 0 {
            family inet {
                address 91.201.11.82/29;
            }
        }
    }
    fe-0/0/1 {
        unit 0 {
            family ethernet-switching {
                vlan {
                    members vlan-trust;
                }
            }
        }
    }

....
    fe-0/0/7 {
        unit 0 {
            family ethernet-switching {
                vlan {
                    members vlan-trust;
                }
            }
        }
    }
    lo0 {
        unit 0 {
            family inet {
                filter {
                    input deny-ssh;
                }
            }
        }
    }
    vlan {
        unit 0 {
            family inet {
                address 10.0.0.26/23;
            }
        }
    }

Роутинг и пр. Так же на всякий случай

}
snmp {
    community public {
        authorization read-only;
    }
}
routing-options {
    static {
        route 0.0.0.0/0 next-hop 91.201.11.81;
    }
}
protocols {
    stp;
}

Адресную книгу и правила firewall приводить нет смысла. А вот и собственно NAT.

    nat {
        source {
            rule-set trust-to-untrust {
                from zone trust;
                to zone untrust;
                rule source-nat-rule {
                    match {
                        source-address 0.0.0.0/0;
                    }
                    then {
                        source-nat {
                            interface;
                        }
                    }
                }
            }
            rule-set untrust-to-trust {
                from zone untrust;
                to zone trust;
                rule source-rule {
                    match {
                        source-address 0.0.0.0/0;
                    }
                    then {
                        source-nat {
                            interface;
                        }
                    }
                }
            }
        }
        destination {
            pool d-rdp2 {
                address 10.0.0.2/32 port 3389;
            }
            rule-set D-NAT {
                from zone untrust;      
                rule rdp2 {             
                    match {             
                        destination-address 91.201.11.82/32;
                        destination-port 3390;
                    }                   
                    then {              
                        destination-nat pool d-rdp2;
                    }                   
                }                       
            }                           
        }                               
    }                                   
    policies {                          
        from-zone trust to-zone untrust {
            policy trust-to-untrust {   
                match {                 
                    source-address any;
                    destination-address any;
                    application any;
                }
                then {
                    permit;
                }
            }
        }
        from-zone untrust to-zone trust {
            policy local2-acc {
                match {
                    source-address any;
                    destination-address local2;
                    application any;
                }
                then {
                    permit;
                }
            }
        }
    }
    zones {
        security-zone trust {
            host-inbound-traffic {
                system-services {
                    all;
                }
                protocols {
                    all;
                }
            }
            interfaces {
                vlan.0;
            }
        }
        security-zone untrust {
            interfaces {
                fe-0/0/0.0 {
                    host-inbound-traffic {
                        system-services {
                            ping;
                            ssh;
                        }
                    }
                }
            }
        }
    }
}

Розовым цветом выделен "дополнительный NAT", ради которого вся писанина. Никаких дополнительных policy не нужно! Теперь пакеты прошедшие destination NAT, проходят еще и source NAT, и приходят  на терминальный сервер с 10.0.0.26 (адрес интерфейса), что позволяет потихоньку проверять устанавливаемые правила пробросов не мешая всему остальному.


понедельник, 13 апреля 2015 г.

FireBird backup

Есть (реальность, данная в самых пренеприятных ощущениях) медицинская программа (Арена, она же Аметист, она же Колибри и еще пара -- тройка ипостасей). Живет она на Win2008R2 (на виртуалке) на движке FireBird. Задача на самом деле простая - нужно ее сохранять родными средствами раз в сутки и иметь достаточное количество копий на случай развала базы. Запускаем по рабочим дням ежедневный скриптик. 

MD %systemroot%\temp\arenabackup
set now=%TIME:~0,-3%
set now=%now::=%
set now=%now: =0%
set now=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%_%now%
"C:\Program Files\Firebird\Firebird_2_5\bin\gbak" -b "C:\arena\DB\arena.Gdb" "%systemroot%\temp\arenabackup\%now%.Gbk" -user sysdba -password masterkey -v -y "%systemroot%\temp\arenabackup\%now%.txt"
"C:\Program Files (x86)\7-Zip\7z.exe" a W:\day\%now%bak.zip %systemroot%\temp\arenabackup*

RD %systemroot%\temp\arenabackup /S/Q

И раз в месяц еще и месячный, для верности

MD %systemroot%\temp\arenabackup
set now=%TIME:~0,-3%
set now=%now::=%
set now=%now: =0%
set now=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%_%now%
"C:\Program Files\Firebird\Firebird_2_5\bin\gbak" -b "C:\arena\DB\arena.Gdb" "%systemroot%\temp\arenabackup\%now%.Gbk" -user sysdba -password masterkey -v -y "%systemroot%\temp\arenabackup\%now%.txt"
"C:\Program Files (x86)\7-Zip\7z.exe" a W:\mounth\%now%bak.zip %systemroot%\temp\arenabackup*
RD %systemroot%\temp\arenabackup /S/Q

Автор скриптов Михаил Дедов, спасибо ему за терпение, имя и пароль соответствуют дефолтовым настройкам FB,  их нужно подставить реальные. Диск W: замаплен на сетевой ресурс, на котором все копии и живут. В планировщике это выглядит вот так:


В соответствующем /etc/cron.d/local есть такие строчки:

22 4 * * 1-5  root find /home/storage/onecopy/arenadb/day -ctime +10 -delete
22 5 15 * *  root find /home/storage/onecopy/arenadb/month -ctime +180 -delete