我们使用 Varnish 作为前端 Web 缓存和负载平衡器,因此我们的开发环境中有一个 Linux 服务器,在一对 Windows 2008 IIS Web 服务器上运行 Varnish 并使用一些基本的缓存和负载平衡规则。
我们有一个通配符 DNS 规则,将 *.development 指向这个 Varnish 框,这样我们就可以浏览http://www.mysite.com.development,http://www.othersite.com.development等。问题是,由于 Varnish 无法处理 HTTPS 流量,我们无法访问https://www.mysite.com.development/
对于开发/测试,我们不需要任何加速或负载平衡——我只需要告诉这个盒子充当一个哑代理,并将端口 443 上的任何传入请求转发到特定的 IIS 服务器。我怀疑 iptables 可能提供了一个解决方案,但我已经很久没有写过 iptables 规则了。一些最初的黑客攻击让我
iptables -F
iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to 10.0.0.241:443
iptables -t nat -A POSTROUTING -p tcp -d 10.0.0.241 --dport 443 -j MASQUERADE
iptables -A INPUT -j LOG --log-level 4 --log-prefix 'PreRouting '
iptables -A OUTPUT -j LOG --log-level 4 --log-prefix 'PostRouting '
iptables-save > /etc/iptables.rules
(其中 10.0.0.241 是托管 HTTPS 网站的 IIS 框),但这似乎不起作用。
澄清一下 - 我意识到 HTTPS 代理/缓存存在安全隐患 - 我所寻找的只是完全透明的 IP 流量转发。我不需要解密、缓存或检查任何数据包;我只希望端口 443 上的任何内容都通过 Linux 机器流到其后面的 IIS 机器,就好像 Linux 机器根本不存在一样。
任何帮助都深表感谢...
编辑:包含完整的 iptables 配置脚本。
答案1
以下是将流量从一台主机重定向到特定端口的另一台主机的操作,请注意,对端口 443 的每个请求都将重定向到您在 iptables 上指向的主机:
1)开放 443 端口:
iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
2)添加特定规则以重定向传入和传出数据
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to ip.listenig.to:443
iptables -t nat -A POSTROUTING -p tcp -d ip.listening.to --dport 443 -j MASQUERADE
3)或者,您可以重定向来自特定主机的流量,例如:
iptables -t nat -A PREROUTING -s ip._not_.listening -p tcp --dport 443 -j DNAT --to-destination ip.listening.to:443
(如果您想处理网络下其他客户端的端口 443,此步骤特别有用)
4)通知内核你将接受ip转发
编辑文件/etc/sysctl.conf(或适合您的发行版的版本)并附加(或更改)
net.ipv4.ip_forward=1
然后发出命令
sysctl -p /etc/sysctl.conf (or the file that suits your distro)
我希望它有所帮助
答案2
好的,这是完整的解决方案 - 这是基于 12.04 LTS(GNU/Linux 3.2.0-23-generic x86_64)
首先,我必须通过编辑 /etc/sysctl.conf 并取消注释该行来启用 ip4 端口转发:
net.ipv4.ip_forward=1
然后我必须运行/sbin/sysctl -p
才能使此更改生效。
接下来配置(并捕获)iptables
规则脚本:
# flush any existing rules
iptables -F
# Configure iptables to allow incoming traffic on port 443
iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
# Configure iptables to allow outgoing traffic on port 443
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
# Configure iptables to NAT incoming 443 traffic to 10.0.0.241:443
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to 10.0.0.241:443
# Configure iptables to route responses from these requests back to the original requester
iptables -t nat -A POSTROUTING -p tcp -d 10.0.0.241 --dport 443 -j MASQUERADE
# Dump the ruleset and save it into the file /etc/iptables.rules
iptables-save > /etc/iptables.rules
最后,为了使更改在重启后仍然存在,我必须编辑 /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 10.0.0.240
netmask 255.255.255.0
network 10.0.0.0
broadcast 10.0.0.255
gateway 10.0.0.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 192.168.0.11
dns-search spotmain.com
# The next line was added to enable iptables rules on system restart
pre-up iptables-restore < /etc/iptables.rules