Ubuntu 14.04でTPROXYを使用して、HAProxyを完全に透過的なプロキシとして使用しようとしています。 HAProxyは、eth0
111.111.250.250
およびeth1
10.111.128.134
を使用して最初のサーバーにセットアップされます。単一のバランスの取れたサーバーには、eth1
とeth0
もあります。 eth0
はパブリックに面したネットワークインターフェイスであり、eth1
は両方のサーバーが存在するプライベートネットワーク用です。
問題:バランスサーバーのポート1234に直接(eth1
経由で)接続できますが、Haproxyポート1234(eth0
経由で1234にリダイレクト)経由でバランスサーバーに到達できません。この構成で何かが欠けていますか?
source 0.0.0.0 usesrc clientip
から/etc/haproxy/haproxy.cfg
行を削除すると、haproxyは機能しますが、透過的には機能しません。
HAProxyサーバー上
現在のカーネルは3.13.0-24-generic
です。 iptables v1.4.21
が使用されています。これはTPROXYをサポートしていると思いますが、確認方法がわかりません。
カーネルはTPROXYをサポートしているようです。
# grep TPROXY /boot/config-3.13.0-24-generic
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
HAProxyはTPROXYサポートでコンパイルされました:
haproxy -vv
HA-Proxy version 1.5.3 2014/07/25
Copyright 2000-2014 Willy Tarreau <[email protected]>
Build options :
TARGET = linux26
CPU = x86_64
CC = gcc
CFLAGS = -g -fno-strict-aliasing
OPTIONS = USE_LINUX_TPROXY=1 USE_LIBCRYPT=1 USE_STATIC_PCRE=1
Default settings :
maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200
Encrypted password support via crypt(3): yes
Built without zlib support (USE_ZLIB not set)
Compression algorithms supported : identity
Built without OpenSSL support (USE_OPENSSL not set)
Built with PCRE version : 8.31 2012-07-06
PCRE library supports JIT : no (USE_PCRE_JIT not set)
Built with transparent proxy support using: IP_TRANSPARENT IPV6_TRANSPARENT IP_FREEBIND
Available polling systems :
epoll : pref=300, test result OK
poll : pref=200, test result OK
select : pref=150, test result OK
Total: 3 (3 usable), will use epoll.
/etc/haproxy/haproxy.cfg
で、次のオプションを持つようにポートを構成しました。
listen test1235 :1234
mode tcp
option tcplog
balance leastconn
source 0.0.0.0 usesrc clientip
server balanced1 10.111.163.76:1234 check inter 5s rise 2 fall 4 weight 4
次のiptables
ルールが追加されました
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 111
iptables -t mangle -A DIVERT -j ACCEPT
ip rule add fwmark 111 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
Sudo ip route flush cache
そして
echo 1 >/proc/sys/net/ipv4/ip_forward
バランスサーバー上
/etc/networking/interfaces
で、eth1
のゲートウェイをHAProxyボックス10.111.128.134
に設定し、ネットワークを再起動しました。
auto eth0 eth1
iface eth0 inet static
address 111.111.250.250
netmask 255.255.224.0
gateway 111.131.224.1
dns-nameservers 8.8.4.4 8.8.8.8 209.244.0.3
iface eth1 inet static
address 10.111.163.76
netmask 255.255.0.0
gateway 10.111.128.134
ip route
は以下を提供します:
default via 111.111.224.1 dev eth0
10.111.0.0/16 dev eth1 proto kernel scope link src 10.111.163.76
111.111.224.0/19 dev eth0 proto kernel scope link src 111.111.250.250
あなたの問題は転送またはNATルールがないことに関連していると思いますが、eth0 <-> eth1間でトラフィックを転送する転送ルールが必要です。
すなわち:
Chain FORWARD (policy ACCEPT 7601 packets, 661K bytes)
pkts bytes target prot opt in out source destination
18M 47G ACCEPT all -- eth1 eth0 0.0.0.0/0 0.0.0.0/0
17M 2922M ACCEPT all -- eth0 eth1 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
また、以前に私が気を悪くしたことの1つは、複数のデバイスを使用しているときにマングルテーブルでインターフェイスデバイスを指定することでした。
Chain PREROUTING (policy ACCEPT 35M packets, 50G bytes)
pkts bytes target prot opt in out source destination
59M 52G divert tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 socket
Eth1を指定してはいけない場合は、eth0/eth1、さらにはbond0&eth1を使用しているためです。
最後に、ナッティングルールがあることを確認する必要があります。
Chain POSTROUTING (policy ACCEPT 1420K packets, 85M bytes)
pkts bytes target prot opt in out source destination
1K 494M PUBLICSNAT all -- * eth1 0.0.0.0/0 0.0.0.0/0
Chain PUBLICSNAT (1 references)
pkts bytes target prot opt in out source destination
1K 494M SNAT all -- * eth1 10.1.1.0/24 0.0.0.0/0 to:8.8.8.8-8.8.8.10
1K 336K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0