Автор: alex

Тестирование скорости интернета из консоли FreeBSD (speedtest)

Иногда нужно протестировать скорость интернета на своем шлюзе (FreeBSD) из консоли, в этом нам поможет утилита speedtest.


Ищем актуальную версию

pkg search speedtest

py27-speedtest-cli-1.0.7 Command line interface for testing internet bandwidth
py36-speedtest-cli-1.0.7 Command line interface for testing internet bandwidth

Устанавливаем

pkg install py36-speedtest-cli-1.0.7

Запускаем

speedtest-cli

Результат

Retrieving speedtest.net configuration…
Testing from Resurs-Svyaz Ltd (*.*.*.*)…
Retrieving speedtest.net server list…
Selecting best server based on ping…
Hosted by MTS (Moscow) [17.01 km]: 25.441 ms
Testing download speed…………………………………………………………………….
.Download: 11.00 Mbit/s
Testing upload speed…………………………………………………………………………………………
Upload: 11.11 Mbit/s

Настройка DNS в FreeBSD

DNS (англ. Domain Name System — система доменных имён) — компьютерная распределённая система для получения информации о доменах. Чаще всего используется для получения IP-адреса по имени хоста (компьютера или устройства), получения информации о маршрутизации почты, обслуживающих узлах для протоколов в домене (SRV-запись).

Установка и настройка кеширующего DNS

Смотрим какие есть пакеты

pkg search bind9

Вывод:

bind9-devel-9.12 
bind910-9.10.6 
bind911-9.11.2 
bind99-9.9.11

устанавливаем

pkg install bind911-9.11.2

Рабочий каталог /usr/local/etc/namedb. Приводим named к следующему виду. Оставляем все как есть, только добавляем два параметра и раскомментируем строку forwarders

nano /usr/local/etc/namedb/named.conf
listen-on { 127.0.0.1; 192.168.9.1; };   где 192.168.9.1 адрес нашего локального шлюза

allow-recursion { 127.0.0.1; 192.168.9.0/24; };

forwarders {
192.168.1.1;  DNS адресa шлюза провайдера
};

Все остальное оставляем без изменений. Редактируем rc.conf  и добавляем

nano /etc/rc.conf

named_enable="YES"

Запускаем службу

service named start

Этот способ подходит для организации своего интернет шлюза.

Второй способ похож на первый, только мы добавим свои Зоны. Этот способ подходит для организации локального или глобального DNS сервера

Исходные данные

  • Имя компьютера: ub
  • IP: 192.168.1.1 внешний (пример)
  • IP: 192.168.9.1 внутренний
  • Имя домена: mydom.loc

Подготовка

Проверяем какой IP адрес получил компьютер

ifconfig -a 
мой ip 192.168.9.1 прописываем IP и имя нашего зарегистрированного домена в файлике /etc/hosts

sudo nano /etc/hosts
192.168.9.1 gate.mydom.loc gate

Далее настраиваем named.conf (Как и в первой части, только добавим ключи и 2 зоны: прямую и обратную)

Генерируем ключ для обновления DNS записей

dnssec-keygen -a HMAC-MD5 -b 128 -r /dev/urandom -n USER DHCP_UPDATER

выводим его на экран

cat Kdhcp_updater.*.private|grep Key

на экране вы должны увидеть ключ, что то подобно этому:

Key: vDo6/PVJ7sRm9bOJsBk9Zg==

Открываем файл конфигурации и добавляем

nano /usr/local/etc/namedb/named.conf

key "mydomlockey" {
algorithm hmac-md5;
secret "vDo6/PVJ7sRm9bOJsBk9Zg==";
};
zone "mydom.loc" {
type master;
allow-update {
key "mydomlockey";
};
file "/usr/local/etc/namedb/master/mydom.loc";
};

zone "9.168.192.in-addr.arpa" {
type master;
allow-update {
key "mydomlockey";
};
file "/usr/local/etc/namedb/master/9.168.192.in-addr.arpa.db";

};

Создаем прямую зону

nano /usr/local/etc/namedb/master/mydom.loc

$TTL 604800 ; 1 week
@ IN SOA mydom.loc. root.mydom.loc. (
                        1 ; serial
                        604800 ; refresh (1 week)
                        86400 ; retry (1 day)
                        2419200 ; expire (4 weeks)
                        604800 ) ; minimum (1 week)

IN           A          192.168.9.1
;
@            IN            NS         gate.mydom.loc.
@            IN            A          192.168.9.1
gate         IN            A          192.168.9.1

Настроим обратную зону

! Обратная зона нужна только для локального dns сервера, если Вы создаете публичный DNS сервер, то обратная запись прописывает у Вашего провайдера интернета.

nano /usr/local/etc/namedb/master/9.168.192.in-addr.arpa.db

$TTL 604800 ; 1 week
@ IN SOA gate.mydom.loc. mydom.loc. (
                              1 ; serial
                              604800 ; refresh (1 week)
                              86400 ; retry (1 day)
                              2419200 ; expire (4 weeks)
                              604800 ) ; minimum (1 week)

;

@       IN        NS         gate.
1       IN        PTR        gate.mydom.loc.

Теперь проверим наши конфиги

named-checkzone mydom.loc /usr/local/etc/namedb/master/mydom.loc

zone ub.ru/IN: loaded serial 1
OK
named-checkzone 9.168.192.in-addr.arpa /usr/local/etc/namedb/master/9.168.192.in-addr.arpa.db

zone 1.168.192.in-addr.arpa/IN: loaded serial 1
OK

Проверим права на папке /usr/localetc/namedb/master. Принадлежать папка должна bind. Вот так

drwxr-xr-x  2 bind  bind     512  6 окт.  23:08 master

Если не стоят ставим (Иначе dhcp не сможет записать данные в прямую и обратную наши зоны клиентов)

chown -R bind:bind /usr/local/etc/namedb/master

Применяем изменения

rndc reload

Меняем в кон фале resolv.conf данные

nano /etc/resolv.conf

search mydom.loc
nameserver 192.168.9.1

Пропишем в rc.conf

echo 'named_enable="YES"' >> /etc/rc.conf

Логирование

nano /etc/syslog.conf

!named
*.* /var/log/named.log

Создаем файл

touch /var/log/named.log

Установим права

chown bind:bind /var/log/named.log

Перезапустим

service syslogd reload

Запустим службу

service named start

Если служба не запустилась, смотрите логи!

Таким же способ мы можем создать публичный DNS server, только вместо локального IP прописывает адреса полученные у интернет провайдера.

nslookup mydom.loc

Server 192.168.91
Server 192.168.9.1#53

Name: mydom.loc
Address: 192.168.9.1
nslookup 192.168.9.1

Server 192.168.9.1
Server 192.168.9.1#53

1.9.168.192.in-addr.arpa name=gate.mydom.loc.

IPSEC VPN между удаленными офисами в FreeBSD 11

IPsec (сокращение от IP Security) — набор протоколов для обеспечения защиты данных, передаваемых по межсетевому протоколу IP. Позволяет осуществлять подтверждение подлинности (аутентификацию), проверку целостности и/или шифрование IP-пакетов. IPsec также включает в себя протоколы для защищённого обмена ключами в сети Интернет. В основном, применяется для организации VPN-соединений.

У нас есть два удаленных друг от друга офиса (естественно с выходом в интернет). Шлюзами в которых выступают FreeBSD.

Основные  моменты:

Шлюз FreeBSD с двумя сетевыми картами (em0 и em1).

em0 — смотрит к провайдеру интернета

em1 — в локальную сеть.

К этой схеме можно соединять другие устройства (cisco. и.т.д) 

Забегая вперед скажу, что можно добавлять огромное количество разных маршрутов. ВАЖНО: Все равно не забывайте, что все зависит от пропускной способности Вашего канала. Да и скорость работы будет ниже, чем в локальной сети. 

    И так еще раз основные данные:

  • Внешние статичные («Белый IP») IP : 10.1.1.20 и 10.1.1.21
  • Lan удаленных офисов : 192.168.10.0/24 и 192.168.30.0/24

В FreeBSD 11 Ядро уже скомпилированно с поддержкой ipsec, но проверим

options   IPSEC        #IP security
device    crypto

Добавим только. Как собрать свое ядро описано здесь

options   IPSEC_DEBUG  #debug for IP security

 Редактируем rc.conf

 nano /etc/rc.conf

Добавляем

cloned_interfaces="gif0"
ifconfig_gif0="192.168.10.1 192.168.30.1 netmask 255.255.255.252 tunnel 10.1.1.20 10.1.1.21"

Дописываем статичный маршрут. Иначе клиенты локальных сетей не будут видеть друг друга.

static_routes="vpn"
route_vpn="-net 192.168.30.0 192.168.30.1"

Добавим еще 

ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"

Сохраняемся

Создаем файл ipsec.conf

touch ipsec.conf

Редактируем

nano /etc/ipsec.conf
flush;
spdflush;
#OPC (Local IP)
spdadd 192.168.10.1/30 192.168.30.1/30 any -P out ipsec esp/tunnel/10.1.1.20-10.1.1.21/unique;
spdadd 192.168.30.1/30 192.168.10.1/30 any -P in ipsec esp/tunnel/10.1.1.21-10.1.1.20/unique;

Устанавливаем racoon

cd /usr/ports/security/ipsec-tools/
make && make install && make clean

Добавляем в rc.conf

racoon_enable="YES"
racoon_flags="-l /var/log/racoon.log"

Редактируем racoon.conf

nano /usr/local/etc/racoon/racoon.conf
path include "/usr/local/etc/racoon" ;
 path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;
 log notify;

padding
 {
 maximum_length 20; # maximum padding length.
 randomize off; # enable randomize length.
 strict_check off; # enable strict check.
 exclusive_tail off; # extract last one octet.
 }

# if no listen directive is specified, racoon will listen to all
 # available interface addresses.
 listen
 {
 #isakmp ::1 [7000];
 isakmp 10.1.1.20 [500];
 #admin [7002]; # administrative's port by kmpstat.
 #strict_address; # required all addresses must be bound.
 }

# Specification of default various timer.
 timer
 {
 # These value can be changed per remote node.
 counter 5; # maximum trying count to send.
 interval 20 sec; # maximum interval to resend.
 persend 1; # the number of packets per a send.

# timer for waiting to complete each phase.
 phase1 60 sec;
 phase2 30 sec;
 }
 remote anonymous
 {
 exchange_mode main,aggressive;
 doi ipsec_doi;
situation identity_only;

nonce_size 16;
 lifetime time 240 min; # sec,min,hour
 initial_contact on;
 # support_mip6 on;
 support_proxy on;
 proposal_check obey; # obey, strict or claim

proposal {
 encryption_algorithm 3des;
 hash_algorithm md5;
 authentication_method pre_shared_key ;
 dh_group 5 ;
 }
 }

sainfo anonymous
 {
pfs_group 5;
 lifetime time 24 hour;
 encryption_algorithm 3des,des,cast128,blowfish;
 authentication_algorithm hmac_sha1,hmac_md5;
 compression_algorithm deflate;
 }

Создаем файл с паролями psk.txt

 touch /usr/local/etc/racoon/psk.txt

Редактируем

nano /usr/local/etc/racoon/psk.txt
10.1.1.21 AbraKaDabRa11 (создаем свой ключ, чем сложнее тем лучше)

Обязательно выставляем права для psk.txt

chmod 600 /usr/local/etc/racoon/psk.txt

Проделываем теже действия на втором шлюзе, только меняем местами ip адреса, как внешние так и внутренние.

Перезагружаемся и проверяем. В результате шлюзы должны видеть друг друга, а также клиенты должны друг друга видеть.

Если не работает, проверяем

/usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf -l /var/log/racoon.log

Открываем порты в ipfw

Допишем в  firewall  эти правила для ipsec

$cmd 382 allow ip from any to any via gif0
$cmd 383 allow udp from 10.1.1.20 to 10.1.1.21 isakmp
$cmd 384 allow udp from 10.1.1.21 to 10.1.1.20 isakmp
$cmd 385 allow esp from 10.1.1.20 to 10.1.1.21
$cmd 386 allow esp from 10.1.1.21 to 10.1.1.20
$cmd 387 allow ipencap from 10.1.1.20 to 10.1.1.21
$cmd 388 allow ipencap from 10.1.1.21 to 10.1.1.20

Узнать внешний IP адрес из консоли

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


 Установим wget

pkg install wget

Вводим команду

wget -qO- http://ipecho.net/plain ; echo

Вывод

 Ваш внешний IP

 

Установим curl

pkg install curl

Вводим команду

curl ipecho.net/plain ; echo

Вывод

Ваш внешний IP

Не загружается FreeBSD ошибка в rc.conf

Забыл поставить поставить одну кавычку  в /etc/rc.conf, перезагрузил систему. Система выдала ошибку


Loading configuration files.
/etc/rc.conf: 15: Syntax error: Unterminated quoted string
Enter full pathname of shell or RETURN for /bin/sh:

Открыл файл, чтобы проверить на предмет ошибки

less /etc/rc.conf

Нашел ошибку, надо исправлять редактором nano:

nano /etc/rc.conf

Сохранить не дал, выдал ошибку.

Исправляем:

После появления Enter full pathname of shell or RETURN for /bin/sh: жмём Enter, затем:

mount -a -t ufs

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

Редактируем

nano /etc/rc.conf

Сохраняете и перезапускаетесь.

reboot

Строим полноценный шлюз на базе FreeBSD (bridge+ipfw+wifi+DNS+DHCP)

На рынке сейчас огромное количество разнообразных маршрутизаторов (роутеров), с огромным количеством функции, но они в основном подходят для малых офисов и частных квартир и стоимость их довольна низкая. Но все кардинально меняется когда подключаешь крупные офисы, где нагрузка на роутеры довольно велика, соответственно стоимость таких устройств бьет по карману. Выходом может послужить Ваш старенький компьютер, в который можно докупить сетевые платы и wi-fi карточку и получить отличный роутер, который будет служить верой и правдой очень долгое время.

 И так в предыдущих статьях, мы настроили DNS и DHCP server, собрали новое ядро с фаерволом и мостом.

Настройка DNS

Настройка DHCP

Настройка IPFW

Настройка WiFi

Пример

re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
ether bc:5f:f4:64:5d:b7
hwaddr bc:5f:f4:64:5d:b7
inet 10.102.15.43 netmask 0xffffff00  
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active

vr0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=82808<VLAN_MTU,WOL_UCAST,WOL_MAGIC,LINKSTATE>
ether 00:1c:f0:d1:1a:75
hwaddr 00:1c:f0:d1:1a:75
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (none)
status: no carrier

wlan0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether e8:94:f6:4f:2f:7a
hwaddr e8:94:f6:4g:2f:9a
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
status: no carrier

У нас три сетевых платы:

re0 — смотрит в сторону провайдера (WAN)

vr0 — локальный интерфейс

wlan0 — wifi адаптер

Настроим wifi адаптер

Если Ваш адаптер не появляется в ifconfig. Возможно он просто выключен или FreeBSD не поддерживает данный адаптер.

Ишем wifi адаптер

 pciconf -vl | grep Wireless

device = ‘AR9227 Wireless Network Adapter’

Создаем интерфейс wifii

ifconfig wlan0 create wlandev ath0

Так как мы строим шлюз с wifi, то прописываем в rc.conf

 #wifi
hostapd_enable="YES"
wlans_ath0="wlan0"
create_args_wlan0="wlanmode hostap"
ifconfig_wlan0="up ssid mywifi mode 11g channel 10 txpower 40"

Создаем файл hostapdnano /etc/hostapd.conf

nano /etc/hostapd.conf
interface=wlan0
debug=4
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
ssid=mywifi
wpa=2
wpa_passphrase=Ваш пароль
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
macaddr_acl=0 фильтрация по mac адресам (По умолчанию выключена)

Включаем фильтрацию по mac

  macaddr_acl=1 accept_mac_file=/etc/accept_mac 

 

Настроим Мост (bridge0)

Объединяем два физических интерфейса

Прописываем

nano /etc/rc.conf
#bridge
cloned_interfaces="bridge0"
ifconfig_bridge0="inet 192.168.9.1 netmask 255.255.255.0 addm vr0 addm wlan0 up" 

На интерфейсе vr0 прописывать ничего не надо, как и на wlan0

! При настройке DHCP в rc.conf интерфейс нужно указывать  bridge0

Перезагружаем машину

reboot

После перезагрузки наблюдаем

 ifconfig

re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
ether bc:5f:f4:64:5d:b7
hwaddr bc:5f:f4:64:5d:b7
inet 10.102.15.43 netmask 0xffffff00 
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active

vr0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=82808<VLAN_MTU,WOL_UCAST,WOL_MAGIC,LINKSTATE>
ether 00:1c:f0:d1:1a:75
hwaddr 00:1c:f0:d1:1a:75
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (none)
status: no carrier

wlan0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether e8:94:f6:4f:2f:7a
hwaddr e8:94:f6:4f:2f:7a
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
status: running
ssid freebsdap channel 10 (2457 MHz 11g) bssid e8:94:f6:4f:2f:7a
regdomain 32924 country CN indoor ecm authmode WPA2/802.11i
privacy MIXED deftxkey 2 TKIP 2:128-bit TKIP 3:128-bit txpower 20
scanvalid 60 protmode CTS wme burst dtimperiod 1 -dfs
groups: wlan

bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 02:be:20:6c:a6:00
inet 192.168.9.1 netmask 0xffffff00 broadcast 192.168.9.255
nd6 options=9<PERFORMNUD,IFDISABLED>
groups: bridge

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

less /var/db/dhcpd/dhcpd.leases

Теперь Мы можем пользоваться своим роутером. Удачи.

DHCP server в FreeBSD

Протокол динамического выделения адресов (DHCP) — это сетевой сервис, который позволяет компьютерам в сети автоматически получать настройки с сервера вместо того, чтобы настраивать каждый сетевой хост вручную. Компьютеры, настроенные быть клиентами DHCP, не управляют тем, какие настройки они получат от DHCPсервера, и эта настройка совершенно незаметна для пользователя компьютера.


!Перед установкой и настройкой DHCP должен быть установлен и настроен DNS server

Установка

ищем пакет

pkg search "isc-dhcp.*-server"

Устанавливаем

pkg install isc-dhcp43-server

Настройка

Конфигурационный файл храниться в /usr/local/etc/dhcpd.conf

Редактируем

mv /usr/local/etc/dhcpd.conf /usr/local/etc/dhcpd.conf.old
nano  /usr/local/etc/dhcpd.conf

default-lease-time 600;
max-lease-time 7200;

authoritative;

log-facility local7;

subnet 192.168.9.0 netmask 255.255.255.0 {
range 192.168.9.10 192.168.9.20;
option domain-name-servers 192.168.9.1;
option domain-name «mydom.loc»;
option routers 192.168.9.1;
option broadcast-address 192.168.9.255;
default-lease-time 600;
max-lease-time 7200;
}

ddns-update-style interim;
update-static-leases on;
key mydomlockey {
algorithm hmac-md5;
secret «vDo6/PVJ7sRm9bOJsBk9Zg==»;
}

zone mydom.loc. {
primary 127.0.0.1;
key mydomlockey;
}

zone 9.168.192.in-addr.arpa. {
primary 127.0.0.1;
key mydomlockey;
}

Задать фиксированный IP-адрес для хоста

host Name {

hardware ethernet ce:sd:5f:d0:12:44;

fixed-address 192.168.9.100;

}

Настройка логов

Редактируем syslog.conf:

nano /etc/syslog.conf
!dhcpd
*.info                                          -/var/log/dhcpd.log
!*

Создаем лог-файл:

touch /var/log/dhcpd.log

Перезагружаем конфигурацию syslogd:

service syslogd reload

 Редактируем rc.conf:

nano /etc/rc.conf

dhcpd_enable=»YES»
dhcpd_flags=»-q»
dhcpd_conf=»/usr/local/etc/dhcpd.conf»
dhcpd_ifaces=»em1″ 
dhcpd_withumask=»022″

Где em1 интерфейс смотрящий в локальную сеть

Запускаем службу

service isc-dhcpd start

Если служба не запустилась, смотрите log файл

less /var/log/dhcpd.log

!Чтобы посмотреть подключенных клиентов вводим команду

less /var/db/dhcpd/dhcpd.leases

Файрвол ipfw в FreeBSD + kernel nat

IPFIREWALL (IPFW) — представляет собой межсетевой экран, написанный и поддерживаемый добровольными участниками проекта FreeBSD. Он использует stateless правила, т.е. правила без учета состояния, и наследование техники кодирования правил для получения того, что называется простой логикой с сохранением состояния (stateful). 

Честно говоря по началу мне он не понравился, но разобравшись с ним, я понял, что он не хуже чем iptables. Хорошо документирован, так что не буду писать много теории, а сразу переходим к практике.) Но более подробно об IPFW можно прочитать здесь.

Собираем наше ядро, включив туда firewall, natd, bridge (мост — нужен для распределения нагрузки, и так как у нас будет wifi, но об этом в другой статье), Dymmanet (ограничение пропускной способности инета).

Проверим нашу архитектуру командой: 

uname -a

Вывод

FreeBSD gate 11.1-RELEASE FreeBSD 11.1-RELEASE #1: Mon Sep 25 20:30:12 MSK 2017     root@gate:/usr/obj/usr/src/sys/GENERIC  amd64

У меня 64 разрядная ОС, значит мой каталог такой —  /sys/amd64/conf/. У кого x86, каталог i386 (cd  /sys/i386/conf/ )

cd /sys/amd64/conf/

Копируем конфиг нашего ядра

cp GENERIC MYGENERIC

Редактируем. Добавляем необходимые опции.

nano MYGENERIC
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=10
options IPDIVERT
options DUMMYNET
options IPFIREWALL_NAT
options LIBALIAS
options ROUTETABLES=2
options DUMMYNET
options HZ="1000"
device if_bridge

Компилируем новое ядро.

!Процесс занимает длительное время

cd /usr/src
make buildkernel KERNCONF=MYGENERIC

Устанавливаем ядро

make installkernel KERNCONF=MYGENERIC

 Редактируем rc.conf

nano /etc/rc.conf
#firewall
firewall_enable="YES"
firewall_type="open"

Если мы не добавим эту строчку firewall_type=»open», то получим автономный сервер без сети.

Перезагружаем сервер

reboot

Вывод системы (uname -a)

FreeBSD gate 11.1-RELEASE FreeBSD 11.1-RELEASE #1: Mon Sep 25 21:50:54 MSK 2017     root@gate:/usr/obj/usr/src/sys/MYGENERIC  amd64

Все готово. Идем дальше.

Поднимаем кеширующий DNS (отдельная статья)

Правила для ipfw

nano /etc/sysctl.conf 

net.inet.ip.fw.one_pass=0

Создаем конфиг нашего файрвола 

touch /etc/ipfw.firewall
nano /etc/ipfw.firewall
ipfw -q -f flush
cmd="ipfw -q add"
cmt="ipfw"
skip="skipto 900"
ks="keep-state"
LanOut="re0"
LanIn="bridge0"
LanIn2="fxp0"
home="10.1.1.0/24"
home2="192.168.40.0/24"
home3="192.168.50.0/24"

$cmd 006 allow all from any to any via $LanIn
$cmd 007 allow all from any to any via $LanIn2
$cmd 010 allow all from any to any via lo0
$cmd 014 nat 1 ip from any to any in via $LanOut
$cmd 015 check-state

#############################out#########################
$cmd 020 $skip udp from any to any 53 out via $LanOut $ks 
$cmd 021 $skip tcp from any to any 53 out via $LanOut $ks
$cmd 022 $skip udp from any to any 67 out via $LanOut $ks 
$cmd 023 $skip udp from any to any 68 in via $LanOut $ks

#access
$cmd 024 $skip all from 10.1.1.2 to any via $LanOut $ks
$cmd 025 $skip all from 10.1.1.3 to any via $LanOut $ks

#http(s)
$cmd 027 $skip tcp from any to any 80,443 out via $LanOut $ks
$cmd 028 $skip tcp from any to any 4343 out via $LanOut setup $ks

#client icmp
$cmd 100 $skip icmp from me to any out via $LanOut $ks

#ntp
$cmd 199 $skip udp from any to any 123 out via $LanOut $ks

####################IN####################################
$cmd 200 deny all from 192.168.0.0/16 to any in via $LanOut #RFC 1918 private IP
$cmd 201 deny all from 172.16.0.0/12 to any in via $LanOut #RFC 1918 private IP
$cmd 202 deny all from 10.0.0.0/8 to any in via $LanOut #RFC 1918 private IP
$cmd 203 deny all from 127.0.0.0/8 to any in via $LanOut #loopback
$cmd 204 deny all from 0.0.0.0/8 to any in via $LanOut #loopback
$cmd 205 deny all from 169.254.0.0/16 to any in via $LanOut #DHCP auto-config
$cmd 206 deny all from 192.0.2.0/24 to any in via $LanOut #reserved for docs
$cmd 207 deny all from 204.152.64.0/23 to any in via $LanOut #Sun cluster
$cmd 208 deny all from 224.0.0.0/3 to any in via $LanOut #Class D & E multicast

#nat
$cmt nat 1 config log if $LanOut reset same_ports unreg_only \
redirect_port tcp 10.1.1.2:3389 3389 \
redirect_port tcp 10.1.1.2:4001 4001 \
redirect_port tcp 10.1.1.3:22 22 \
redirect_port tcp 10.1.1.3:80 80

$cmd 300 allow tcp from any to any established via $LanOut

#ssh
$cmd 301 allow tcp from any to me 22 in via $LanOut setup limit src-addr 2

#UDP
$cmd 303 allow udp from any to 10.255.255.255 1947,137-138 in via $LanOut
$cmd 304 allow all from any to 224.0.0.1 in via $LanOut

#web nat
$cmd 305 allow tcp from any to 10.1.1.2 3389 in via $LanOut 
$cmd 308 allow tcp from any to 10.1.1.3 4343 in via $LanOut
$cmd 310 allow all from any to 10.1.1.2 4001 in via $LanOut
$cmd 311 allow tcp from any to 10.1.1.3 80 in via $LanOut

#ntp
$cmd 320 allow udp from any to any 123 in via $LanOut

$cmd 600 deny log all from any to any out via $LanOut
$cmd 601 deny log all from any to any in via $LanOut

$cmd 900 nat 1 ip from any to any out via $LanOut
$cmd 901 allow ip from any to any
$cmd 65534 deny log all from any to any

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

chmod +x /etc/ipfw.firewall

Добавляем опции в rc.conf. Вместо firewall_type, ставим firewall_script=путь до Ваше набора правил

nano /etc/rc.conf
#firewall
firewall_enable="YES"
firewall_script="/etc/ipfw.firewall"
firewall_logging="YES" (log)
gateway_enable="YES" шлюз (port.forwarding)
firewall_nat_enable="YES" - для редиректа портов
firewall_nat_interface="em0" - интерфейс смотрящий в инет

Перезагружаем компьютер

reboot

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

  1. sh /etc/ipfw.firewall
  2. service ipfw restart

!Не много дополнительной информации!

Чтобы отследить IP или порты приходящие на наш шлюз или идущие из локальной сети, можно воспользоваться утилитой iftop. (расскажу о ней более подробно в другой статье)

Если что-то не проходит, то смотрим логи ipfw (/var/log/security)

Всем удачи!

fail2ban защита Вашего локального сервера

Это не заменимый инструмент для защиты Вашего сервера от брутфорса. Он позволяет защищать такие сервисы как: apache, ssh, postfix. и.т.д

ssh 
apache

Защита ssh

 Установим fail2ban

ищем пакет

pkg search fail2ban

py27-fail2ban-0.9.7 

Установим

pkg install py27-fail2ban-0.9.7
Рабочий каталог /usr/local/etc/fail2ban
cd /usr/local/etc/fail2ban

После установки, необходимо сразу скопировать конфиги fail2ban.conf и jail.conf. Их редактировать не нужно.

cp fail2ban.conf fail2ban.local
cp jail.conf jail.local 

Редактируем

очищаем jail.local

echo > jail.local
nano jail.local
[DEFAULT]

ignoreip = 127.0.0.1 192.168.2.0/24

[ssh]
enabled = true
port = ssh
filter = sshd
action = bsd-ipfw[table=22]
logpath = /var/log/auth.log
bantime = 2880
findtime = 800
maxretry = 1

Параметры:

  • [ssh]: имя джэйла в квадратных скобках.
  • enabled: активирован fail2ban.
  • port: номер порта для защиты (может быть номер или хорошо известное имя).
  • filter: Демон нашего сервиса.
  • action: заносит правило для нашего firewall
  • logpath: файл лога .
  • bantime: время бана в секундах, по истечении которого IP–адрес удаляется из списка заблокированных
  • findtime: определяет длительность интервала в секундах, за которое событие должно повториться определённое количество раз, после чего санкции вступят в силу. Если специально не определить этот параметр, то будет установлено значение по умолчанию равное 600 (10 минут).
  • maxretry: максимальное число ошибок перед баном. 

Пропишем в атозагрузку

echo 'fail2ban_enable="YES"' >> /etc/rc.conf

Осталось самое главное включить наш firewall, без которого fail2ban работать не будет.

echo 'firewall_enable="YES"' >> /etc/rc.conf
echo 'firewall_type="open"' >> /etc/rc.conf - этот параметр по желанию. Более подробно, можно ознакомиться в официальной документации freebsd.

Запускаем firewall и fail2ban

service ipfw start

service fail2ban start

Просмотр информации

Просмотр активных джейлов

fail2ban-client status

Status
|- Number of jail: 1
`- Jail list: ssh

fail2ban-client status имя_джейла
fail2ban-client status ssh

Status for the jail: ssh
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 1
`- Banned IP list: 59.16.38.129

Так же можно вручную забанить и разбанить IP

Для бана IP

fail2ban-client set [имя_джейла] banip [ip] 

Для разблокировки

fail2ban-client set [имя_джейла] unbanip [ip] 

 

Защита apache

Авторизация

[apache-auth]
enabled = true
port = http,https
filter = apache-auth
action = bsd-ipfw[table=23]
logpath = /var/log/apache/error.log
bantime = 2880
findtime = 200
maxretry = 2

Боты

[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
action = bsd-ipfw[table=23]
logpath = /var/log/apache/error.log
bantime = 2880
findtime = 200
maxretry = 2

Длинные адреса

[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
action = bsd-ipfw[table=24]
logpath = /var/log/apache/error.log
bantime = 2880
findtime = 200
maxretry = 2

Установка и настройка proftpd в FreeBSD

Из двух более распространенных версий ftp сервером (proftpd и vsftpd), мне больше по душе proftpd! Его я и буду устанавливать!


Устанавливаем из портов 

pkg install proftpd

Настройка не занимает много времени! Так , что перейдем к настройка! По умолчанию proftpd устанавливается в каталог /usr/local/etc/proftpd.conf. Proftpd.conf — конфигурационный файл, его мы и будем редактировать! Мне нравиться редактор nano (не установлен в систему по умолчанию!) Устанавливается двумя способами- из интернета, и из портов. Я ставлю из интернета!

pkg install nano

Редактируем конфигурационный файл! У каждого он свой! Я выкладываю свой!

#
# For more information about Proftpd configuration
# see http://www.proftpd.org/
#
# This is a basic ProFTPD configuration file (rename it to 
# 'proftpd.conf' for actual use. It establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultServer on
ScoreboardFile /var/run/proftpd/proftpd.scoreboard
#UserAlias ftp alex
# Port 21 is the standard FTP port.
Port 21
# Use IPv6 support by default.
UseIPv6 off
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances 30 
MaxClients 15 "Too many connections to the server" 
MaxClientsPerHost 4 "% m client already connected with your host, more not allowed" 
MaxLoginAttempts 3 "Too many login attempts" 
CommandBufferSize 512
DisplayConnect /etc/ftp_connect.msg
DisplayLogin /etc/ftp_login.msg
AccessDenyMsg "ATTENTION!!! ALL CONNECTIONS LOGED"
AccessGrantMsg "Now apload/download files"
#DisplayGoAway "Go Away"
#RequireValidShell off
#AuthUserFile /usr/local/etc/ftp.user
TimeoutIdle 180
TimeoutLogin 120
TimeoutNoTransfer 360
TimeoutStalled 640
# Set the user and group under which the server will run.
User nobody
Group nogroup
# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
DefaultRoot ~
DefaultRoot /var/ftp
# Normally, we want files to be overwriteable.
AllowOverwrite on
#LOGS
SyslogLevel notice
UseReverseDNS off
TransferLog /var/log/proftpd-tranfer.log
SystemLog /var/log/proftpd-error.log
# Bar use of SITE CHMOD by default
#<Limit SITE_CHMOD>
# DenyAll
#</Limit>
<Directory />
AllowOverwrite on
</Directory>
#VALID LOGINS
#<Limit LOGIN>
#AllowUser alex
#AllowALL
#</Limit>
<Directory /var/ftp/>
Umask 0777 0777
AllowOverwrite on
<Limit MKD STOR DELE XMKD RNRF RNTO RMD XRMD>
AllowAll
</Limit>
</Directory>
# A basic anonymous configuration, no upload directories. If you do not </Limit># want anonymous users, 
#########################################################################
# #
# Uncomment lines with only one # to allow basic anonymous access #
# #
#########################################################################
#<Anonymous ~ftp>
# User ftp
# Group ftp
 ### We want clients to be able to login with "anonymous" as well as "ftp"
 # UserAlias anonymous ftp
 ### Limit the maximum number of anonymous logins
 # MaxClients 10
 ### We want 'welcome.msg' displayed at login, and '.message' displayed
 ### in each newly chdired directory.
 # DisplayLogin welcome.msg
 # DisplayFirstChdir .message
 ### Limit WRITE everywhere in the anonymous chroot
 # <Limit WRITE>
 # DenyAll
 # </Limit>
#</Anonymous>
После того как мы сохранили конфигурационный файл, создадим необходимы директории
mkdir /var/ftp

Пропишем в Shells следующую строку

nano /etc/shells
/bin/false

Назначим права доступа

chmod -R 777 /var/ftp

Теперь нужно задать пользователя (владельца папки). Мы его создадим. Например:

adduser ftp
Username: ftp
вводим имя создаваемого пользователя
Full name: 
полное имя, можно оставить пусты, просто нажать Enter
Uid (Leave empty for default):
user id, можно ввести самому, начиная с номера 1001, либо нажать Enter, система выберет сама
Login group [newuser]:
группа в которую входит создаваемый пользователь, по умолчанию совпадает с именем
Login group is newuser. Invite newuser into other groups? []:
включить-ли пользователя в другие группы, если нет, жмем Enter
Login class [default]:
класс пользователя, о них поговорим чуть позже, на данном этапе, жмем Enter
Shell (sh csh tcsh nologin) [sh]: /bin/false
здесь предлагается выбрать системную оболочку, если вы не собираетесь давать данной учетной записи, 
удаленный доступ к системе, например через SSH, вписываем nologin, 
либо выбираем из предложенных вариантов, я обычно ставлю /bin/false (для ftp сервера)
Home directory [/home/newuser]:/var/ftp (Тогда пользователь ftp попадем именно в эту папку)
назначаем домашнюю директорию, если значение по-умолчанию устраивает, жмем Enter
Home directory permissions (Leave empty for default):
права доступа на домашнюю директорию, что-бы оставить по-умолчанию, жмем Enter
Use password-based authentication? [yes]:
использовать-ли авторизацию по паролю
Use an empty password? (yes/no) [no]:
можно-ли использовать пустые пароли
Use a random password? (yes/no) [no]:
система предлагает сгенерировать вам пароль, что-бы согласиться, нужно написать yes 
на заключительном этапе создания учетной записи, будет показан сгенерированный пароль
если предпочитаете ставить пароль вручную, жмите Enter
Enter password:
вводим пароль, имейте в виду, программа не покажет, что вы вообще что-либо вводите
так что будьте внимательны
Enter password again:
повторный ввод пароля
Lock out the account after creation? [no]:
заблокировать-ли учетную запись после создания
Username   : ftp
Password   : *****
Full Name  :
Uid        : 1011
Class      :
Groups     : newuser
Home       : /var/ftp
Home Mode  : 777
Shell      : /bin/false
Locked     : no
OK? (yes/no): yes
Add another user? (yes/no): no

Еще раз пропишим тот же пароль для пользователя, что и создали ранее

passwd ftp

Выставим владельца на папку /var/ftp

chown -R ftp:ftp /var/ftp

Пропишим наш сервер в автозагрузку nano /etc/rc.conf

proftpd_enable="YES"

И все что нам осталось это перезапустить наш сервер командой

service proftpd restart