iptables 用于互联网连接共享

iptables 用于互联网连接共享

客观的:

我正在使用具有以下网络配置的嵌入式 Linux 设备。

  • 接口 1:“wlan0”充当接入点。
  • 接口 2:“eth1”连接到互联网。
  • 接口 3:“eth2”连接到互联网。

我的目标是将到达“wlan0”(目的地为 wlan0 子网以外的 IP)的数据包从连接到它的无线客户端 NAT 到“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 -> 互联网连接已建立

答案1

MASQUERADEiptables 加上 就能产生/proc/sys/net/ipv4/ip_forward = 1神奇的效果。

并且匹配条件来自-o $EXTIF您的路线。

您应该有一个route add default gw x.x.x.x $EXTIFxxxx 应该是您的互联网路由器的内部 IP(LAN)。

有了默认网关,内核就知道它收到的数据包不是发往您网络的,因此需要在该网关内路由到外部。Iptables 看到这一点,并进行 Masquerade 的 SNAT。

答案2

我认为你的脚本应该是这样的:

    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

相关内容