Ceci est une ancienne révision du document !
On va utiliser un playbook pour exécuter toutes les tâches. C'est un fichier qui contient toutes les actions à effectuer (un peu comme un script shell).
Créez un fichier access_point.yml
nano access_point.yml
Placez-y le code ci-dessous (ce code déploie le projet avec une adresse IPv4 classe A)
---
- hosts: bpi
vars:
"wifi_driver": "nl80211"
"wlan_interface": "wlx503eaa3d7d6c"
ansible_connection: ssh
ansible_ssh_user: user
ansible_ssh_pass: bonjour
ansible_become_method: su
ansible_become_user: root
ansible_become_pass: bonjour
ansible_become: yes
tasks:
- name: Suppression du fichier sources.list
file:
path: /etc/apt/sources.list
state: absent
- name: Création du fichier sources.list
copy:
content: "# deb http://ftp.fr.debian.org/debian/ stretch main\n\ndeb http://ftp.fr.debian.org/debian/ stretch main contrib non-free\ndeb-src http://ftp.fr.debian.org/debian/ stretch main contrib non-free\n\ndeb http://security.debian.org/debian-security stretch/updates main contrib non-free\ndeb-src http://security.debian.org/debian-security stretch/updates main contrib non-free\n\n# stretch-updates, previously known as 'volatile'\ndeb http://ftp.fr.debian.org/debian/ stretch-updates main contrib non-free\ndeb-src http://ftp.fr.debian.org/debian/ stretch-updates main contrib non-free"
dest: /etc/apt/sources.list
force: no
- name: Installation du paquet aptitude
apt: pkg=aptitude state=installed update_cache=true
- name: Mise à jour de la liste des paquets
apt: update_cache=yes
- name: Mise à jour des paquets
apt: upgrade=yes
- name: Installation du paquet wireless-tools
apt: pkg=wireless-tools state=installed update_cache=true
- name: Installation du paquet ntp
apt: pkg=ntp state=installed update_cache=true
- name: Installation du paquet wpasupplicant
apt: pkg=wpasupplicant state=installed update_cache=true
- name: Installation du paquet dnsutils
apt: pkg=dnsutils state=installed update_cache=true
- name: Installation du paquet hostapd
apt: pkg=hostapd state=installed update_cache=true
- name: Suppression du fichier de configuration /etc/hostapd/hostapd.conf
file:
path: /etc/hostapd/hostapd.conf
state: absent
- name: Création du fichier de configuration /etc/hostapd/hostapd.conf
copy:
content: "interface={{ wlan_interface }}\nssid=prxc\ndriver={{ wifi_driver }}\nchannel=6\nhw_mode=g\nwpa=2\nwpa_passphrase=mypassphrase\nwpa_key_mgmt=WPA-PSK\nwpa_pairwise=CCMP\nrsn_pairwise=CCMP"
dest: /etc/hostapd/hostapd.conf
force: no
- name: Install Tor
apt: pkg=tor state=installed update_cache=true
- name: Suppression du fichier de configuration /etc/tor/torrc
file:
path: /etc/tor/torrc
state: absent
- name: Création du fichier de configuration /etc/tor/torrc
copy:
content: "VirtualAddrNetworkIPv4 10.192.0.0/10\nAutomapHostsOnResolve 1\nTransPort 9040\nDNSPort 5353\nTransListenAddress 10.255.255.254\nDNSListenAddress 10.255.255.254"
dest: /etc/tor/torrc
force: no
- name: Suppression du fichier de configuration /etc/network/interfaces
file:
path: /etc/network/interfaces
state: absent
- name: Création du fichier de configuration /etc/network/interfaces
copy:
content: "source /etc/network/interfaces.d/*\n# The loopback network interface\nauto lo\niface lo inet loopback\n\n# The primary network interface\nallow-hotplug eth0\niface eth0 inet dhcp\n# This is an autoconfigured IPv6 interface\niface eth0 inet6 auto\n\nauto wlx503eaa3d7d6c\niface wlx503eaa3d7d6c inet static\nhostapd /etc/hostapd/hostapd.conf\naddress 10.255.255.254\nnetmask 255.0.0.0\n"
dest: /etc/network/interfaces
force: no
- name: Installation du paquet dnsmasq
apt: pkg=dnsmasq state=installed update_cache=true
- name: Suppression du fichier de configuration /etc/dnsmasq.conf
file:
path: /etc/dnsmasq.conf
state: absent
- name: Création du fichier de configuration /etc/dnsmasq.conf
copy:
content: "interface={{ wlan_interface }}\nno-dhcp-interface=lo, eth0\ndhcp-range=10.255.255.10,10.255.255.50,255.0.0.0,12h\nport = 0\ndhcp-option=6,10.255.255.254\n"
dest: /etc/dnsmasq.conf
force: no
- name: Création du script iptables
copy:
content: "#!/bin/sh\n#Variables\n_trans_port=\"9040\"\n_dns_port=\"5353\"\n_interface_wifi=\"wlx503eaa3d7d6c\"\n_tor_uid=`id -u debian-tor`\n_router=\"10.255.255.254\" #Adresse du router(adresse de la machine ayant le point d'accès wifi)\n_reseau_wifi=\"10.0.0.0/8\"\n_unreachable=\"192.168.16.20/24\" #Adresse dont on empêche l'accès\n_eth0_ip=`ip -4 addr show eth0 | grep -oP \'(?<=inet\\s)\\d+(\\.\\d+){3}\'`\n\n#On efface toutes les règles iptables\niptables -F\niptables -X\niptables -t nat -F\niptables -t nat -X\niptables -t mangle -F\niptables -t mangle -X\n\n#On met les policy\niptables -P INPUT DROP\niptables -P FORWARD DROP\niptables -P OUTPUT DROP\nip6tables -P INPUT DROP\nip6tables -P FORWARD DROP\nip6tables -P OUTPUT DROP\n\n#On redirige le traffic TCP vers Tor\niptables -t nat -A PREROUTING -i $_interface_wifi -p tcp --syn -j REDIRECT --to-ports $_trans_port\n#On redirige les requêtes DNS vers Tor\niptables -t nat -A PREROUTING -i $_interface_wifi -p udp --dport 53 -j REDIRECT --to-ports $_dns_port\n\n#On log le trafic entrant\niptables -A INPUT -i $_interface_wifi -m state --state NEW -j LOG --log-prefix \"New input connection: \"\n#On autorise les requêtes DHCP à entrer\niptables -A INPUT -i $_interface_wifi -p udp --dport 67:68 --sport 67:68 -j ACCEPT\n#On autorise les connexion SSH\niptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -j ACCEPT\n#On autorise les connexions déja établies\niptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT\n#On autorise la boucle locale\niptables -A INPUT -i lo -j ACCEPT\n#On autorise les requêtes vers le routeur et le port DNS\niptables -A INPUT -d $_router -i $_interface_wifi -p udp -m udp --dport $_dns_port -j ACCEPT\n#On autorise les requêtes vers le routeur pour le traffic TCP\niptables -A INPUT -d $_router -i $_interface_wifi -p tcp -m tcp --dport $_trans_port --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT\n\n#On log le trafic sortant\niptables -I OUTPUT -m owner --uid-owner $_tor_uid -j LOG --log-prefix \"New output connection: \"\n#On drop le paquet si il n est pas dans l état new, established, ou related\niptables -A OUTPUT -m state --state INVALID -j DROP\n#On autorise ls connexions déja établies\niptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT\n#On autorise les requêtes DHCP à sortir\niptables -A OUTPUT -o $_interface_wifi -p udp --dport 67:68 --sport 67:68 -j ACCEPT\n#On autorise le traffic issu de la carte\niptables -A OUTPUT ! -s $_reseau_wifi -m owner --uid-owner 0 -j ACCEPT"
dest: /root/iptables.sh
force: no
group: sys
owner: root
mode: 0777
- name: Création du fichier service iptables
copy:
content: "[Unit]\nDescription=Setup firewall\nAfter=network.target local-fs.target\n[Service]\nRemainAfterExit=true\nExecStart=/root/iptables.sh\n[Install]\nWantedBy=multi-user.target"
dest: /etc/systemd/system/iptables.service
force: no
- name: Activation du service iptables
systemd:
name: iptables
enabled: yes
masked: no
- name: Activation du forwarding IPv4
lineinfile:
dest: /etc/sysctl.conf
regexp: '^#\s*net.ipv4.ip_forward=1.*$'
line: 'net.ipv4.ip_forward=1'
backrefs: yes
- name: Redémarrage des hosts
become: yes
shell: sleep 2 && /sbin/shutdown -r now "Ansible system package upgraded"
async: 1
poll: 0
On exécute ensuite le fichier avec la commande suivante
ansible-playbook access_point.yml
Chaque rôle peut être exécuté en l'appelant. Il contient une suite d'instructions, un peu comme une fonction d'un programme.
On crée l'arborescence suivante
Le fichier ansible.retry est créé automatiquement et ne doit donc pas être créé par vous.
.
├── access_point.retry
├── access_point.yml
└── roles
├── configure_interfaces
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
├── dnsmasq
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
Etc
Le dossier roles contient les dossiers suivants :
Qui contiennent eux-mêmes les dossiers suivants :
Nous n'utilisons que le dossier tasks, la création des autres dossiers est donc facultative.
À la racine, le fichier access_point.yml contient le code suivant
---
- hosts: bpi
vars:
"wifi_driver": "nl80211"
"wlan_interface": "wlx503eaa3d7d6c"
ansible_connection: ssh
ansible_ssh_user: user
ansible_ssh_pass: bonjour
ansible_become_method: su
ansible_become_user: root
ansible_become_pass: bonjour
ansible_become: yes
roles:
- role: update_upgrade
- role: wifi_tools
- role: hostapd
- role: tor
- role: configure_interfaces
- role: dnsmasq
- role: iptables
- role: ipv4_forwarding
- role: reboot
On va maintenant créer un fichier main.yml dans le dossier tasks de chacun des dossiers créés dans rôle. C'est à dire :
Comme ceci :
└── roles
├── configure_interfaces
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ └── vars
Voici le contenu de chaque fichier main.yml de chaque dossier
On reprend simplement le code du playbook du début
---
- name: Suppression du fichier de configuration /etc/network/interfaces
file:
path: /etc/network/interfaces
state: absent
- name: Création du fichier de configuration /etc/network/interfaces
copy:
content: "source /etc/network/interfaces.d/*\n# The loopback network interface\nauto lo\niface lo inet loopback\n\n# The primary network interface\nallow-hotplug eth0\niface eth0 inet dhcp\n# This is an autoconfigured IPv6 interface\niface eth0 inet6 auto\n\nauto wlx503eaa3d7d6c\niface wlx503eaa3d7d6c inet static\nhostapd /etc/hostapd/hostapd.conf\naddress 10.255.255.254\nnetmask 255.0.0.0\n"
dest: /etc/network/interfaces
force: no
---
- name: Installation du paquet hostapd
apt: pkg=hostapd state=installed update_cache=true
- name: Suppression du fichier de configuration /etc/hostapd/hostapd.conf
file:
path: /etc/hostapd/hostapd.conf
state: absent
- name: Création du fichier de configuration /etc/hostapd/hostapd.conf
copy:
content: "interface={{ wlan_interface }}\nssid=prxc\ndriver={{ wifi_driver }}\nchannel=6\nhw_mode=g\nwpa=2\nwpa_passphrase=mypassphrase\nwpa_key_mgmt=WPA-PSK\nwpa_pairwise=CCMP\nrsn_pairwise=CCMP"
dest: /etc/hostapd/hostapd.conf
force: no
Pour logger, on peut ajouter les options suivantes au fichier hostapd.conf:
logger_syslog=-1 logger_syslog_level=1 logger_stdout=-1 logger_stdout_level=2
---
- name: Activation du forwarding IPv4
lineinfile:
dest: /etc/sysctl.conf
regexp: '^#\s*net.ipv4.ip_forward=1.*$'
line: 'net.ipv4.ip_forward=1'
backrefs: yes
---
- name: Install Tor
apt: pkg=tor state=installed update_cache=true
- name: Suppression du fichier de configuration /etc/tor/torrc
file:
path: /etc/tor/torrc
state: absent
- name: Création du fichier de configuration /etc/tor/torrc
copy:
content: "VirtualAddrNetworkIPv4 10.192.0.0/10\nAutomapHostsOnResolve 1\nTransPort 9040\nDNSPort 5353\nTransListenAddress 10.255.255.254\nDNSListenAddress 10.255.255.254"
dest: /etc/tor/torrc
force: no
--- - name: Installation du paquet wireless-tools apt: pkg=wireless-tools state=installed update_cache=true - name: Installation du paquet wpasupplicant apt: pkg=wpasupplicant state=installed update_cache=true - name: Installation du paquet dnsutils apt: pkg=dnsutils state=installed update_cache=true
---
- name: Installation du paquet dnsmasq
apt: pkg=dnsmasq state=installed update_cache=true
- name: Suppression du fichier de configuration /etc/dnsmasq.conf
file:
path: /etc/dnsmasq.conf
state: absent
- name: Création du fichier de configuration /etc/dnsmasq.conf
copy:
content: "interface={{ wlan_interface }}\nno-dhcp-interface=lo, eth0\ndhcp-range=10.255.255.10,10.255.255.50,255.0.0.0,12h\nport = 0\ndhcp-option=6,10.255.255.254\n"
dest: /etc/dnsmasq.conf
force: no
---
- name: Création du script iptables
copy:
content: "#!/bin/sh\n#Variables\n_trans_port=\"9040\"\n_dns_port=\"5353\"\n_interface_wifi=\"wlx503eaa3d7d6c\"\n_tor_uid=`id -u debian-tor`\n_router=\"10.255.255.254\" #Adresse du router(adresse de la machine ayant le point d'accès wifi)\n_reseau_wifi=\"10.0.0.0/8\"\n_unreachable=\"192.168.16.20/24\" #Adresse dont on empêche l'accès\n_eth0_ip=`ip -4 addr show eth0 | grep -oP \'(?<=inet\\s)\\d+(\\.\\d+){3}\'`\n\n#On efface toutes les règles iptables\niptables -F\niptables -X\niptables -t nat -F\niptables -t nat -X\niptables -t mangle -F\niptables -t mangle -X\n\n#On met les policy\niptables -P INPUT DROP\niptables -P FORWARD DROP\niptables -P OUTPUT DROP\nip6tables -P INPUT DROP\nip6tables -P FORWARD DROP\nip6tables -P OUTPUT DROP\n\n#On redirige le traffic TCP vers Tor\niptables -t nat -A PREROUTING -i $_interface_wifi -p tcp --syn -j REDIRECT --to-ports $_trans_port\n#On redirige les requêtes DNS vers Tor\niptables -t nat -A PREROUTING -i $_interface_wifi -p udp --dport 53 -j REDIRECT --to-ports $_dns_port\n\n#On log le trafic entrant\niptables -A INPUT -i $_interface_wifi -m state --state NEW -j LOG --log-prefix \"New input connection: \"\n#On autorise les requêtes DHCP à entrer\niptables -A INPUT -i $_interface_wifi -p udp --dport 67:68 --sport 67:68 -j ACCEPT\n#On autorise les connexion SSH\niptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -j ACCEPT\n#On autorise les connexions déja établies\niptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT\n#On autorise la boucle locale\niptables -A INPUT -i lo -j ACCEPT\n#On autorise les requêtes vers le routeur et le port DNS\niptables -A INPUT -d $_router -i $_interface_wifi -p udp -m udp --dport $_dns_port -j ACCEPT\n#On autorise les requêtes vers le routeur pour le traffic TCP\niptables -A INPUT -d $_router -i $_interface_wifi -p tcp -m tcp --dport $_trans_port --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT\n\n#On log le trafic sortant\niptables -I OUTPUT -m owner --uid-owner $_tor_uid -j LOG --log-prefix \"New output connection: \"\n#On drop le paquet si il n est pas dans l état new, established, ou related\niptables -A OUTPUT -m state --state INVALID -j DROP\n#On autorise ls connexions déja établies\niptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT\n#On autorise les requêtes DHCP à sortir\niptables -A OUTPUT -o $_interface_wifi -p udp --dport 67:68 --sport 67:68 -j ACCEPT\n#On autorise le traffic issu de la carte\niptables -A OUTPUT ! -s $_reseau_wifi -m owner --uid-owner 0 -j ACCEPT"
dest: /root/iptables.sh
force: no
group: sys
owner: root
mode: 0777
- name: Création du fichier service iptables
copy:
content: "[Unit]\nDescription=Setup firewall\nAfter=network.target local-fs.target\n[Service]\nRemainAfterExit=true\nExecStart=/root/iptables.sh\n[Install]\nWantedBy=multi-user.target"
dest: /etc/systemd/system/iptables.service
force: no
- name: Activation du service iptables
systemd:
name: iptables
enabled: yes
masked: no
--- - name: Redémarrage des hosts become: yes shell: sleep 2 && /sbin/shutdown -r now "Ansible system package upgraded" async: 1 poll: 0
---
- name: Installation du paquet ntp
apt: pkg=ntp state=installed update_cache=true
- name: Suppression du fichier de configuration /etc/ntp.conf
file:
path: /etc/ntp.conf
state: absent
- name: Création du fichier de configuration /etc/ntp.conf
copy:
content: "server ntp.ubuntu.com prefer\nserver ntp2.jussieu.fr\nserver 0.fr.pool.ntp.org\nserver 0.europe.pool.ntp.org"
dest: /etc/ntp.conf
force: no
---
- name: Suppression du fichier sources.list
file:
path: /etc/apt/sources.list
state: absent
- name: Création du fichier sources.list
copy:
content: "# deb http://ftp.fr.debian.org/debian/ stretch main\n\ndeb http://ftp.fr.debian.org/debian/ stretch main contrib non-free\ndeb-src http://ftp.fr.debian.org/debian/ stretch main contrib non-free\n\ndeb http://security.debian.org/debian-security stretch/updates main contrib non-free\ndeb-src http://security.debian.org/debian-security stretch/updates main contrib non-free\n\n# stretch-updates, previously known as 'volatile'\ndeb http://ftp.fr.debian.org/debian/ stretch-updates main contrib non-free\ndeb-src http://ftp.fr.debian.org/debian/ stretch-updates main contrib non-free"
dest: /etc/apt/sources.list
force: no
- name: Installation du paquet aptitude
apt: pkg=aptitude state=installed update_cache=true
- name: Mise à jour de la liste des paquets
apt: update_cache=yes
- name: Mise à jour des paquets
apt: upgrade=yes
Puis comme précédemment, on exécute le fichier ansible
ansible-playbook access_point.yml