我正在运行一个 DDWRT 路由器,后面有一个 NAS。NAS 运行一项名为云站。我想将 Cloud Station 的访问权限限制为少数主机(家庭成员)。每个家庭成员都有一个 IP,但它们都是动态的(Comcast ISP),所以我想使用已经设置的 DynDns。
我知道我可以使用 iptables(或使用 DDWRT gui)设置受限端口转发,但由于源 IP 可能会发生变化,我是否可以改用 dyndns 主机名?如果不行,有人知道我可以运行的脚本来更新允许的 IP 吗?
答案1
iptables
DD-WRT 用于防火墙和端口转发的 仅查看 IP 地址。它在收到数据包时不会进行 DNS 查找。出于速度和安全原因,这是一个非常糟糕的想法。因此,它永远不知道 IPxxx.xxx.xxx.xxx
反向解析为mydomain.invalid
。
解决您的问题最优雅的方法可能是使用 VPN,OpenVPN 或 PPTP。现在我从未真正尝试过让 DD-WRT 与它们一起工作(通常我会在单独的盒子上运行 OpenVPN),但如果您的 DD-WRT 路由器有足够的闪存来构建完整版本(8MB 或更多),您可以尝试在其上使用 OpenVPN,或者如果您想为您的家人提供更简单的服务,可以使用 PPTP。
因此,基本上,您要从尝试基于 IP 地址/域名实现安全性转向基于 VPN 密码实现安全性,这将更适合您的情况。
答案2
我最终创建了一个脚本,如果 IP 地址发生变化,该脚本会自动更新 iptables。以下是我想到的(在 XXXX 中填写 IP 和端口)
#!/bin/sh
# setup variables
HOST=$1
HOSTFILE="/tmp/root/hosts/host-$HOST"
IPTABLES="/usr/sbin/iptables"
# check to make sure we have enough args passed (1).
if [ $# -eq 0 ]; then
echo "$0 hostname"
echo "You must supply a hostname to update in iptables."
exit
fi
# lookup host name from dns tables using ping, if invalid hostname, dns server ip responds (67.215.65.132)
IP=`ping -c 1 ${HOST} | egrep -m1 -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'`
if [ "${IP}" = "67.215.65.132" ]; then
echo "Couldn't lookup hostname for $HOST, failed."
exit
fi
# check if hostfile exists (-e) and if so, read the contents
OLDIP=""
if [ -e $HOSTFILE ]; then
OLDIP=`cat $HOSTFILE`
echo "CAT returned: $?"
fi
# has address changed?
if [ "$OLDIP" == "$IP" ]; then
echo "Old and new IP addresses match."
exit
fi
# save new ip to host file.
echo $IP>$HOSTFILE
echo "Updating $HOST in iptables."
if [ "${#OLDIP}" != "0" ]; then
echo "Removing old rule ($OLDIP)"
`${IPTABLES} -t nat -D PREROUTING -p tcp -s ${IP} -d $(nvram get wan_ipaddr) --dport XXXX -j DNAT --to 192.168.1.XXXX:XXXX`
`${IPTABLES} -D FORWARD -p tcp -s ${IP} -d 192.168.1.XXXX --dport XXXX -j ACCEPT`
fi
echo "Inserting new rule ($IP)"
# route and forward all traffic from ip XXXX to port XXXX
`${IPTABLES} -t nat -I PREROUTING -p tcp -s ${IP} -d $(nvram get wan_ipaddr) --dport XXXX -j DNAT --to 192.168.1.XXXX:XXXX`
`${IPTABLES} -I FORWARD -p tcp -s ${IP} -d 192.168.1.XXXX --dport XXXX -j ACCEPT`