如何为外部 IP 地址设置静态路由

如何为外部 IP 地址设置静态路由

我正在我们的网络上安装一个新路由器,以帮助管理我们的专用网络连接并更好地控制到外部的路由。我决定通过删除对路由器上第二个专用网络的引用来简化这个问题(但请注意,这个问题是有原因的,所以答案是不是保留旧路由器作为默认网关)。

我路由器上的 iptables 中有以下路由:

# Allow established connections, and those !not! coming from the public interface
# eth0 = public interface
# eth1 = private interface #1 (129.2.2.0/25)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW ! -i eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the private interface
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

# Masquerade (NAT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Don't forward any other traffic from the public to the private
iptables -A FORWARD -i eth0 -o eth1 -j REJECT

这种配置意味着用户将通过具有公共地址的调制解调器/路由器进行转发 - 这对于大多数目的来说都很好,并且主要所有计算机都隐藏在一个公共 IP 后面并不重要。

但是,一些用户需要能够访问 192.111.222.111:8080 的代理 - 并且代理需要将此流量识别为通过 129.2.2.126(旧路由器)的网关 - 否则它将不会响应。

我尝试在我们的路由器上添加静态路由:

route add -host 192.111.222.111 gw 129.2.2.126 dev eth1

我可以从路由器成功 ping 192.111.222.111。当我跟踪路由时,它列出了 129.2.2.126 网关,但我在以下每个跳数上都只得到 ***(我认为这是有道理的,因为这只是一个 Web 代理并且需要身份验证)。

当我尝试从 129.2.2.0/25 网络上的主机 ping 此地址时,失败。

我应该在 iptables 链中执行此操作吗?我该如何配置此路由?

网络图

在此处输入图片描述

这里是接口配置对于路由器:

auto eth0
iface eth0 inet static
    address     150.1.2.2
    netmask     255.255.255.248
    gateway     150.2.2.1

auto eth1
iface eth1 inet static
    address     129.2.2.125
    netmask     255.255.255.128

这是路由表(没有添加我的静态路由):

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         eth1202.sa.adsl 0.0.0.0         UG    100    0        0 eth0
localnet        *               255.255.255.0   U     0      0        0 eth1
129.2.2.0       *               255.255.255.128 U     0      0        0 eth1

重申一下 - 我想要来自 129.2.2.7(例如)的流量现在通过我们的路由器(129.2.2.125)路由。但是这个路由器需要转发 8080 请求,目的地是 192.111.222.111 - 位于旧路由器(129.2.2.126 - 我们无法管理)的另一侧。

答案1

您正在尝试做的事情完全可行,而且确实是一种经常使用的技术。您也已经完成了大部分设置。您可能缺少的是“接受”规则“新路由器”允许来自eth1eth1. 只需使用

iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -j ACCEPT

它应该足够安全,不会规避任何现有的规则和安全措施,同时又足够通用,可以允许任何网络客户端和协议。完成设置和故障排除后,您可以将规则限制在要使用的协议和目的地:

iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -d 192.111.222.111 -p icmp -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -s 192.111.222.111 -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -d 192.111.222.111 -p tcp --dport 8080 -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -s 192.111.222.111 -p tcp --sport 8080 ! --syn -j ACCEPT

请注意,在典型情况下,你几乎看不到任何流量通过“新路由器”192.111.222.111。Linux 会很高兴地发出ICMP 重定向消息通知子网的主机使用“旧路由器”在第一个数据包出现时,将流量发送到 192.111.222.111。大多数主机都会遵循(假设它们收到了消息 - 即它没有被任何地方过滤)并将所有后续数据包直接通过“旧路由器”

答案2

如果您要路由到特定主机,我认为使用网络掩码是不正确的。指定 0.0.0.0 意味着所有流量的默认网关,因为该掩码将匹配所有 IPv4 IP。

事实上,完整的 255.255.255.255 对于单个主机匹配规则来说是必要的。

也许这很明显,但您必须指定现有路由表覆盖的直接连接网络上的网关。

在使用 iptables 和路由时,我建议设置一条 LOG 规则,将丢弃的数据包发送到日志。这样一来,如果您丢弃的数据包可能只是路由问题,那么它就会告诉您。

这将设置一个 LOGDROP 链。

-A LOGDROP -j LOG --log-prefix "LOGDROP "
-A LOGDROP -j DROP

然后在您想要记录的各种链的末尾,跳转到最后的 LOGDROP 链:

-A INPUT -j LOGDROP

而不是简单地丢弃数据包。带有不同标签的各种 LOGDROP 链将使您能够更细致地了解所看到的内容。

相关内容