В сообщении об ошибке упоминается, MASQUERADE
но корень вашей проблемы $atp
. Есть опечатка. Ваша команда
sudo iptables --table nat --append POSTROUTING --out-interface $atp -j MASQUERADE
действительно
sudo iptables --table nat --append POSTROUTING --out-interface -j MASQUERADE
потому что вы определяете, $apt=eth0
но затем вы используете без кавычек $atp
(не $apt
опечатка!), которая преобразуется в пустую строку без кавычек и исчезает.
По сути -j
, берется как имя интерфейса, поэтому MASQUERADE
отображается как отдельный аргумент и не ведет себя так, как -j MASQUERADE
обычно.
Если бы вы следовали передовой практике для цитирования переменных, вы получите --out-interface "$atp"
результат, Empty interface is likely to be undesired
который привлек бы ваше внимание к "$atp"
аргументу, где настоящая проблема. Пустая строка, заключенная в кавычки, генерирует для команды пустой аргумент ( iptables
в этом случае откладывание в sudo
сторону здесь оправдано), поэтому, если пустая строка является неожиданной, команда может реагировать соответствующим образом, и это хорошо.
Пустая строка без кавычек просто исчезает. Это «сдвигает» следующие аргументы. Вы iptables
никогда не знали, что есть что-то между --out-interface
и -j
. Парсер командной строки обманут, и команда может пожаловаться только на другой аргумент, как MASQUERADE
в вашем случае. Альтернатива хуже: в общем, если эти «сдвинутые» аргументы создают правильное продолжение, команда будет работать с массивом опций, которые вы никогда не намеревались передать. Это может быть плохо; с sudo
этим может быть очень плохо.
Урок: процитируйте свои переменные.