iptables для совместного использования подключения к Интернету

Цель:

Я работаю над встроенным устройством Linux со следующей сетевой конфигурацией.

  • Интерфейс-1:' wlan0 'действует как точка доступа.
  • Интерфейс -2: 'eth1' подключен к Интернету.
  • Интерфейс-3: 'eth2' подключен к Интернету.

Моя цель состоит в том, чтобы пакеты 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 -> Есть подключение к Интернету

0
задан 19 May 2016 в 10:14
2 ответа

MASQUERADE iptables плюс / proc / sys / net / ipv4 / ip_forward = 1 творит чудеса.

условие соответствия для -o $ EXTIF исходит из ваших маршрутов.

У вас должен быть один маршрут добавить по умолчанию gw xxxx $ EXTIF xxxx должен быть внутренним IP (LAN) ваш интернет-маршрутизатор.

С этим шлюзом по умолчанию ядро ​​знает, что полученный пакет не для вашей сети, поэтому он должен быть направлен за пределы этого шлюза. Iptables видит это и составляет SNAT Маскарада.

1
ответ дан 4 December 2019 в 16:37

Я думаю, ваш сценарий должен выглядеть так:

    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
0
ответ дан 4 December 2019 в 16:37

Теги

Похожие вопросы