我有以下设置:
- 两条 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
致谢: