如何在 Linux 上进行基于 MAC 的一对一 NAT?

如何在 Linux 上进行基于 MAC 的一对一 NAT?

我有一台运行 ubuntu 服务器的 Linux 机器,带有 2 个网卡(WAN 和 LAN)。我希望 LAN 端机器使用 Linux 机器作为网关来访问互联网(WAN 端)。唯一的问题是 LAN 端机器将具有静态 IP,无法配置 DHCP。我必须围绕它们的设置进行工作。我编写了一个在服务器上运行的小程序,监听 ARP 请求并获取所有客户端流量,然后将它们 NAT 到 WAN 端。现在,无论客户端的静态 IP 地址是什么,都可以 ping google。

我的代码基于 MAC 地址进行 NAT,即来自 XX:YY 的客户端数据包将使用 10.0.0.1. 作为源地址发送出去。另一个带有 ZZ:ZZ 的客户端将在 WAN 侧接口上收到源地址为 10.0.0.2 的数据包。所有这些的目的是为强制门户用户提供某种零配置互联网访问。

我的问题是,我无法让 TCP/HTTP 通过我的 NAT 工作。GET 请求没有得到来自 WAN 端的回复,所以我陷入困境,正在考虑替代方案!

提问时间:1. 可以使用 netfilter 和 IP 表来完成此操作吗?而不是编写我自己的 NAT 代码。2. 是否有任何开源用户空间 NAT 程序可供我使用和修改?3. 我可以修改当前的 netfilter 代码吗?这会是一项艰巨的任务吗?

我的工具:libpcap、gcc、wireshark、ubuntu server 10.10

我是 Linux 网络编程的新手,如能提供任何建议我将不胜感激。

谢谢,

马尔

答案1

我不明白为什么使用静态寻址会成为问题。Netfilter 可进行本机 NAT,并且易于通过 iptables 构建。

如果“eth0”代表服务器上的 LAN 端接口,而 eth1 代表 WAN 端,则运行“iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE”(NAT 的最低要求)就可以了。

尽管您可能需要检查默认策略,尤其是FORWARD链(iptables -P FORWARD ACCEPT/DROP)。

相关内容