好的,我还在创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来说,由于源地址没有被改变,所以你需要小心地确保另一端知道以相同的方式发回响应数据包 – 在你的情况下,退出隧道而不是通过公共接口默认网关。