web-dev-qa-db-fra.com

NAT utiliser iptables sous Ubuntu 16.04 ne fonctionne pas

J'avais l'habitude d'utiliser Ubuntu 14.04 trusty pour notre serveur NAT (construit sur Google Cloud Platform), mais récemment, j'ai essayé d'utiliser Ubuntu 16.04 xenial.

J'ai configuré parfaitement comme je l'ai fait dans 14.04, mais cela NE FONCTIONNE PAS en tant que serveur NAT. La seule différence réside dans les versions du système d'exploitation et des bibliothèques.

La configuration est assez simple, décrite dans la documentation de Google:

  1. Autoriser le transfert IP Sudo sysctl -w net.ipv4.ip_forward=1 et
  2. Configurez le iptables Sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

https://cloud.google.com/compute/docs/networking#natgateway

C'est tout. Dans Ubuntu 14.04, cela a fonctionné. Dans Ubuntu 16.04, ce n'était pas le cas.

Est-ce que quelqu'un peut m'aider à le configurer correctement? Je n'ai aucune idée de ce qui me manque ni de quel point je devrais vérifier.

Merci d'avance!


Voici les informations supplémentaires

Dans Ubuntu 14.04

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"
$
$ Sudo dpkg -l iptables
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name             Version       Architecture  Description
+++-================-=============-=============-=====================================
ii  iptables         1.4.21-1ubunt AMD64         administration tools for packet filte
$
$ Sudo iptables -v -x -n -L
Chain INPUT (policy ACCEPT 5898 packets, 944634 bytes)
    pkts      bytes target     prot opt in     out     source               destination
    5898   944634 sshguard   all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 40 packets, 3444 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 5658 packets, 526971 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain sshguard (1 references)
    pkts      bytes target     prot opt in     out     source               destination
$
$ Sudo iptables -t nat -v -x -n -L
Chain PREROUTING (policy ACCEPT 18 packets, 3471 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 14 packets, 3231 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 797 packets, 48528 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination
     801    48768 MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0
$
$ ifconfig
eth0      Link encap:Ethernet  HWaddr 12:34:56:78:90:ab
          inet addr:10.146.0.3  Bcast:10.146.0.3  Mask:255.255.255.255
          inet6 addr: fe80::4001:aff:fe92:3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:6379 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6099 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1080290 (1.0 MB)  TX bytes:644140 (644.1 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
$
$ Sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

Dans Ubuntu 16.04

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
$
$ Sudo dpkg -l iptables
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name             Version       Architecture  Description
+++-================-=============-=============-=====================================
ii  iptables         1.6.0-2ubuntu AMD64         administration tools for packet filte
$
$ Sudo iptables -L -v -x -n
Chain INPUT (policy ACCEPT 474 packets, 44440 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination
      16      960 ACCEPT     all  --  *      ens4    0.0.0.0/0            0.0.0.0/0
       0        0 ACCEPT     all  --  ens4   *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT 355 packets, 38412 bytes)
    pkts      bytes target     prot opt in     out     source               destination
$
$ Sudo iptables -t nat -v -x -n -L
Chain PREROUTING (policy ACCEPT 9 packets, 3013 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 6 packets, 2833 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 756 packets, 46153 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 759 packets, 46333 bytes)
    pkts      bytes target     prot opt in     out     source               destination
       0        0 MASQUERADE  all  --  *      ens4    0.0.0.0/0            0.0.0.0/0
$
$ Sudo ifconfig
ens4      Link encap:Ethernet  HWaddr 12:34:56:78:90:ab
          inet addr:10.146.0.4  Bcast:10.146.0.4  Mask:255.255.255.255
          inet6 addr: fe80::4001:aff:fe92:4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:6274 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6064 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1043141 (1.0 MB)  TX bytes:641746 (641.7 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
$
$ Sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
5
Shinichi TAMURA

Je crois que cela a à voir avec un changement systemd-networkd. J'essayais de faire quelque chose de similaire récemment sur Ubuntu 16.04 et suis tombé sur une page Web expliquant que le transfert doit être activé sur l'interface elle-même. Je suis incapable de trouver cette page Web pour le moment, et je ne sais pas quand cela a été changé.

Donc, cela permettra le transfert, mais en plus de cela, il doit être activé sur l'interface

Sudo sysctl -w net.ipv4.ip_forward=1

Pour voir si le transfert est activé ou non, lancez ceci:

sysctl -a | grep forwarding

Pour activer le transfert sur eth0, lancez ceci:

Sudo sysctl net.ipv4.conf.eth0.forwarding=1

Je crois avoir lu que l'activation du transfert sur une interface définira net.ipv4.ip_forward sur 1, de sorte que la première étape pourrait ne pas être nécessaire. Si tel est le cas, la désactivation du transfert à nouveau sur l'interface ne ramènera pas net.ipv4.ip_forward à 0. Du moins, c'est ce dont je me souviens.

2
Tobias

Assurez-vous que vous avez configuré le pare-feu pour autoriser le transfert du trafic. Il est possible que le basculement sur Ubuntu 16 ait préconfiguré le pare-feu sur une stratégie de refus implicite pour le transfert de paquets

Sudo iptables -A FORWARD -o eth0 -j ACCEPT
Sudo iptables -A FORWARD -m state \
--state ESTABLISHED,RELATED -i eth0 -j ACCEPT

Assurez-vous également que vous avez ajouté votre règle NAT à exécuter après le redémarrage. Ajoutez la même règle à /etc/rc.local

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
1
Gansheim