Задача:
Я работаю над встроенным устройством Linux со следующей конфигурацией сети.
Моя цель состоит в том, чтобы пакеты NAT достигали 'wlan0' (и предназначались для IP-адресов, отличных от тех, что находятся в подсети wlan0) от беспроводных клиентов, подключенных к нему к 'eth1' (или) 'eth2'. Так что беспроводные клиенты, подключенные к wlan0, будут иметь доступ в Интернет.
Решение пробовали:
Я просмотрел несколько ссылок (к сожалению, я пропустил ссылки), в которых было предложено следующее решение с использованием iptables
. Я написал это как сценарий (ics.sh).
EXTIF=$1
INTIF=$2
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD DROP
$IPTABLES -F FORWARD
$IPTABLES -t nat -F
route add -net 192.168.10.0/24 dev $INTIF
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
#$IPTABLES -A FORWARD -j LOG
#Puzzled, how will the matching condition of `-o $EXTIF` be satisfied for any packets???
echo " Enabling SNAT (MASQUERADE) functionality on $EXTIF"
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
Я немного новичок в iptables
так что есть следующие пояснения
Требуются пояснения:
Насколько я понимаю, пакет будет проходить через FORWARD
цепочка, только если она не предназначена для локального хоста. У меня есть пояснение: как будет выполняться условие соответствия -o $EXTIF
быть доволен любыми пакетами. Я это понимаю -i $INTIF
будет удовлетворен, поскольку это входной интерфейс для пакета.
Скажем, хочу ли я динамически изменить интерфейс NAT (внешний). Я пробовал следующее
- ./ics.sh eth1 wlan0 -> Интернет-соединение есть
- ./ics.sh eth2 wlan0 -> Я ожидал, что произойдет периодическое прерывание подключения к Интернету, но в конечном итоге пакеты будут преобразованы через NAT через eth2
и подключение к Интернету будет восстановлено. Но этого не происходит.
- ./ics.sh eth2 wlan1 -> Интернет-соединение есть
В MASQUERADE
iptables плюс /proc/sys/net/ipv4/ip_forward = 1
творит чудеса.
И условие соответствия для -o $EXTIF
исходит из ваших маршрутов.
У тебя должен быть один route add default gw x.x.x.x $EXTIF
X.x.x.x должен быть внутренним IP-адресом (LAN) вашего интернет-маршрутизатора.
С этим шлюзом по умолчанию ядро знает, что полученный пакет не для вашей сети, поэтому он должен быть направлен за пределы этого шлюза. Iptables видит это и составляет SNAT Маскарада.
Думаю, ваш сценарий должен выглядеть так:
EXTIF=$1
INTIF=$2
WLAN_NET="192.168.10.0/24"
echo "1" > /proc/sys/net/ipv4/ip_forward
# Flush all rules
IPTABLES -F
#Allow masquerade only if requested internet address
IPTABLES -A POSTROUTING -s $WLAN_NET ! -d WLAN_NET -o $EXTIF -j MASQUERADE
#Allow forward from localnet to internet
IPTABLES -A FORWARD -s $WLAN_NET ! -d $WLAN_NET -i $INTIF -j ACCEPT