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

Hor*_*Kol 5 networking routing proxy iptables

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

我的路由器上的 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

route add -host 192.111.222.111 gw 129.2.2.126 dev eth1
Run Code Online (Sandbox Code Playgroud)

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

当我尝试从 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

the*_*bit 4

您尝试做的事情是完全可能的,而且确实是一种经常使用的技术。您也已经完成了大部分设置。您可能缺少的是“新路由器”处的“接受”规则,允许流量从eth1流向eth1。只需添加它使用

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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