如何在没有MASQUERADE的情况下将外部IP路由到内部

好的,我还在创build一个dmz'd http服务器

所以现在我有一个使用ssh -w 0:0的以太网隧道,并且每端都有可以相互通信的接口:

以前的问题


所以现在我正在努力让这个http服务器对外部networking可见。 这是完整的设置

所以我创build一个新的EC2实例,并运行设置:

来源./HOST

 scp -i green.pem服务器/ * root @ $ HOST:
 ssh -i green.pem root @ $ HOST ./setup

它依次运行远程机器上的设置:

 apt-get更新
 apt-get install telnet

回声1 |  tee / proc / sys / net / ipv4 / ip_forward
 echo“PermitTunnel yes”>> / etc / ssh / sshd_config
 /etc/init.d/ssh重启

然后我启动SSH连接:

sudo ./runserver $ HOST:

 HOST = $ 1
 ssh -i green.pem root @ $ HOST -w 0:0 -o Tunnel = ethernet -o ServerAliveInterval = 60

然后在该ssh术语里面我开始路由iptables转发:

 #####
 #服务器路由
 #调出水龙头
 ifconfig tap0向上
 #通过它路由所有的通信192.168.2。*
 ip route add 192.168.2.0/24 dev tap0

 #####
 #服务器iptables
 REMOTE_INTERNAL_IP = $ 1

 iptables -F
 iptables -t nat -F

 ### end init防火墙..启动DMZ的东西####
 #在DMZ和LAN之间转发stream量
 iptables -A FORWARD -i eth0 -o tap0 -m状态 - 状态NEW,ESTABLISHED,RELATED -j ACCEPT
 iptables -A FORWARD -i tap0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

 #将进入的端口路由到DMZ服务器192.168.2.1
 iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8000 -j DNAT  - 到目的地192.168.2.1:8000
 iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT  - 到$ REMOTE_INTERNAL_IP
 ###结束DMZ ..添加其他规则###

最后在客户端添加路由和端口转发


 ##########
 #客户
 HOST = $ 1

 #调出水龙头
 ifconfig tap0向上
 #把一个IP,所以我们可以听
 ifconfig tap0 192.168.2.1
为我们的ssh添加一个显式路由
 ip route通过192.168.1.1 dev eth0添加$ HOST

 #使点击默认路由
 ip路由replace默认开发tap0
 #删除默认链接
 #ip route del 192.168.2.0/24 dev tap0 proto kernel scope link src 192.168.2.1

并启动Web服务器

 python -m SimpleHTTPServer

当我从任一服务器做telnet 192.168.2.1它通过罚款。 但如果我做一个telnet $ THE_REAL_IP它不起作用。

如果我把一个MASQUERADE iptables规则,那么它的function很好,但我正在这样做,以避免MASQUERADE。 我想让源IP保留在数据包上。


任何想法我做错了什么?

—–


更多信息

—–


好吧,现在我已经尝试了更多的尝试。 而且还是没有用。

我认为可能会起作用的是将其添加到客户端:

 #这些应该将数据包路由回tap0
 ip规则添加从192.168.2.0/24表42
 ip route add default dev tap0 table 42

因为这应该为所有为192.168.2.1写的东西强加规则应该通过tap0接口返回。 但不幸的是,它不工作。

另外我试着把一个ip和远程端的tap0关联起来。

 ifconfig tap0 192.168.2.5

这似乎很有趣,因为现在我不需要设置路由,系统似乎几乎可以自动完成:

 #####
 #服务器路由
 #调出水龙头
 ifconfig tap0 192.168.2.5
 ifconfig tap0向上
 #通过它路由所有的通信192.168.2。*
 ip route add 192.168.2.0/24 dev tap0


 #####
 #服务器iptables

 iptables -F
 iptables -t nat -F

 #在DMZ和LAN之间转发stream量
 iptables -A FORWARD -i eth0 -o tap0 -m状态 - 状态NEW,ESTABLISHED,RELATED -j ACCEPT
 iptables -A FORWARD -i tap0 -o eth0 -m状态 - 状态NEW,ESTABLISHED,RELATED -j ACCEPT

 #将进入的端口路由到DMZ服务器192.168.2.1
 iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8000 -j DNAT  - 到目的地192.168.2.1:8000
 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

 ###结束服务器####

 #############################
 #############################

 ##########
 #客户
回声1 |  tee / proc / sys / net / ipv4 / ip_forward

 #调出水龙头
 ifconfig tap0向上
 #把一个IP,所以我们可以听
 ifconfig tap0 192.168.2.1

 #这些应该将数据包路由回tap0
 #但他们实际上没有任何区别
 #ip规则添加从192.168.2.0/24表42
 #ip路由添加默认开发tap0表42

我意识到你说你想保持原来的IP地址到你的Python服务器,但是你可能会在这里采取错误的方法。 在X-Forwarded-For报头中通过HTTP传递原始IP地址是标准做法。 大多数Web框架将会select这个头部,并在指定的地方使用原始IP地址。

如果你想走这条路,你只需要一个前端Web服务器。 无论如何,拥有前端是一个好主意:它更安全,因为没有人可以直接访问你的应用服务器,并且你可以很容易地实现像HTTPS和caching这样的服务,而不需要在应用服务器上占用更多的CPU周期。 像Nginx这样的东西会做的漂亮。

如果您使用DNAT而不是MASQUERADE那么您应该保持传入数据包上的源IP地址。

当然对于DNAT来说,由于源地址没有被改变,所以你需要小心地确保另一端知道以相同的方式发回响应数据包 – 在你的情况下,退出隧道而不是通过公共接口默认网关。