2013-02-14 175 views
2

我在专用的ubuntu服务器上有一个防火墙(基于iptables)。 我有几个局域网客户端。与iptables转发端口到其他客户端,但与原始发件人ip识别

在我的一个LAN客户端上,我运行的软件可以根据IP来限制访问。 对我来说,重要的是我可以通过使用广域网IP而不是局域网IP来限制它。

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

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

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

让我们更清楚:

服务器LAN IP:192.168.1.10 服务器端口:8080

应该被转发到: 客户LAN IP:192.168.1.20 客户LAN端口: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。

我可以修复...吗?

回答

0

只要删除最后一条规则(不要做SNAT)。 或限制SNAT加入-o eth0的条件alloving只有你的局域网的客户masquarading(假定为eth0是外部接口):

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

当我删除最后一条规则时,它不再工作。请记住,它是一个双向连接,所以还应该发回一个数据包。所以我觉得我需要冒险。 – 2013-02-14 21:12:01

+0

然后通过接口拆分正在发送的SNAT规则,为传出的数据包做SNAT,但保留原来的srcIP。 – 2013-02-15 08:06:42

4

你的最后一条规则是一样的伪装规则。

如:

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

随着MASQUERADE或SNAT,你是因为它经历了第一台服务器修改源IP地址。第二台服务器看到数据包并将其响应发送回该IP,然后将该数据发送回客户端。

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

客户端>网关> iptables的路由器>服务器(见0.10)>的iptables-路由器>网关>客户端

如果去掉伪装/ SNAT,服务器看到的真实IP,但是当它发出的回复,数据包将转到它的默认网关(默认路由),这可能是您的数据中心的路由器或网关。客户端从它不知道的IP地址获得响应,并且不知道如何处理它,因此它看起来不起作用。或者,网关/计算机看到没有关联连接的SYNACK并丢弃数据包。

客户端>网关> iptables的路由器>服务器>网关(DROP)或>客户端(DROP)

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

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

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

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

客户端>网关> iptables的路由器>服务器(看到X-原始-IP报头)>的iptables-路由器>网关>客户端

最好的问候, 尼尔

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} 

这会告诉你的终点通过{本地网关}发送{源地址}的数据包(或回复)。
2.你不想端点看到原来的IP地址,并且不希望修改路由表,再加入

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

在这种情况下,LAN客户端只能看到{本地网关}地址。

在任何情况下,不要忘记伪装被从你的本地网络通过将远程地址的所有数据包:

IPTABLES -t nat -A POSTROUTING !-d 192.168.0.0/16 -j MASQUERADE 
  • 您想保留源地址和目的地地址作进一步处理。在这种情况下,您的{本地网关}只是分组路由的一部分,{本地地址}必须只是下一跳 - 为此使用策略路由。
  • 首先,低于252的标签添加自己的路由表来/etc/iproute2/rt_tables

    那么 - 你可以为{源地址}直接设定规则添加规则或标记从{源地址}包 - 这两种方法将查找您的自定义路由表中的数据包:

    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 
    

    而N,使这些数据包{本地地址}下一跳网关:

    ip route add default via {local address} table custom_table 
    

    当然,POSTROUTING链将只包出口前被应用,如果需要的话,你可以塑造你的源地址。

    相关问题