Archives pour la catégorie ‘BSD’

FreeBSD : fichier de règles PF

#
# pf.conf
#

# macros
ext_if = "re0"
int_if = "lo1"

# tables
table  persist {}

# options
set block-policy drop
set skip on lo0
set limit { states 20000, frags 5000, src-nodes 2000 }

# normalization
scrub in all fragment reassemble
scrub all reassemble tcp
scrub in all random-id

#
# redirection
#

nat on $ext_if from !($ext_if) to any -> ($ext_if)

# jail dns
rdr pass on $ext_if proto tcp from any to port 53 -> 172.16.0.1 port 53
rdr pass on $ext_if proto udp from any to port 53 -> 172.16.0.1 port 53
# jail www
rdr pass on $ext_if proto tcp from any to port 80 -> 172.16.0.2 port 80
rdr pass on $ext_if proto tcp from any to port 443 -> 172.16.0.2 port 443
rdr pass on $ext_if proto tcp from any to port 2222 -> 172.16.0.2 port 22

#
# rules
#

block in log
block out log
block quick from
antispoof quick for lo0

pass quick on $int_if

pass out proto tcp all keep state
pass out proto udp all keep state

pass in on $ext_if inet proto icmp from any to any keep state
pass out on $ext_if inet proto icmp from any to any keep state

pass in on $ext_if inet6 proto icmp6 from any to any keep state
pass out on $ext_if inet6 proto icmp6 from any to any keep state

pass in on $ext_if proto tcp from any to any port 22 flags S/SA keep state \
(source-track rule, max-src-conn 4, max-src-conn-rate 4/30, \
overload  flush global)

FreeBSD : IPv6 avec CARP et VLAN

node1# more /etc/rc.conf
[...]
ipv6_enable="YES"
ipv6_gateway_enable="YES"
ipv6_network_interfaces="lo0 igb0 em0 vlan1 vlan101 vlan102 carp0 carp1 carp2"
ipv6_defaultrouter="::1"

ipv6_ifconfig_igb0="fdcb:9921:3552:afd6::2 prefixlen 64"
ipv6_ifconfig_em0="fdcb:9921:3552:afff::2 prefixlen 64"
ipv6_ifconfig_vlan1="fdcb:9921:3552:afd7::2 prefixlen 64"
ipv6_ifconfig_vlan101="fdcb:9921:3552:afd8::2 prefixlen 64"
ipv6_ifconfig_vlan102="fdcb:9921:3552:afd9::2 prefixlen 64"
ipv6_ifconfig_carp0="fdcb:9921:3552:afd6::1 prefixlen 64"
ipv6_ifconfig_carp1="fdcb:9921:3552:afd8::1 prefixlen 64"
ipv6_ifconfig_carp2="fdcb:9921:3552:afd9::1 prefixlen 64"
[...]
pf_enable="YES"
pf_flags=""
pf_rules="/etc/fw.conf"
pfsync_enable="YES"
pfsync_syncdev="em0"
[...]

Pour la configuration IPv4, c’est par ici.

FreeBSD : forcer le périphérique root au niveau du boot loader

set vfs.root.mountfrom.options=rw
set vfs.root.mountfrom=vfs:/dev/ada0s1a

mmv : renommage de fichiers en masse

mmv est un outil permettant la modification / copie / déplacement de fichiers en masse. Il permet donc de corriger rapidement les erreurs de nommage !

Ainsi la commande pour renommer les fichiers possédant un caractère : par un caractère _ est la suivante :

# mmv \*:\* \#1_#2

OpenVPN : authentification LDAP

OpenVPN fournit un plugin d’authentification PAM. En ajoutant le module LDAP pour PAM, il peut alors interroger la base LDAP où sont stockés les accès de chaque utilisateur se connectant au serveur VPN.

# cd /usr/ports/security/pam_ldap
# make install clean

/usr/local/etc/openvpn/openvpn.conf :

[...]
plugin /usr/local/lib/openvpn-auth-pam.so openvpn

/usr/local/etc/pam.d/openvpn :

account         required        /usr/local/lib/pam_ldap.so config=/usr/local/etc/openvpn/auth/pam_ldap.conf
auth            required        /usr/local/lib/pam_ldap.so config=/usr/local/etc/openvpn/auth/pam_ldap.conf
password        required        /usr/local/lib/pam_ldap.so config=/usr/local/etc/openvpn/auth/pam_ldap.conf
session         required        /usr/local/lib/pam_ldap.so config=/usr/local/etc/openvpn/auth/pam_ldap.conf

/usr/local/etc/openvpn/auth/pam_ldap.conf :

uri ldapi://%2Fvar%2Frun%2Fopenldap%2Fldapi/
binddn cn=proxy,dc=my,dc=domain
bindpw 123456
ldap_version 3
ssl start_tls
tls_cacert /usr/local/etc/openldap/server.crt
tls_checkpeer no
base ou=Users,dc=my,dc=domain
scope one
pam_login_attribute uid

Côté client, il faut ajouter l’option suivante au fichier de configuration :

[...]
auth-user-pass

FreeBSD : redondance réseau CARP et VLAN

Serveur primaire

node1# more /etc/rc.conf
gateway_enable="YES"

network_interfaces="lo0 igb0 igb1 em0"
ifconfig_igb0="up"
ifconfig_igb1="inet 172.16.2.251 netmask 255.255.255.0"
ifconfig_em0="192.168.254.251 netmask 255.255.255.0"
defaultrouter="172.16.2.254"

cloned_interfaces="vlan1 vlan101 vlan102 carp0 carp1 carp2 carp3"
ifconfig_vlan1="inet 192.168.0.251 netmask 255.255.255.0 vlan 1 vlandev igb0"
ifconfig_vlan101="inet 192.168.1.251 netmask 255.255.255.0 vlan 101 vlandev igb0"
ifconfig_vlan102="inet 192.168.2.251 netmask 255.255.255.0 vlan 102 vlandev igb0"
ifconfig_carp0="vhid 1 pass my$ecret 192.168.0.254 netmask 255.255.255.0 advbase 1 advskew 0"
ifconfig_carp1="vhid 2 pass my$ecret 192.168.1.254 netmask 255.255.255.0 advbase 1 advskew 0"
ifconfig_carp2="vhid 3 pass my$ecret 192.168.2.254 netmask 255.255.255.0 advbase 1 advskew 0"
ifconfig_carp3="vhid 4 pass my$ecret 172.16.2.253 netmask 255.255.255.0 advbase 1 advskew 0"

pf_enable="YES"
pf_flags=""
pf_rules="/etc/fw.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pfsync_enable="YES"
pfsync_syncdev="em0"
pfsync_syncpeer="192.168.254.252"
node1# echo net.inet.carp.preempt=1 > /etc/sysctl.conf
node1# sysctl net.inet.carp.preempt=1
node1# ee pf.conf
pass quick on em0 inet proto pfsync from any to any
pass quick on { vlan1 vlan101 vlan102 igb1 } inet proto carp from any to any

Serveur secondaire

node2# more /etc/rc.conf
gateway_enable="YES"

network_interfaces="lo0 igb0 igb1 em0"
ifconfig_igb0="up"
ifconfig_igb1="inet 172.16.2.252 netmask 255.255.255.0"
ifconfig_em0="192.168.254.252 netmask 255.255.255.0"
defaultrouter="172.16.2.254"

cloned_interfaces="vlan1 vlan101 vlan102 carp0 carp1 carp2 carp3"
ifconfig_vlan1="inet 192.168.0.252 netmask 255.255.255.0 vlan 1 vlandev igb0"
ifconfig_vlan101="inet 192.168.1.252 netmask 255.255.255.0 vlan 101 vlandev igb0"
ifconfig_vlan102="inet 192.168.2.252 netmask 255.255.255.0 vlan 102 vlandev igb0"
ifconfig_carp0="vhid 1 pass my$ecret 192.168.0.254 netmask 255.255.255.0 advbase 1 advskew 100"
ifconfig_carp1="vhid 2 pass my$ecret 192.168.1.254 netmask 255.255.255.0 advbase 1 advskew 100"
ifconfig_carp2="vhid 3 pass my$ecret 192.168.2.254 netmask 255.255.255.0 advbase 1 advskew 100"
ifconfig_carp3="vhid 4 pass my$ecret 172.16.2.253 netmask 255.255.255.0 advbase 1 advskew 100"

pf_enable="YES"
pf_flags=""
pf_rules="/etc/fw.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pfsync_enable="YES"
pfsync_syncdev="em0"
pfsync_syncpeer="192.168.254.251"
node2# echo net.inet.carp.preempt=1 > /etc/sysctl.conf
node2# sysctl net.inet.carp.preempt=1
node2# ee pf.conf
pass quick on em0 inet proto pfsync from any to any
pass quick on { vlan1 vlan101 vlan102 igb1 } inet proto carp from any to any

PF : gestion QoS HSFC avec ALTQ

Configuration noyau

# PF SUPPORT
device          pf
device          pfsync
device          pflog
device          carp
options         ALTQ
options         ALTQ_CBQ
options         ALTQ_RED
options         ALTQ_RIO
options         ALTQ_HFSC
options         ALTQ_PRIQ

Configuration ALTQ

altq on igb0 bandwidth 853Kb hfsc queue { net_ack, net_dns, net_ssh, net_web, net_bulk, net_p2p }
queue net_ack bandwidth 30% priority 9 qlimit 500 hfsc (realtime 20%)
queue net_dns bandwidth 5% priority 8 qlimit 500 hfsc (realtime 2%)
queue net_ssh bandwidth 20% priority 7 qlimit 500 hfsc (realtime 20%) { net2_ssh_bulk, net2_ssh_login }
queue net_ssh_bulk bandwidth 50% priority 5 qlimit 500 hfsc
queue net_ssh_login bandwidth 50% priority 6 qlimit 500 hfsc
queue net_web bandwidth 20% priority 6 qlimit 500 hfsc (realtime (20%, 10000, 5%))
queue net_bulk bandwidth 5% priority 4 qlimit 500 hfsc (realtime 2% default, ecn)
queue net_p2p bandwidth 1% priority 1 qlimit 500 hfsc (upperlimit 50%)

Régles de filtrage PF

pass out quick on igb0 inet proto tcp from any to any port 53 flags any queue net_dns
pass out quick on igb0 inet proto udp from any to any port 53 queue net_dns
pass out quick on igb0 inet proto tcp from any to any port 22 flags any queue (net_ssh_bulk, net_ssh_login)
pass out quick on igb0 inet proto tcp from any to any port { 80, 443 } flags any queue net_web
pass out quick on igb0 inet proto tcp from any to any flags any queue (net_bulk, net_ack)
pass out quick on igb0 inet proto udp from any to any port 10000 queue net2_p2p

Attention ! L’option queue, à l’inverse de l’option tag, n’est pas sticky . Le choix de la queue s’appuie donc sur la dernière règle validant le paquet. Si cette dernière ne précise aucune queue, la queue par défaut est donc utilisée. Dans le cas d’une QoS sur les flux FTP, il est nécessaire de spécifier la queue à utiliser par ftp-proxy, par le biais de son option -q.

Pour tester et valider toutes vos règles PF et ALTQ, pftop est d’un grand secours.

FreeBSD : tester une connexion UDP

Sur le serveur :

$ nc -lu 192.168.1.1 1194

Depuis le client (ici externe) :

$ nc -vzu 80.81.80.81 1194

Réseau : monitoring de la bande passante en console

bwm-ng est un outil pour monitorer en console la bande passante de votre réseau. Il est multiplateforme (Linux, BSD, Mac OS X, etc …) d’où son intérêt dans le cas d’une infrastructure exotique.

bwm-ng v0.6 (probing every 0.500s), press 'h' for help
 input: getifaddrs type: rate
 iface                 Rx                   Tx                Total
 ====================================================================
 em0:        1256.49 KB/s          159.00 KB/s         1286.69 KB/s
 em1:        1717.76 KB/s          111.22 KB/s         1749.13 KB/s
 em2:        9946.26 KB/s        37662.34 KB/s        38150.35 KB/s
 em3:       37537.95 KB/s        10023.27 KB/s        38024.49 KB/s
 lo0:           2.54 KB/s            2.54 KB/s            5.08 KB/s
 vlan0:         0.00 KB/s            0.00 KB/s            0.00 KB/s
 vlan1:     37505.46 KB/s         6869.97 KB/s        37949.06 KB/s
 vlan2:        96.75 KB/s         9791.27 KB/s         9875.43 KB/s
 vlan3:         0.23 KB/s            0.08 KB/s            0.31 KB/s
 pflog0:        0.00 KB/s            2.43 KB/s            2.43 KB/s
 tun0:         36.66 KB/s          134.23 KB/s          142.38 KB/s
 --------------------------------------------------------------------
 total:     75565.96 KB/s        38635.92 KB/s       114201.88 KB/s

OpenLDAP 2.4 : réplication d’un annuaire LDAP

Afin de déployer un annuaire LDAP au sein d’une entreprise, j’ai pour habitude d’avoir recours à la réplication d’OpenLDAP (version 2.4) en installant un serveur esclave sur chaque réseau secondaire.

La réplication LDAP a de multiples intérêts :

  • décharger votre serveur maître
  • accélérer les opérations de lecture
  • copier votre annuaire sur chaque esclave
  • déployer votre annuaire complet/en partie sur l’ensemble des réseaux

En cas d’opération d’écriture, le serveur esclave peut indiquer au client LDAP le nom du serveur maître afin d’y soumettre son opération.

La configuration à ajouter dans le fichier slapd.conf au niveau du serveur maître master.my.domain est la suivante :

overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100

Au niveau de l’esclave slave.my.domain, c’est un peu plus long :

syncrepl
rid=1
provider=ldap://master.my.domain
type=refreshAndPersist
searchbase="dc=my,dc=domain"
scope=sub
schemachecking=off
bindmethod=simple
binddn="cn=repl,dc=my,dc=domain"
credentials=mypa$$w0rd
starttls=yestls_key=/etc/openldap/my_domain.key
tls_reqcert=never
updateref ldap://master.my.domain/

Un identifiant rid distinct est à spécifier pour chaque esclave. La réplication est ici du type refreshAndPersist : à chaque modification de l’annuaire, les esclaves se synchronisent. Il est possible de limite cette synchronisation à un intervalle de temps défini en utilisant le type refresh. L’option searchbase spécifie le DN où débute la réplication : l’annuaire peut être alors répliqué qu’en partie et non en totalité. Reste ensuite la déclaration du compte LDAP utilisé pour la connexion au maître (je vous conseille fortement une connexion par TLS). Côté maître, il faut s’assurer que les ACL permettent l’accès aux données à répliquer. Enfin, la dernière option permet de rediriger les clients sur le maître en cas d’opération d’écriture. Ce n’est pas obligatoire et permet de limiter l’accès en lecture seule à vos clients LDAP.

Pour les options avancées, je vous invite à consulter la documentation à ce sujet.

Haut de page