Настройка iptables для раздачи интерента только для одного устройства, в моём случае это телефон, подключённый через wifi с фильтрацией по IP и MAC адресам.
Да, тут используется Network Manager
Сразу обращаю внимание, что скрипт ниже не создаёт и не изменяет параметры никаких беспроводных соединений и никак не касатся настройки IP, маршрутов и прочего. Физическое соединение устанавливается с помощью NetworkManager, с помощью которого создаётся ad-hoc соеденение и устанавливается IP сервера(шлюза) в 172.16.172.1. Настроить его проблем не должно быть - понатыкать галочки и вписать айпи.
Сам скрипт (у меня он называется phone-net.sh):
#!/bin/bash
PEER_MAC="00:1F:E4:44:06:30"
PEER_IP="172.16.172.2"
IPTABLES="iptables"
echo 1 > /proc/sys/net/ipv4/ip_forward
${IPTABLES} -t mangle -I PREROUTING -m mac --mac-source ${PEER_MAC} \
-s ${PEER_IP} -j MARK --set-mark 100500
${IPTABLES} -t filter -I FORWARD -s ${PEER_IP} -j ACCEPT
${IPTABLES} -t filter -I FORWARD -d ${PEER_IP} -j ACCEPT
${IPTABLES} -t nat -I POSTROUTING -m mark --mark 100500 -j MASQUERADE
exit 0
Нужно изменить переменные PEER_MAC и PEER_IP соотетственно mac и ip телефна. Ну и незабыть прописать днс и шлюз на втором устройстве(телефоне).
После сохранения скрипта не забываем дать права на выполнение (chmod a+x phone-net.sh). Скрипт запускать только под рутом
Почему всё так сложно?
Действительно, зачем сначала помечать пакет с соответствующим маком и айпи, а потом только маскировать его? Дело в том, что в таблице nat уже не доступна информация об исходном маке.