Die Fehlermeldung erwähnt, MASQUERADE
aber die Ursache Ihres Problems ist $atp
. Es gibt einen Tippfehler. Dein Befehl
sudo iptables --table nat --append POSTROUTING --out-interface $atp -j MASQUERADE
ist wirklich
sudo iptables --table nat --append POSTROUTING --out-interface -j MASQUERADE
denn du definierst $apt=eth0
dann aber nicht Anführungszeichen $atp
(nicht $apt
einen Tippfehler!), was sich auf nicht zitierte leere Zeichenfolge auflöst und verschwindet.
Der Effekt -j
wird als Schnittstellenname verwendet, MASQUERADE
erscheint also als eigenständiges Argument und verhält sich nicht so, wie -j MASQUERADE
es normalerweise der Fall wäre.
Wenn Sie eine bewährte Methode befolgen, um Variablen zu zitieren, --out-interface "$atp"
würde Empty interface is likely to be undesired
dies Ihre Aufmerksamkeit auf das "$atp"
Argument lenken, in dem das eigentliche Problem liegt. Eine leere Zeichenfolge in Anführungszeichen erzeugt ein leeres Argument für den Befehl ( iptables
in diesem Fall wird das Aufheben der sudo
Seite hier gerechtfertigt). Wenn die leere Zeichenfolge unerwartet ist, kann der Befehl entsprechend reagieren und dies ist gut.
Eine nicht zitierte leere Zeichenfolge verschwindet einfach. Dies "verschiebt" die folgenden Argumente. Sie iptables
wussten nie, dass etwas zwischen --out-interface
und war -j
. Der Befehlszeilen-Parser wird getäuscht und der Befehl kann sich nur über ein anderes Argument beschweren, wie MASQUERADE
in Ihrem Fall. Die Alternative ist schlimmer: Wenn diese "verschobenen" Argumente eine korrekte Fortsetzung bilden, wird der Befehl mit dem Array von Optionen ausgeführt, die Sie niemals an ihn übergeben wollten. Das kann schlecht sein; mit sudo
diesem kann sehr schlecht sein.
Die Lektion lautet: Zitieren Sie Ihre Variablen.