以下场景:我有一个家庭服务器,该服务器带有一个附加了动态 DNS 的域,我想使用 iptables 通过廉价 VPS 代理使用我的家庭服务器的任何人。我尝试的命令是:
iptables -t nat -A PREROUTING -p tcp --dport 30033 -j DNAT -d XXXXXXXXXXXX.myfritz.net:30033
但我明白
iptables v1.6.0: Bad IP address "XXXXXXXXXXXX.myfritz.net"
答案1
iptables
无法单独完成此操作。它只能识别 IP,无法识别域。以下是两种可以实现所需功能的方法:
-j DNAT
不要在另一个盒子上进行操作,而是-j REDIRECT
在本地主机上执行并运行一个用户空间程序,该程序负责处理 DDNS 并代理到真实主机。- 通过 IP 地址添加规则,并运行 cronjob 检查 DNS 是否有更新,当找到更新时,删除并使用新 IP 重新创建规则。
答案2
谢谢https://unix.stackexchange.com/a/91711我最终为这个任务创建了一个 bash 脚本(如果你想知道为什么 while 循环;crontab 由于某种原因不会执行它):
#!/bin/bash
iptables -t nat -A POSTROUTING -j MASQUERADE
while true
do
LOGFILE=/path/to/ip.txt
Current_IP=$(dig +short @YOUR_NAMESERVER YOUR_DYNDNS_DOMAIN)
# Current_IP=$(host $HOSTNAME | head -n1 | 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 ($Old_IP -> $Current_IP)"
else
iptables -t nat -D PREROUTING -p udp --dport 9989:10050 -j DNAT --to-destination $Old_IP:9989-10050
iptables -t nat -D PREROUTING -p tcp --dport 10011 -j DNAT --to-destination $Old_IP:10011
iptables -t nat -D PREROUTING -p tcp --dport 30033 -j DNAT --to-destination $Old_IP:30033
iptables -t nat -A PREROUTING -p udp --dport 9989:10050 -j DNAT --to-destination $Current_IP:9989-10050
iptables -t nat -A PREROUTING -p tcp --dport 10011 -j DNAT --to-destination $Current_IP:10011
iptables -t nat -A PREROUTING -p tcp --dport 30033 -j DNAT --to-destination $Current_IP:30033
sysctl net.ipv4.ip_forward=1
iptables-save
echo $Current_IP > $LOGFILE
echo "IP address has changed ($Old_IP -> $Current_IP)"
fi
fi
sleep 30
done
答案3
如果有人仍在寻找方法forward a port to a domain instead of ip so the ip will be resolved from the dns
:
https://github.com/benyamin218118/tcpforwarder
你只需要构建或下载它并像这样使用它:
./tcpforwarder -lPort 8080 -rHost sub.domain.com -rPort 8090
您可以在文档中看到示例