我可以在 Varnish 服务器上使用 iptables 将 HTTPS 流量转发到特定服务器吗?

我可以在 Varnish 服务器上使用 iptables 将 HTTPS 流量转发到特定服务器吗?

我们使用 Varnish 作为前端 Web 缓存和负载平衡器,因此我们的开发环境中有一个 Linux 服务器,在一对 Windows 2008 IIS Web 服务器上运行 Varnish 并使用一些基本的缓存和负载平衡规则。

我们有一个通配符 DNS 规则,将 *.development 指向这个 Varnish 框,这样我们就可以浏览http://www.mysite.com.developmenthttp://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

相关内容