使用 iptables 将端口重定向到域而不是 ip

使用 iptables 将端口重定向到域而不是 ip

以下场景:我有一个家庭服务器,该服务器带有一个附加了动态 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,无法识别域。以下是两种可以实现所需功能的方法:

  1. -j DNAT不要在另一个盒子上进行操作,而是-j REDIRECT在本地主机上执行并运行一个用户空间程序,该程序负责处理 DDNS 并代理到真实主机。
  2. 通过 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

您可以在文档中看到示例

相关内容