目的:
我正在使用以下networkingconfiguration在embedded式Linux设备上工作。
我的目标是从连接到它的无线客户端到达'eth1'(或)'eth2'的NAT数据包到达'wlan0'(并且注定到除了wlan0的子网之外的那些IP)。 这样连接到'wlan0'的无线客户端将可以访问互联网。
解决scheme尝试
我经历了几个链接(不幸的是我错过了参考),它提出了使用iptables的下列解决scheme。 我把它写成脚本(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会被满足,因为它是数据包的input接口。
假设我想dynamic地改变NAT(外部)接口。 我尝试了以下
– ./ics.sh eth1 wlan0 – > Internet连接在那里
– ./ics.sh eth2 wlan0 – >我预料会有一个断断续续的互联网连接丢失,但最终数据包将通过eth2进行NAT,并且互联网连接将恢复。 但是这没有发生。
– ./ics.sh eth2 wlan1 – > Internet连接在那里
iptables的MASQUERADE加上/proc/sys/net/ipv4/ip_forward = 1是有神奇的。
-o $EXTIF的匹配条件来自你的路由。
您应该有一个route add default gw xxxx $EXTIF xxxx应该是您的互联网路由器的内部IP(LAN)。
使用该默认网关,内核知道它接收到的数据包不适合您的networking,因此需要在该网关外部路由。 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