具有多个 WAN 接口的 Squid 反向代理

具有多个 WAN 接口的 Squid 反向代理

我有以下设置:

  • 两条 WAN 线路,每条线路都有一个静态公共 IP,均连接到单独的路由器,提供两个内部网络(net1 和 net2)
  • 一台安装了 squid 3.3.8(使用 --enable-ssl 编译)的 Ubuntu 14.04 LTS 服务器,具有两个接口,位于每个网络中,以 net1 作为默认网关
  • squid 对位于 net1 或 net2 的一些服务器进行反向代理
  • 每个 WAN-IP 上有两个带有 A 记录的子域名
  • 两个路由器上的端口 80 和 443 的端口转发指向 squid 服务器的相应 IP

为了更好地理解: sub1.domain.tld-->WAN1--ROUTER1--net1--SERVER1 | SQUID | sub2.domain.tld-->WAN2--ROUTER2--net2--SERVER2

我的问题:

  • 访问sub1.域名.tld来自互联网的工作方式符合预期,也显示在 access.log 中
  • 访问sub2.域名.tld来自互联网导致超时,日志中不显示任何内容
  • 强迫sub2.域名.tld通过客户端的 hosts 文件访问 wan1 的 ip,一切正常,也显示在 access.log 中
  • 另外,将网关从 eth0 切换到 eth0(使用相应的网关 ip)一切正常,也显示在 access.log 中

看起来从 squid 返回的数据包总是采用默认路由。

如何解决这个问题并使两个 WAN 路由都能正常工作?

我尝试使用tcp_outgoing_address但没有成功:

tcp_outgoing_address 192.168.1.123 localnet1
tcp_outgoing_address 192.168.2.123 localnet2

明确绑定到特定 IP 也无济于事:

http_port 192.168.1.123:80 accel defaultsite=sub1.domain.tld
https_port 192.168.1.123:443 accel cert=/etc/ssl/certs/domain.tld.crt key=/etc/ssl/private/domain.tld.key defaultsite=sub1.domain.tld
http_port 192.168.2.123:80 accel defaultsite=sub2.domain.tld
https_port 192.168.2.123:443 accel cert=/etc/ssl/certs/domain.tld.crt key=/etc/ssl/private/domain.tld.key defaultsite=sub2.domain.tld

谢谢你的帮助!


相应的配置如下:

/etc/网络/接口鱿鱼服务器:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.1.123
        netmask 255.255.255.0
        gateway 192.168.1.1
        dns-nameservers 192.168.1.1

    auto eth1
    iface eth1 inet static
        address 192.168.2.123
        netmask 255.255.255.0
        dns-nameservers 192.168.2.1

/etc/squid3/squid.conf

# define some ACL aliases
acl localnet1 src 192.168.1.0/24
acl localnet2 src 192.168.2.0/24
acl allsrc src all
acl safeports port 80 443
acl sslports port 443  
acl purge method PURGE
acl connect method CONNECT
acl HTTP proto HTTP
acl HTTPS proto HTTPS

# restrict management options
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge

# block non-safe ports
http_access deny !safeports
http_access deny CONNECT !sslports

# define ports and certs
http_port 80 accel defaultsite=sub1.domain.tld
https_port 443 accel cert=/etc/ssl/certs/domain.tld.crt key=/etc/ssl/private/domain.tld.key defaultsite=sub1.domain.tld

# define peers
cache_peer 192.168.1.234 parent 443 0 proxy-only no-query no-digest originserver login=PASSTHRU connection-auth=on ssl sslflags=DONT_VERIFY_PEER front-end-https=on name=server1
cache_peer 192.168.2.234 parent 443 0 proxy-only no-query no-digest originserver login=PASSTHRU connection-auth=on ssl sslflags=DONT_VERIFY_PEER front-end-https=on name=server2

# define uris
acl server1_acl url_regex -i ^https://sub1.domain.tld/*$
acl server2_acl url_regex -i ^https://sub2.domain.tld/*$

# bind peers to acls and block direct access
never_direct allow server1_acl 
http_access allow server1_acl  
cache_peer_access server1 allow server1_acl

never_direct allow server2_acl 
http_access allow server2_acl  
cache_peer_access server2 allow server2_acl

# handle unhandled connections
deny_info TCP_RESET allsrc
http_access allow localnet1
http_access allow localnet2
http_access deny allsrc

答案1

好的,找到问题了:路由问题......

就像我以为的那样,所有传出的数据包都通过 eth0 发送。可以通过设置其他路由来解决此问题:

添加新的路由表:

echo 1 rt2 >> >> /etc/iproute2/rt_tables

配置新路线:

ip route add 192.168.2.0/24 dev eth1 src 192.168.178.123 table rt2
ip route add default via 192.168.2.1 dev eth1 table rt2
ip rule add from 192.168.2.123/32 table rt2
ip rule add to 192.168.2.123/32 table rt2

要使此内容持久包含在 eth1 的 /etc/network/interfaces 中

post-up ip route add 192.168.2.0/24 dev eth1 src 192.168.178.123 table rt2
post-up ip route add default via 192.168.2.1 dev eth1 table rt2
post-up ip rule add from 192.168.2.123/32 table rt2
post-up ip rule add to 192.168.2.123/32 table rt2

致谢:

相关内容