Car*_*ala 42 security firewall dynamic-dns ufw
我运行了一个 VPS,我想使用 UFW 保护它,只允许连接到端口 80。但是,为了能够远程管理它,我需要保持端口 22 打开并使其可以从家里访问。
我知道可以将 UFW 配置为仅允许从特定 IP 地址连接到端口:
ufw allow proto tcp from 123.123.123.123 to any port 22
Run Code Online (Sandbox Code Playgroud)
但是我的 IP 地址是动态的,所以这还不是解决方案。
问题是:我使用 DynDNS 进行动态 DNS 解析,那么是否可以使用域而不是 IP 创建规则?
我已经试过了:
ufw allow proto tcp from mydomain.dyndns.org to any port 22
Run Code Online (Sandbox Code Playgroud)
但我得到了 ERROR: Bad source address
slm*_*slm 58
我不相信这是可能的ufw。ufw只是一个前端iptables,也缺少此功能,因此一种方法是创建一个 crontab 条目,该条目将定期运行并检查 IP 地址是否已更改。如果有,那么它会更新它。
您可能会尝试这样做:
$ iptables -A INPUT -p tcp --src mydomain.dyndns.org --dport 22 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
但这会将主机名解析为 IP 并将其用于规则,因此如果 IP 稍后更改,此规则将无效。
您可以创建一个这样的脚本,称为,iptables_update.bash。
#!/bin/bash
#allow a dyndns name
HOSTNAME=HOST_NAME_HERE
LOGFILE=LOGFILE_NAME_HERE
Current_IP=$(host $HOSTNAME | cut -f4 -d' ')
if [ $LOGFILE = "" ] ; then
iptables -I INPUT -i eth1 -s $Current_IP -j ACCEPT
echo $Current_IP > $LOGFILE
else
Old_IP=$(cat $LOGFILE)
if [ "$Current_IP" = "$Old_IP" ] ; then
echo IP address has not changed
else
iptables -D INPUT -i eth1 -s $Old_IP -j ACCEPT
iptables -I INPUT -i eth1 -s $Current_IP -j ACCEPT
/etc/init.d/iptables save
echo $Current_IP > $LOGFILE
echo iptables have been updated
fi
fi
Run Code Online (Sandbox Code Playgroud)
来源:使用带有动态 IP 主机名的 IPTables,例如 dyndns.org
保存此脚本后,您可以在文件中创建像这样的 crontab 条目/etc/crontab:
*/5 * * * * root /etc/iptables_update.bash > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
此条目将每 5 分钟运行一次脚本,检查分配给主机名的 IP 地址是否已更改。如果是这样,它将创建一个允许它的新规则,同时删除旧 IP 地址的旧规则。
小智 9
我知道这很旧,但我遇到了它,最终得到了这个解决方案,这看起来更好,因为不需要日志文件,并且根据需要添加其他主机非常容易。奇迹般有效!
来源:http : //rdstash.blogspot.ch/2013/09/allow-host-with-dynamic-ip-through.html
#!/bin/bash
DYNHOST=$1
DYNHOST=${DYNHOST:0:28}
DYNIP=$(host $DYNHOST | grep -iE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" |cut -f4 -d' '|head -n 1)
# Exit if invalid IP address is returned
case $DYNIP in
0.0.0.0 )
exit 1 ;;
255.255.255.255 )
exit 1 ;;
esac
# Exit if IP address not in proper format
if ! [[ $DYNIP =~ (([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) ]]; then
exit 1
fi
# If chain for remote doesn't exist, create it
if ! /sbin/iptables -L $DYNHOST -n >/dev/null 2>&1 ; then
/sbin/iptables -N $DYNHOST >/dev/null 2>&1
fi
# Check IP address to see if the chain matches first; skip rest of script if update is not needed
if ! /sbin/iptables -n -L $DYNHOST | grep -iE " $DYNIP " >/dev/null 2>&1 ; then
# Flush old rules, and add new
/sbin/iptables -F $DYNHOST >/dev/null 2>&1
/sbin/iptables -I $DYNHOST -s $DYNIP -j ACCEPT
# Add chain to INPUT filter if it doesn't exist
if ! /sbin/iptables -C INPUT -t filter -j $DYNHOST >/dev/null 2>&1 ; then
/sbin/iptables -t filter -I INPUT -j $DYNHOST
fi
fi
Run Code Online (Sandbox Code Playgroud)
小智 7
根据以前的答案,我将以下内容更新为适用于 Debian Jessie 的 bash 脚本
#!/bin/bash
HOSTNAME=dynamichost.domain.com
LOGFILE=$HOME/ufw.log
Current_IP=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ')
if [ ! -f $LOGFILE ]; then
/usr/sbin/ufw allow from $Current_IP to any port 22 proto tcp
echo $Current_IP > $LOGFILE
else
Old_IP=$(cat $LOGFILE)
if [ "$Current_IP" = "$Old_IP" ] ; then
echo IP address has not changed
else
/usr/sbin/ufw delete allow from $Old_IP to any port 22 proto tcp
/usr/sbin/ufw allow from $Current_IP to any port 22 proto tcp
echo $Current_IP > $LOGFILE
echo iptables have been updated
fi
fi
Run Code Online (Sandbox Code Playgroud)
在我将它们合并之前,基于所有答案。不需要日志文件。在 Ubuntu 18.04 上测试
#!/bin/bash
HOSTNAME=YOUR.DNS.NAME.HERE
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
new_ip=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ')
old_ip=$(/usr/sbin/ufw status | grep $HOSTNAME | head -n1 | tr -s ' ' | cut -f3 -d ' ')
if [ "$new_ip" = "$old_ip" ] ; then
echo IP address has not changed
else
if [ -n "$old_ip" ] ; then
/usr/sbin/ufw delete allow from $old_ip to any
fi
/usr/sbin/ufw allow from $new_ip to any comment $HOSTNAME
echo iptables have been updated
fi
Run Code Online (Sandbox Code Playgroud)
您可以使用“port”参数将端口添加到规则中。例如:
if [ -n "$old_ip" ] ; then
/usr/sbin/ufw delete allow from $old_ip to any port 22
fi
/usr/sbin/ufw allow from $new_ip to any port 22 comment $HOSTNAME
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76516 次 |
| 最近记录: |