我正在networking上安装一个新的路由器,以帮助pipe理我们的专用networking连接,并更好地控制到外部的路由。 我已经决定通过去除对路由器上第二个专用networking的引用来简化这个问题(但请注意,这个问题是有原因的,所以答案并不是将旧路由器作为默认网关)。
我在我的路由器上的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
这种configuration意味着用户将通过具有公共地址的调制解调器/路由器转发 – 这对于大多数目的来说都是好的,而且主要是所有计算机都隐藏在一个公共IP之后并不重要。
但是,有些用户需要能够访问192.111.222.111:8080处的代理服务器,并且代理服务器需要将此stream量标识为通过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代理,需要authentication)。
当我尝试从129.2.2.0/25networking上的主机ping该地址时,它失败。
我应该在iptables链中做这个吗? 我将如何configuration此路由?
networking图

以下是路由器的接口configuration :
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(例如)的stream量现在路由通过我们的路由器(129.2.2.125)。 但是这个路由器需要转发8080个请求,目的地是192.111.222.111,这个地址在旧路由器的另一端(129.2.2.126 – 这是我们不能pipe理的)。
你试图做的是完全可能的,而且确实是一个经常使用的技术。 你也已经得到了大部分的设置。 您可能会丢失的是“新路由器”中的“接受”规则,允许stream量从eth1stream向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
它应该是足够安全的,不要绕过任何规则和安全措施,而且要足够通用,以允许任何networking的客户端和协议。 完成设置和故障排除后,您可以将规则限制为要使用的协议和目的地:
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的“新路由器”的stream量。 Linux高兴地会发出ICMPredirect消息,通知您的子网的主机在第一个数据包发生时使用“旧路由器”通信到192.111.222.111。 而且大多数主机会遵循(假设他们得到了这个消息 – 即它没有被过滤到任何地方),并通过“旧路由器”直接发送所有后续的数据包到192.111.222.111。
如果你路由到一个特定的主机,我不认为使用networking掩码是正确的。 指定0.0.0.0意味着所有stream量的默认网关,因为该掩码将匹配所有的IPv4 IP。
实际上,完整的255.255.255.255是单个主机匹配规则所必需的。
也许很明显,但是您必须指定一个位于现有路由表覆盖的直接连接networking上的网关。
在使用iptables和路由,我build议设置一个LOG规则发送丢弃的数据包到日志。 这将告诉你,如果你丢包可能只是似乎路由问题。
这build立了一个LOGDROP链。
-A LOGDROP -j LOG --log-prefix "LOGDROP " -A LOGDROP -j DROP
然后在您想要login的各种链的末尾,跳到最后的LOGDROP链:
-A INPUT -j LOGDROP
而不是简单地丢弃数据包。 具有不同标签的各种LOGDROP链将允许您更清晰地了解您所看到的内容。