Источник http://altlinuxmetod.ru/?page_id=385
1
.1 хостнейми и все такое
там где кли
hostnamectl set-hostname xxxx.au.team
vim /etc/sysconfig/network изменить хостнейм
на эко
en
conf t
hostname xxxx.au.team
ip domain-name au.team
.2
на эко
en
conf t
username net_admin
password P@ssw0rd
role admin
ex и потом wr
на свиче
useradd net_admin
passwd net_admin а потом ввод P@ssw0rd дважды
usermod -aG wheel net_admin
добавить в судоерс и чтоб без пароля мог
echo «net_admin ALL=(ALL) NOPASSWD:ALL» > /etc/sudoers.d/net_admin
.3
в машинах с де-шкой надо через интерфейс нетворкманагера, если его нет то надо его поставить но он вроде есть
в других машинах надо через етцнет
на rtr-cod
interface isp
ip address 34.95.33.33/24
ip nat outside
ex
interface sw-cod
ip address 172.16.0.254/23
ip nat inside
ex
write memory
бгп на ртр цод
router bgp 64499
bgp router-id 34.95.33.33
neighbor 34.95.33.254 remote-as 64499
adress-family ipv4 unicast
ex
инстанс
port ge0
service-instance ge0/isp
encapsulation untagged
connect ip interface isp
ex
port ge1
service-instance ge1/sw-cod
encapsulation untagged
connect ip interface sw-cod
ex
wr
нат
ip nat pool nat_cod 172.16.0.1-172.16.1.253
ip nat source dynamic inside pool nat_cod overload interface isp
write
РТР БР
интерфейсы
interface isp
ip address 84.212.78.78/27
ip router isis 1
ip nat outside
ex
interface fw-br
ip address 10.2.0.1/30
ip nat inside
ex
interface loopback.0
ip address 192.168.255.2/32
ip router isis 1
ex
write
инстансы
port ge0
service-instance ge0/isp
encapsulation untagged
connect ip interface isp
ex
ex
port ge1
service-instance ge1/fw-br
encapsulation untagged
connect ip interface fw-br
ex
ex
исис
router isis 1
net 49.0001.1921.6825.5002.00
is-type level-2-only
metric-style wide
ex
бгп
router bgp 64499
bgp router-id 192.168.255.2
neighbor 192.168.255.1 remote-as 64499
neighbor 192.168.255.1 update-source loopback.0
address-family ipv4 unicast
neighbor 192.168.255.1 activate
exit
exit
нат
ip nat pool nat_br 10.2.0.2
ip nat source dynamic inside pool nat_br overload interface isp
write
на свиче можно установить овс
apt-get update && apt-get install -y openvswitch
отключить удаление мостов
vim /etc/net/ifaces/default/options
поменять OVS_REMOVE = yes на no
создание моста и портов
ovs-vsctl add-br sw-cod
ovs-vsctl add-port sw-cod ens18-23
создай в ifaces директорию для sw-cod
mkdir /etc/net/ifaces/sw-cod
в ней надо писнуть в options
TYPE=ovsbr
BOOTPROTO=static
CONFIG_IPV4=yes
добавить ipv4address с айпи 172.16.1.0/23
добавить ipv4route с default via 172.16.0.254
на фв hq создай интерфейсы с правильными айпи по таблице
СОЗДАВАТЬ ИНТЕРФЕЙС БЕЗ АЙПИ А ПОТОМ ВРЕМЯНКУ А ТАМ УЖЕ КАК БЫ ДА
короче с адм идёт тегированный трафик поэтому там нужна времянка
ip addr flush dev eth1 (или какой там интерфейс смотрит внутрь)
ip link add link eth1 name eth1.20 type vlan id 20
ip addr add 10.1.1.33/28 dev eth1.20
ip link set eth1 up
ip link set eth1.20 up
потом делай вланы да
cоздай шлюз по умолчанию в назначении «любой» а в шлюз впиши шлюз.
создать пользователя нетворк и пропустить его в авторизации
возможны траблы с днсом потыкай может быть надо отключить перехват.
возможно придётся сделать гре туннели в идеко
1. tunnel.1
wan
удал: 84.212.78.78
ip: 10.0.1.1/30
2.tunnel.2
wan
удал:34.95.33.33
ip:10.0.2.1/30
создать маршуты
10.2.0.0/16 шлюз 10.0.1.2
172.16.0.0/23 шлюз 10.0.2.2
ИХ НАДО ПРИВЯЗАТЬ К ПРАВИЛЬНЫМ СООТВЕТСТВУЮЩИМ ИНТЕРФЕЙСАМ
Настройка гре и оспф
гре
на ртр-бр:
interface tunnel.1
ip address 10.0.1.2/30
ip tunnel 84.212.78.78 63.27.18.18 mode gre
ex
interface tunnel.3
ip address 10.0.3.1/30
ip tunnel 84.212.78.78 34.95.33.33 mode gre
exit
на цод
conf t
interface tunnel.2
ip address 10.0.2.2/30
ip tunnel 34.95.33.33 63.27.18.18 mode gre
ex
interface tunnel.3
ip address 10.0.3.2/30
ip tunnel 34.95.33.33 84.212.78.78 mode gre
ex
оспф
на ртр бр
interface tunnel.3
ip ospf mtu-ignore
ip ospf network point-to-point
ex
router ospf 1
distance 210
ospf router-id 10.0.3.1
network 10.0.3.0/30 area 0
network 10.2.0.0/30 area 0
default-information originate always
ex
wr
на цод
interface tunnel.3
ip ospf mtu-ignore
ip ospf network point-to-point
ex
router ospf 1
distance 210
redistribute static
ospf router-id 10.0.3.2
network 10.0.3.0/30 area 0
network 172.16.0.0/23 area 0
exit
write
пока на цод создать статику на фв
ip route 10.1.0.0/16 10.0.2.1
после этого на фв добавь правило трафик forward из tunnel.2 в подсеть 10.1.0.0/16
srv-hq
задать днс по нужде
apt-get update && apt-get install freeipa-server bind freeipa-server-dns -y
запуск установки
ipa-server-install —hostname=srv-hq.au.team —domain=au.team —realm=AU.TEAM —setup-dns —auto-forwarders -a P@ssw0rd -p P@ssw0rd -U
скрипт на создание 15 пользователей но он говно возможно потом заменю
echo «P@ssw0rd» | kinit admin
ipa group-add FreeIPA-Users
for g in hq br cod; do
ipa group-add $g
ipa group-add-member FreeIPA-Users —groups=$g
for i in {1..5}; do
usr=»${g}.user${i}»
ipa user-add $usr —first=$g —last=user$i —password
echo «P@ssw0rd» | ipa passwd $usr
ipa group-add-member $g —users=$usr
done
done
проверка
ipa user-find | grep «User login:» | wc -l — ответ должен быть 15
dig SRV _kerberos._tcp.au.team — должен резолвить srv-hq
возможно нужно добавить форвардер
ipa dnsconfig-mod —forwarder=8.8.8.8
ссылка на 1.14.5 терраформ — https:/hashicorp-releases.yandexcloud.net/terraform/1.14.5/terraform_1.14.5_linux_amd64.zip
унзипнуть и переместить terraform в /usr/local/bin потом проверить через terraform version
cоздать в домашней папке рабочюю директорию terraform
создай .terraformrc с яндекс диском с скриптом мол
provider_installation {
network_mirror {
url = «https://terraform-mirror.yandexcloud.net/»
include =[«registry.terraform.io/*/*»]
}
direct {
exclude =[«registry.terraform.io/*/*»]
}
}
ПОЛНОСТЬЮ ВРОДЕ РАБОЧИЙ СКРИПТ!!!
terraform {
required_providers {
freeipa = {
source = «camptocamp/freeipa»
version = «1.0.0»
}
}
}
provider «freeipa» {
host = «srv-hq.au.team»
username = «admin»
password = «P@ssw0rd»
insecure = true
}
# ==========================================
# 1. ЗОНЫ ОБРАТНОГО ПРОСМОТРА (REVERSE ZONES)
# Здесь провайдер требует аргумент «zone_name»
# ==========================================
resource «freeipa_dns_zone» «rev_hq» {
zone_name = «1.1.10.in-addr.arpa.»
}
resource «freeipa_dns_zone» «rev_br» {
zone_name = «1.2.10.in-addr.arpa.»
}
resource «freeipa_dns_zone» «rev_cod0» {
zone_name = «0.16.172.in-addr.arpa.»
}
resource «freeipa_dns_zone» «rev_cod1» {
zone_name = «1.16.172.in-addr.arpa.»
}
# ==========================================
# 2. ПРЯМЫЕ Р—РђРџРРЎР (A)
# Здесь провайдер требует «dnszoneidnsname» Рё «idnsname»
# ==========================================
resource «freeipa_dns_record» «a_records» {
for_each = {
«fw-hq» = «10.1.1.1»
«srv-hq» = «10.1.1.10»
«adm-hq» = «10.1.1.46»
«rtr-br» = «10.2.0.1»
«fw-br» = «10.2.1.14»
«srv-br» = «10.2.1.10»
«rtr-cod» = «172.16.1.254»
«sw-cod» = «172.16.1.0»
«ha1-cod» = «172.16.0.1»
«ha2-cod» = «172.16.0.2»
«srv1-cod» = «172.16.1.1»
«srv2-cod» = «172.16.1.2»
«srv3-cod» = «172.16.1.3»
}
dnszoneidnsname = «au.team.»
idnsname = each.key
records = [each.value]
type = «A»
}
# ==========================================
# 3. ОБРАТНЫЕ Р—РђРџРРЎР (PTR)
# ==========================================
resource «freeipa_dns_record» «ptr_hq» {
for_each = {
«1» = «fw-hq.au.team.»
«10» = «srv-hq.au.team.»
«46» = «adm-hq.au.team.»
}
dnszoneidnsname = freeipa_dns_zone.rev_hq.zone_name
idnsname = each.key
records = [each.value]
type = «PTR»
}
resource «freeipa_dns_record» «ptr_br» {
for_each = {
«14» = «fw-br.au.team.»
«10» = «srv-br.au.team.»
}
dnszoneidnsname = freeipa_dns_zone.rev_br.zone_name
idnsname = each.key
records = [each.value]
type = «PTR»
}
resource «freeipa_dns_record» «ptr_cod0» {
for_each = {
«1» = «ha1-cod.au.team.»
«2» = «ha2-cod.au.team.»
}
dnszoneidnsname = freeipa_dns_zone.rev_cod0.zone_name
idnsname = each.key
records = [each.value]
type = «PTR»
}
resource «freeipa_dns_record» «ptr_cod1» {
for_each = {
«254» = «rtr-cod.au.team.»
«0» = «sw-cod.au.team.»
«1» = «srv1-cod.au.team.»
«2» = «srv2-cod.au.team.»
«3» = «srv3-cod.au.team.»
}
dnszoneidnsname = freeipa_dns_zone.rev_cod1.zone_name
idnsname = each.key
records = [each.value]
type = «PTR»
}
потом терраформ инит и аппли
может жаловаться но то что не знает что такое срв hq тогда надо добавить днс 10.1.1.10
проверить можно через dig @10.1.1.10 rtr-cod.au.team +short (ожидаеться 172.16.1.254)
обратка через dig @10.1.1.10 -x 172.16.1.254 +short (ожидается rtr-cod.au.team)
зайти в /etc/bind/options.conf и поменять query, query cache и recursion на any
дхцпс на срв хк
apt-get install kea-dhcp -y
конфиг kea-dhcp4
{
«Dhcp4»: {
«interfaces-config»: {
«interfaces»: [ «*» ]
},
«lease-database»: {
«type»: «memfile»,
«name»: «/var/lib/kea/kea-leases4.csv»,
«lfc-interval»: 3600
},
«subnet4»: [
{
«id»: 1,
«subnet»: «10.1.2.0/24»,
«pools»: [
{ «pool»: «10.1.2.128 — 10.1.2.254» }
],
«option-data»: [
{ «name»: «routers», «data»: «10.1.2.1» },
{ «name»: «domain-name-servers», «data»: «10.1.1.10» },
{ «name»: «domain-name», «data»: «au.team» }
]
}
]
}
}
на файрволе зайти в dhcp и поставить релай на cli hq интерфейс, и айпи дхцп сервера 10.1.1.10
возможно надо как то разрешить файрвол в сторону фв из цод? через форвард и через туннел 2 обязательно
если во внешних каталогах не буде freeipa, нужно обновить ideco
домен au.team, имя компа fw-hq
если будет пиздеть что хост занят, надо удалить на фриипа
ipa host-del fw-hq.au.team
после чего можно добавить группу в юзерах со всеми пользователями
ДЕНЬ 2
nextcloud skip пока что
ансибл
на адм хк
ssh-keygen -t rsa
перекид на все 5 серваков с помощью ssh-copy-id root@xxxx
ДО ЭТОГО НАДО НА ВСЕХ РАЗРЕШИТЬ РУТ ЛОГИН И ПОТОМ ПЕРЕКИД А ПОТОМ ВНОВЬ ЗАПРЕТИТЬ
apt-get update apt-get install python3-module-pip -y
exit из рута
mkdir home/user/ansible
cd ansible
python3 -m venv venv/ansible
source venv/ansible/bin/activate
pip install ansible
mkdir -p ~/ansible/inventories/production
cd inventories/production
nano hosts
скрипт
all:
children:
proxy:
hosts:
ha1-cod.au.team:
ha2-cod.au.team:
server:
hosts:
srv1-cod.au.team:
srv2-cod.au.team:
srv3-cod.au.team:
vars:
ansible_user: root
ansible_ssh_private_key_file: ~/.ssh/id_rsa
ansible_ssh_common_args: ‘-o StrictHostKeyChecking=no’
cd в ansible
ansible -i inventories/production/hosts -m ping all
из папки ansible
команда для запуска плейбуков: ansible-playbook -i inventories/production/hosts playbook1там сям
создать сертификаt
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout files/www.key -out files/www.crt
cat files/www.crt files/www.key > files/www.pem
в случае фейла с установкой заменить builtin.apt на builtin.package
nano playbook1_keepalived.yml
— name: Configure Keepalived for VIP
hosts: proxy
become: yes
tasks:
— name: Install keepalived
ansible.builtin.apt:
name: keepalived
state: present
update_cache: yes
— name: Deploy keepalived configuration
ansible.builtin.template:
src: keepalived.conf.j2
dest: /etc/keepalived/keepalived.conf
notify: Restart keepalived
handlers:
— name: Restart keepalived
ansible.builtin.service:
name: keepalived
state: restarted
enabled: yes
конфиг для 1 keepalived.conf.j2
если на обоих серваках одинаковое имя интерфеса то линия должна быть
interface ens18
конфиг
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
# Логика для MASTER/BACKUP
state {{ ‘MASTER’ if ‘ha1’ in inventory_hostname else ‘BACKUP’ }}
# ЛОГРРљРђ ДЛЯ РНТЕРФЕЙСОВ (то, что ты сказал)
interface {{ ‘ens18’ if ‘ha1’ in inventory_hostname else ‘ens19’ }}
virtual_router_id 51
# Приоритет (у Master выше)
priority {{ 100 if ‘ha1’ in inventory_hostname else 90 }}
advert_int 1
virtual_ipaddress {
172.16.1.253/23
}
}
это playbook2_web.yml
может жаловаться на отсутствие /var/www/html, чтоб не трахать мозги просто сделай их вручную
— name: Deploy Angie Web Servers
hosts: server
become: yes
tasks:
— name: Install Angie
ansible.builtin.apt:
name: angie
state: present
update_cache: yes
— name: Create index.html with server name
ansible.builtin.copy:
content: «<h1>Served by {{ inventory_hostname }} with Angie!</h1>»
dest: /var/www/html/index.html
— name: Ensure Angie is running
ansible.builtin.service:
name: angie
state: started
enabled: yes
можно проверить работу с помощью curl http://xxx-cod.au.team
дальше 3 playbook
убедись что днс поинт на мой днс есть
playbook3_haproxy.yml
создание CA и сертификата
cd ansible/files
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt — CN = au.team
openssl genrsa -out www.key 2048
openssl req -new -key www.key -out www.csr — CN = www.au.team
создай ext
nano www.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature,
nonRepudiation, keyEncipherment,
dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.au.team
IP.1 = 172.16.1.253
после чего выпуск
openssl x509 -req -in www.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out www.crt -days 365 -sha256 -extfile www.ext
cat www.crt www.key > www.pem
от su
cp ca.crt /etc/pki/ca-trust/source/anchors/au-team-ca.crt
update-ca-trust
после чего создаём плейбук и запускаем
— name: Setup HAProxy with HTTPS
hosts: proxy
become: yes
tasks:
— name: Install HAProxy
ansible.builtin.package:
name: haproxy
state: present
— name: Ensure HAProxy group exists
ansible.builtin.group:
name: haproxy
state: present
system: yes
— name: Ensure HAProxy user exists
ansible.builtin.user:
name: haproxy
group: haproxy
state: present
system: yes
shell: /sbin/nologin
— name: Create SSL directory
ansible.builtin.file:
path: /etc/ssl/haproxy
state: directory
mode: ‘0755’
— name: Copy SSL PEM file
ansible.builtin.copy:
src: files/www.pem
dest: /etc/ssl/haproxy/www.pem
mode: ‘0600’
notify: restart haproxy
— name: Configure HAProxy
ansible.builtin.copy:
dest: /etc/haproxy/haproxy.cfg
content: |
global
log /dev/log local0
log /dev/log local1 notice
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http_front
bind *:80
http-request redirect scheme https unless { ssl_fc }
bind *:443 ssl crt /etc/ssl/haproxy/www.pem
default_backend web_servers
backend web_servers
balance roundrobin
server srv1 srv1-cod.au.team:80 check
server srv2 srv2-cod.au.team:80 check
server srv3 srv3-cod.au.team:80 check
listen stats
bind *:9000
stats enable
stats uri /haproxy_stats
notify: restart haproxy
handlers:
— name: restart haproxy
ansible.builtin.service:
name: haproxy
state: restarted
enabled: yes
должен быть редирект на https при заходе через http, должно быть защищено. возможно надо будет добавить в /etc/hosts
надо скачать какой то идеко клиент на аут
я хз
добавить правило в форвард на зону источника исп на тот же адресс 10.1.0.0/16 чтоб впускаь на всякий случай сигналы. хз надо или нет.
честно без понятие как это говно должно работать