使用 iptables 将网络流量从一台计算机转发到另一台计算机

使用 iptables 将网络流量从一台计算机转发到另一台计算机

我有两台电脑在同一个局域网上

Comp A: 192.1681.151.15
Comp B: 192.1681.151.19

设置如下

Internet <---->  Computer B
      ^-------->  Computer A 

两台计算机都有一张网卡。

当我打开 Wireshark 时,对于在计算机 A 上浏览的所有流量,我希望 Wireshark 捕获计算机 A 的流量和目标地址作为它所连接的服务器的流量。

我试图了解 iptables 和其他相关问题,但不知何故我仍然错误地配置了它。

我在计算机 B 上使用以下 iptable 规则

   iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.151.19:443 
   iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.151.19:80 
   iptables -t nat -A POSTROUTING -j MASQUERADE

但是当我浏览计算机 B 上的流量时,我没有在 wireshark(在计算机 A 上运行)上看到任何流量。有人可以指导我如何正确配置它吗?

答案1

这实际上是两个问题,我不确定它们是否相关。

1) 如果计算机通过交换机通过以太网 LAN 连接,而不是通过 WLAN 连接,则原则上 LAN 上的所有流量对于连接到它的所有设备都是可见的。无需进行伪装/转发或使用任何 iptable 规则。因此,只需在任何计算机(例如计算机 B)上启动 Wireshark,您就应该看到从计算机 A 到路由器的流量。

如果这不起作用,请从计算机 A ping 计算机 B。然后从计算机 A ping 路由器。如果您在第一次 ping 时没有看到数据包,则 Wireshark 设置存在一些问题。如果您只在第一次 ping 时看到数据包,而在第二次 ping 时看不到数据包,则接口出于某种原因丢弃了不打算发送给该计算机的数据包,或者某些东西正在过滤数据包,因此请检查计算机 B 等上的 iptables。

编辑:还可能发生的情况是您的路由器没有充当交换机。我进行了一些测试,发现我实际上有一个路由器,其中所有 4 个 LAN 端口都显示为不同的设备,并且使用 Linux 内核桥接器进行桥接(包括 WLAN)。这种桥接器会跟踪它所看到的 MAC 地址,并且只转发到它所看到目标 MAC 地址的端口。在这种情况下,来自两台计算机的数据包在另一台机器上是看不到的。

解决方案:(a)找到其他以太网交换机并将所有设备连接到它,或(b)使用网关方法。

2) 如果您想使用计算机 B 作为计算机 A 的网关(这对于观察以太网 LAN 上的流量来说不是必需的,但对于 WLAN 来说可能是必需的),您需要将计算机 A 配置为使用计算机 B 作为网关。您设置中的“互联网”很可能是家用路由器,它充当 DHCP 服务器,为计算机 A 和计算机 B 分配 IP 地址,并告诉它们使用路由器作为网关。因此,请使用routeip route在计算机 A 上设置正确的路由。确保没有其他路由。

以下脚本可以帮助我设置转发(尽管可能不是最佳的):

#!/bin/bash

# forward traffic on the same $IF for one particular $ADDR, acting as gateway

modprobe nf_conntrack
modprobe nf_conntrack_ipv4
modprobe nf_nat
modprobe iptable_nat  

IF="eth0"
ADDR="192.168.178.25"

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT 
iptables -P FORWARD DROP
iptables -F FORWARD 
iptables -t nat -F
iptables -A FORWARD -i $IF -o $IF -d $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $IF -o $IF -s $ADDR -j ACCEPT
iptables -t nat -A POSTROUTING -s $ADDR -j MASQUERADE

相关内容