客观的:
我正在使用具有以下网络配置的嵌入式 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
MASQUERADE
iptables 加上 就能产生/proc/sys/net/ipv4/ip_forward = 1
神奇的效果。
并且匹配条件来自-o $EXTIF
您的路线。
您应该有一个route add default gw x.x.x.x $EXTIF
xxxx 应该是您的互联网路由器的内部 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