Я использую маршрутизатор DDWRT с сетевым хранилищем. NAS запускает службу под названием Cloud Station. Я хотел бы ограничить доступ к Cloud Station для нескольких хостов (членов семьи). У каждого члена семьи есть IP-адрес, но все они динамические (Comcast ISP), поэтому я хотел бы использовать DynDns, который я уже настроил.

Я понимаю, что могу настроить ограниченную переадресацию портов с помощью iptables (или используя графический интерфейс DDWRT), но, поскольку исходный IP-адрес может измениться, могу ли я вместо этого использовать имя хоста dyndns? Если нет, кто-нибудь знает скрипт, который я могу запустить, который может обновить разрешенный IP?

2 ответа2

0

iptables , который DD-WRT использует для межсетевого экрана и переадресации портов, видит только IP-адреса. Он не выполняет поиск DNS при получении пакета. Это действительно плохая идея по соображениям скорости и безопасности. Так что он никогда не узнает, что IP xxx.xxx.xxx.xxx обратно разрешает mydomain.invalid .

Вероятно, самый элегантный способ решить вашу проблему - это использовать VPN, либо OpenVPN, либо PPTP. Теперь я никогда не пытался заставить DD-WRT работать с любым из них (обычно у меня OpenVPN работает на отдельном компьютере), но если на вашем маршрутизаторе DD-WRT достаточно флэш-памяти для полной сборки (8 МБ или более), вы можете попробовать использовать OpenVPN или PPTP, если вы хотите что-то более простое для вашей семьи.

Итак, в основном вы переходите от попыток обеспечения безопасности на основе IP-адреса / имени домена к защите на основе пароля VPN, что будет лучше работать в вашей ситуации.

Подробнее: PPTP на DD-WRT, OpenVPN на DD-WRT.

0

В итоге я создал скрипт, который автоматически обновлял бы iptables при изменении IP-адреса. Вот что я придумал (заполните 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`

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .