Voici la partie 2:
J'ai créé un Alias pour la Neufbox: NB6_box_50
La règle de NAT Port Forward:interface: | OPT1 | | Redirect target IP | 127.0.0.1 |
protocol: | TCP/UDP | | Redirect target Port | 89 |
Source: | NB6_box_50 | | Description | Redirect to local nginx changing ip_dhcp |
Source Port Range: | Any | | NAT Reflexion | Disabled |
Destination: | invert Match, OPT1 Address | | Filter Rule association | Rule NAT Redirect to local nginx changing ip_dhcp |
Destination Port Range | HTTP |
[
Le serveur Nginx:Nginx est déjà présent sur pfSense 2.4.4, il suffit de créé une nouvelle instance qui sera démarrée par un petit script (point suivant) au démarrage du pfSense.
Configuration du serveur Nginx:
Fichier de configuration:
/usr/local/etc/nginx/my_nginx.conffichier my_nginx.conf
#user nobody;
worker_processes 1;
pid /var/run/my_nginx.pid;
load_module /usr/local/libexec/nginx/ndk_http_module.so;
load_module /usr/local/libexec/nginx/ngx_http_lua_module.so;
# This default error log path is compiled-in to make sure configuration parsing
# errors are logged somewhere, especially during unattended boot when stderr
# isn't normally logged anywhere. This path will be touched on every nginx
# start regardless of error log location configured here. See
# https://trac.nginx.org/nginx/ticket/147 for more info.
#
error_log /usr/local/my_nginx/logs/system_error.log;
#
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /usr/local/my_nginx/logs/global_access.log main;
error_log /usr/local/my_nginx/logs/global_error.log;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
include /usr/local/my_nginx/mvneta2_ip;
listen 89;
server_name localhost;
#charset koi8-r;
access_log /usr/local/my_nginx/logs/other_access.log main;
error_log /usr/local/my_nginx/logs/other_error.log;
rewrite_log on;
root /usr/local/my_nginx/www;
location / {
resolver <your DNS>;
add_header X-debug-message "other-site" always;
proxy_pass http://$http_host$uri$is_args$args;
}
}
server {
include /usr/local/my_nginx/mvneta2_ip;
listen 89;
server_name *.neufbox.sfr.net;
access_log /usr/local/my_nginx/logs/neufbox_access.log main;
error_log /usr/local/my_nginx/logs/neufbox_error.log;
root /usr/local/my_nginx/www;
location / {
set $xdebug_ip_dhcp "no";
set $xdebug_new_uri_ip "";
set $xdebug_old_uri_ip "";
if ($arg_ip_dhcp != "") {
access_by_lua_block {
local args, err = ngx.req.get_uri_args()
local wan_ip = ngx.var.xdebug_wan_ip
ngx.var.xdebug_old_uri_ip = args.ip_dhcp
args.ip_dhcp = wan_ip
ngx.var.xdebug_new_uri_ip = wan_ip
ngx.req.set_uri_args(args)
}
set $xdebug_ip_dhcp "yes";
}
add_header X-debug-message "ip_dhcp present: $xdebug_ip_dhcp, old ip_dhcp: $xdebug_old_uri_ip, new ip_dhcp: $xdebug_new_uri_ip" always;
proxy_set_header Accept-Encoding "";
resolver <your DNS> ipv6=off;
proxy_pass http://$http_host$uri$is_args$args;
sub_filter_types application/xml;
sub_filter_once off;
sub_filter residential.p-cscf.sfr.net</proxy> sip.parisdmz.lan</proxy>;
}
}
Petites explications :Le serveur écoute sur le port 89 (conforme à notre règle de NAT).
Il y a deux serveurs virtuels : un pour les hostnames *.neufbox.sfr.net et un pour le reste.
Le serveur normal Il va tout simplement faire un proxy_pass (forward proxy) sans rien changer.
J'ai ajouté une variable de header à des fins de debug uniquement (le add_header), vous pouvez le supprimer…
Le serveur *.neufbox.sfr.net:J'utilise le module http_lua pour faire la réécriture. C'est plus simple à lire (de mon point de vue)
J'inclus un fichier contenant l'IP Publique WAN du pfSense (voir plus loin):
include /usr/local/my_nginx/mvneta2_ip;Je créé quelques variables:
$xdebug_ip_dhcp "no"; (à des fins de debug)
$xdebug_new_uri_ip ""; (va contenir l'IP publique WAN du pfsense)
set $xdebug_old_uri_ip ""; (à des fins de debug)Si j'ai un paramètre ip_dhcp dans l'uri alors je réécrit l'uri:
En remplaçant la valeur avec cette prise dans le fichier mvneta2_ip.
Une fois terminer, je proxy_pass la requête.
J'ai ajouté une modification de la réponse pour la téléphonie (voir la section Téléphonie).
Le script de démarrage nginx et de récupération de l'IP Publique WAN:
Fichier start_my_nginx.sh:
#!/bin/sh
#Sleep a little
sleep 5
# get the wan ip address in a file
ifconfig mvneta2 | grep "inet " | awk -F'[: ]' '{print "set $xdebug_wan_ip "$2";"}' > /usr/local/my_nginx/mvneta2_ip
#sleep a little
sleep 5
#check if my_nginx is already running if so kill it and restart
if [ -e /var/run/my_nginx.pid ]
then
echo "my_nginx is running so kill it..."
pkill -F /var/run/my_nginx.pid
fi
echo "(re)start my_nginx..."
/usr/local/sbin/nginx -c /usr/local/etc/nginx/my_nginx.conf
Explications:Je récupère l'adresse IPv4 de l'interface mvneta2 via un ifconfig.
Je stocke dans un fichier nommé mvneta2_ip, la commande :
Set $xdebug_wan_ip "<IP récupérée>";
Ce fichier est inclus dans la configuration de mon nginx (voir ci-avant).
Puis je regarde si par hasard mon nginx tourne déjà.
Si c'est le cas je le kill et je le relance.
Sinon je le lance tout seul.
NOTE IMPORTANTE: Pour pouvoir executé des script de démarrage sous pfSense en automatique il faut ajouté le package ShellCmd. Puis le configurer:
"Services"->"ShellCmd":
- Command: /usr/local/my_nginx/start_my_nginx.sh
- ShellCmd Type: shellcmd
- Description: Start the Local Nginx redirector for Neufbox
A ce stade, la neufbox doit être opérationnelle pour l'internet IPv4 et IPv6.
5.2.Configuration Téléphonie pour la neufboxIl faut installer le package siproxd, ave la configuration suivante:
Enable siporxyd: Flagged
Inbound Interface: OPT1
Outbound Interface: WAN
Listening port: 5060
Maintenant il faut savoir que la neufbox va s'enregistrer directement sur le serveur SIP de SFR. Cette configuration lui est fournie par le fichier voip2.xml. Dans mon cas le serveur SIP est: residential.p-cscf.sfr.net.
Pour utiliser notre proxy, il faut modifier la réponse à la requête http du fichier voip2.xml, en modifiant la ligne qui contient le tag xml proxy. C'est la raison de la présence des lignes sub_filter du my-nginx.conf.
Je remplace tout simplement ce hostname par le mien.
Et c'est tout.
Attention je n'ai pas l'utilité de la téléphonie, donc je ne suis pas aller plus loin dans la configuration. En tout état de cause, la box récupère bien une téléphonie OK avec cette configuration.
5.3.Configuration Télévision pour la neufboxPour la télévision il va falloir utiliser le serveur proxy IGMP du pfsense.
La neufbox récupère les informations pour la télévision dans le fichier : cfgnb4tvservices_201702141200.xml.
Ce fichier contient tous les networks et hostnames nécessaire à la configuration du proxy igmp.
En premier, j'ai créé un alias : TV_SFR qui contient la liste des réseaux de la partie <igmp-src-list> du fichier.
J'ai activer le proxy IGMP avec la configuration suivante:
Interface : WAN
Type: UpStream
Threshold : 1
Networks : mettre toutes les entrées de la section <igmp-src-list> (malheureusement ici on ne peut pas utiliser l'alias).
Interface : OPT1
Type: DownStream
Threshold: 1
Networks: 192.168.50.0/24
Règles de Firewall pour l'igmp:Action: Pass
Interface: WAN
Address Family: IPv4
Protocol: IGMP
Source: Any
Destination: Network, 224.0.0.0/4
Advanced Options: Allow IP options flagged
Action: Pass
Interface: WAN
Address Family: IPv4
Protocol: UDP
Source: Single Host or Alias, TV_SFR
Destination: Network, 224.0.0.0/4
Advanced Options: Allow IP options flagged
Action: Pass
Interface: OPT1
Address Family: IPv4
Protocol: IGMP
Source: OPT1 net
Destination: Any
Advanced Options: Allow IP options flagged
A ce stade la télévision doit être opérationnelle sur le STB branché derrière la neufbox.
5.4 Configuration VOD pour la neufbox:Comme je l'ai indiqué précédemment, le problème ici c'est que le protocole de flux vidéo est UDP et que la connexion est initiée par le serveur (qui dépend tu replay ou de la vod choisie).
Le protocole de demande de vidéo est standard : RTSP.
Les informations sur les serveurs de VOD sont incluses dans le fichier: cfgnb4tvservices_201702141200.xml.
Dans un premier temps, je créé un alias pour les serveurs de VOD: REPLAY_SFR
Je créé une règle de NAT Port Forward:
interface: | WAN | | Redirect target IP | 192.168.50.203 |
protocol: | UDP | | Redirect target Port | 8000 |
Source: | Any | | Description | VOD SFR |
Source Port Range: | Any | | NAT Reflexion | Use System Default |
Destination: | Wan Address | | Filter Rule association | Rule NAT VOD SFR |
Destination Port Range | From:8000 To 8999 |
Attention: ici l'adresse de redirect est l'adresse fixe (static mapping) de la neufbox.
Ici je pense que j'ai encore un petit souci, de temps en temps mon STB me donne un code d'erreur AG2 ou AG3, mais en faisant plusieurs tentatives cela passe quand même. Il faut que j'étudie cela. Je pense que cela vient du range UDP… à voir.
Et voilà….
Je suis passé rapidement sur plusieurs points qui feront surement l'objet d'un update de ce post. Entre autre il s'agit essentiellement de problématiques de DNS
Bon AM.