Цель:
Я работаю над встроенным устройством 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 ' d через eth2
, и подключение к Интернету будет восстановлено. Но этого не происходит.
- ./ics.sh eth2 wlan1 -> Есть подключение к Интернету
MASQUERADE
iptables плюс / proc / sys / net / ipv4 / ip_forward = 1
творит чудеса.
условие соответствия для -o $ EXTIF
исходит из ваших маршрутов.
У вас должен быть один маршрут добавить по умолчанию gw xxxx $ EXTIF
xxxx должен быть внутренним 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