2

我在专用的 ubuntu 服务器上有一个防火墙(基于 iptables)。我有几个 LAN 客户端。

在我的一个 LAN 客户端上,我正在运行可以基于 IP 限制访问的软件。对我来说,重要的是我可以通过使用 WAN IP 而不是 LAN IP 来限制它。

我已经配置了我的防火墙,以便将一个/一个端口转发到一个运行良好的 LAN 客户端(在 stackoverflow 中找到了解决方案)。到目前为止没有问题。

但是在 LAN 客户端我看不到外部发送者的 IP,但是 - 我认为由于转发 - 客户端看到数据包来自我的 LAN 服务器。

问题是:如何将我服务器上的一个端口转发到另一个具有不同端口的 LAN IP,但这样 LAN 客户端才能识别数据包的外部 IP。

让我们更清楚:

服务器局域网IP:192.168.1.10 服务器端口:8080

应该转发到:客户端局域网IP:192.168.1.20 客户端局域网端口:8000

使用 iptables 我有:

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8080 -d 192.168.1.10 -j DNAT --to 192.168.1.20:8000

iptables -A FORWARD -p tcp -d 192.168.1.20 --dport 8000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A POSTROUTING -p tcp --dport 8000 -d 192.168.1.20 -j SNAT --to 192.168.1.10

正如所写的那样有效,但是当 IP 88.77.66.55 的某人发送一个数据包时,我的 LAN 客户端 (192.168.1.20) 看到该数据包来自我的 LAN 服务器 (192.168.1.10),不幸的是不是来自 88.77.66.55。

我可以解决这个...?

4

3 回答 3

5

您的最后一条规则与 MASQUERADE 规则相同。

例如:

iptables -t nat -A POSTROUTING --out-interface eth0 -j MASQUERADE

使用 MASQUERADE 或 SNAT,您正在修改源 IP 地址,因为它通过第一台服务器。第二台服务器看到数据包并将其响应发送回该 IP,然后将其发送回客户端。

但是,服务器将请求视为来自 192.168.1.10 - 因为这是它来自的地方。

客户端 > 网关 > iptables-router > 服务器(参见 .10)> iptables-router > 网关 > 客户端

如果您删除 MASQUERADE/SNAT,服务器会看到真实 IP,但是当它发送回复时,数据包将发送到它的默认网关(默认路由),这可能是您的路由器或数据中心的网关。客户端从它不知道的 IP 地址得到响应,也不知道如何处理它,所以看起来它不起作用。或者,网关/计算机看到没有关联连接的 SYNACK 并丢弃数据包。

客户端 > 网关 > iptables-router > 服务器 > 网关 (DROP) 或 > 客户端 (DROP)

如果希望服务器获取客户端的真实IP,这里有两种常见的方法可以让它工作:

  1. 将服务器的网关(默认路由)设置为 iptables 机器的 IP 地址(即:您正在运行这些 iptables 规则的机器)。在这种情况下,服务器将所有外部流量(即:对来自互联网的随机 IP 地址的响应)发送到正在等待回复的 iptables 机器的 MAC 地址。iptables 会将其发送回客户端。webserver 机器位于 iptables 机器后面,使用 iptables 机器作为路由器。

客户端 > 网关 > iptables-router > 服务器(真实 IP) > iptables-router > 网关 > 客户端

  1. 使用像 nginx 这样的 HTTP 代理,它的工作方式与您现在的工作方式相同,客户端只能看到内部 .10 地址。但是,因为它是一个代理,它可以发送一个 HTTP 标头,例如 X-Original-IP-Address: 123.456.789.012 ,其中包含客户端的真实 IP 地址。

客户端 > 网关 > iptables-router > 服务器(查看 X-Original-IP 标头)> iptables-router > 网关 > 客户端

最好的问候,尼尔

于 2013-06-14T20:12:25.113 回答
2

让我们定义:
{源地址} - 数据包发送者(某个远程地址)
{接口地址} - 数据包接收者(防火墙外部地址)
{本地地址} - 数据包端点接收者本地网络地址
{本地网关} - 防火墙本地地址
{proto block} - IP 协议限制(即 -p tcp -m tcp --dport xxxx)
1. 如果您希望客户端查看数据包源的 IP 地址 - 请执行以下操作:

IPTABLES -t nat -A PREROUTING -s {source address} -d {interface address} {proto block} -j DNAT --to-destination {local address}
IPTABLES -A FORWARD -d {local address} -j ACCEPT

不要忘记制作:

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

它将启用数据包转发。
在这种情况下,您的端点会看到原始 IP 地址,但是,它会尝试响应默认网关,如果此地址不在本地网络范围内,请添加:

route add {source address} gw {local gateway}

这将告诉您的端点通过 {local gateway} 发送 {source address} 的数据包(或回复)。
2.不想endpoint看到原来的ip地址,不想修改路由表,添加

IPTABLES -t nat -A POSTROUTING -s {source address} -j MASQUERADE

在这种情况下,LAN 客户端将只能看到 {local gateway} 地址。

在任何情况下,不要忘记通过以下方式伪装所有从本地网络发送到远程地址的数据包:

IPTABLES -t nat -A POSTROUTING !-d 192.168.0.0/16 -j MASQUERADE
  1. 您希望保留源地址和目标地址以供进一步处理。在这种情况下,您的 {local gateway} 将只是数据包路由的一部分,而 {local address} 必须只是下一跳 - 为此使用策略路由。

首先,添加自己的低于252标签的路由表到/etc/iproute2/rt_tables

然后 - 您可以将 {source address} 的规则直接添加到规则集或标记来自 {source address} 的数据包 - 这两种方法都将为该数据包查找您的自定义路由表:

ip rule add from {source address} table custom_table

或者

iptables -t mangle -A PREROUTING -s {source address} -j MARK --set-mark 1
ip rule add fwmark 1 table custom_table

然后,为这些数据包创建 {local address} 下一跳网关:

ip route add default via {local address} table custom_table

当然,POSTROUTING链将在数据包退出之前应用,如果需要,您可以调整源地址。

于 2013-11-13T11:26:31.240 回答
0

只需删除最后一条规则(不要执行 SNAT)。或者通过添加 -o eth0 条件(假设 eth0 是外部接口)来限制 SNAT 仅允许伪装您的 LAN 客户端:

iptables -t nat -A POSTROUTING -p tcp -o eth0 --dport 8000 -d 192.168.1.20 -j SNAT --to 192.168.1.10
于 2013-02-14T20:15:31.907 回答