IP 路由到域

IP 路由到域

我有一个远程设备,它通过特定端口将数据发送到 IP 地址。我想解决的问题是我需要它将数据发送到域,但设备只允许设置IP地址。

我想知道如何配置 Linux 以便对给定域进行 IP 路由。

那可能吗?

我可以设置设备来寻址域的 IP,但该 IP 地址是动态的。我拥有的域名是 noip.com 的域名。

答案1

两部分解决方案:

  1. 使用 IPTABLES,您可以执行一些 PREROUTING 来捕获到 abcd(远程服务器)的所有流量,然后屏蔽该流量并将其重定向到 efgh(您的 noip.com IP)

  2. 使用 cron 脚本,每 N 分钟运行一次,如果 IP 已更改,请清除 IPTABLES 规则并使用新 IP 重新插入它们。

我还没有测试过,但这就是我开始的方式:

iptables -t nat -I PREROUTING -s [localwanip] -d [remoteip] -p -m tcp --dport [port] --to-destination [newremoteip]

...以及脚本,再次需要校对(结果可能会根据版本和系统风格而有所不同):

#!/bin/bash

NOIPNAME=yourname.noip.com
# Your IP on your WAN interface
LOCALIP=1.2.3.4
# The IP the software is _mistakenly_ trying to talk to
REMOTEIP=4.3.2.1
# The TCP port the software is using to connect to the remote IP
PORT=1234
# Just a file to keep track of what the last IP was...
REMEMBERFILE=/var/run/oldip.txt

# and now the magic, if it works...

HOSTLINE=$(host $NOIPNAME ns1.no-ip.com | grep 'has address')
HOSTLEN=$(echo $HOSTLINE | wc -m)

# Make sure the return string is > 8 characters (1.2.3.4\n)
if [ $HOSTLEN -lt 8 ]; then
  # Host resolve failure
  echo "Bad host"
  exit 1
fi

# Extract the IP from the return string.
DYNIP=$(echo $HOSTLINE | sed -rn 's/^.* ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*/\1/p')

OLDIP=$(cat $REMEMBERFILE)

if [ "x$DYNIP" = "x$OLDIP" ]; then
    # Nothing to do.
    exit 0
else
    echo $DYNIP > $REMEMBERFILE
fi

# Flush
iptables -t nat -F
# and re-write
iptables -t nat -I PREROUTING -s $LOCALIP -d $REMOTEIP -p -m tcp --dport $PORT --to-destination $DYNIP

exit 0

最后添加到cron中;下面每 10 分钟运行一次(通过这部分:*/10)。

echo "*/10    *  *  *   *   root /your/path/to/script" >> /etc/crontab

注意事项:现在,如果我给出的命令不起作用(可能不会 - 这只是一个猜测),那么 IPTABLES 将很棘手 - 在 google 中进行挖掘,例如:

http://ribbalicious.com/rewrite-destination-ip-address-using-iptables/

祝你好运。

答案2

您应该在设备中设置Linux系统的IP地址。此 Linux 将执行 NAT(iptables请参阅DNAT)。它还会定期检查 DNS 更新并相应地更新 DNAT 配置。当然,您可能会因IP更改而丢失一些数据。

相关内容