По историческим причинам я установил балансировщик нагрузки LVS на SLES, используя «перенаправитель», написанный мной. Этот перенаправитель будет принимать пакеты UDP на один адрес: порт и отправлять их на другой. Соответственно, ответы будут отправлены сначала перенаправителю, а затем обратно инициатору запроса. Вместе с какой-то специальной проверочной программой, которая работала.
Однако все это было лишь обходным решением, пока я не смог выполнить NAT пакетов с помощью iptables в SLES 12.
Я попробовал настроить, но не работает. Что работает, так это перенаправление удаленных пакетов на локальный адрес: порт и перенаправление локального адреса: порта на внешний адрес: порт.
Скорее всего мне не хватает какой-то настройки iptables. Также мне не совсем понятно, нужно ли включать пересылку и когда. Итак, вот некоторые настройки конфигурации.
Во-первых, конфигурация ldirector для перенаправления DNS (пожалуйста, не обсуждайте, имеет ли смысл балансировать нагрузку на локальные DNS-серверы).
checktimeout = 5
checkinterval = 15
autoreload = yes
fork = yes
# logfile = "/var/log/ldirectord.log"
logfile = "daemon"
quiescent = yes
# DNS
virtual = 172.20.16.36:53
### For external-perl the command has to work inside "sub { ... }"
checktype = external-perl
checkcommand = "/etc/ldirectord/dnscheck.pl"
checktimeout = 10
checkinterval = 15
failurecount = 1
protocol = udp
scheduler = rr
real = 172.20.16.36:53001 masq 1
real = 172.20.16.36:53002 masq 1
Затем статус LVS:
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
UDP 172.20.16.36:53 rr
-> 172.20.16.36:53001 Masq 1 0 0
-> 172.20.16.36:53002 Masq 1 0 0
Далее настройка iptables с помощью брандмауэра SUSE:
# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED
input_int all -- 0.0.0.0/0 0.0.0.0/0
input_int all -- 0.0.0.0/0 0.0.0.0/0
input_int all -- 0.0.0.0/0 0.0.0.0/0
input_ext all -- 0.0.0.0/0 0.0.0.0/0
LOG all -- 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 5 LOG flags 6 level 4 prefix "SFW2-IN-ILL-TARGET "
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP)
target prot opt source destination
LOG all -- 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 5 LOG flags 6 level 4 prefix "SFW2-FWD-ILL-ROUTING "
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain forward_ext (0 references)
target prot opt source destination
Chain forward_int (0 references)
target prot opt source destination
Chain input_ext (1 references)
target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0 PKTTYPE = broadcast
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 4
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
LOG tcp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 5 tcp dpt:5560 flags:0x17/0x02 LOG flags 6 level 4 prefix "SFW2-INext-ACC-TCP "
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:5560
LOG tcp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 5 tcp dpt:22 flags:0x17/0x02 LOG flags 6 level 4 prefix "SFW2-INext-ACC-TCP "
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
DROP all -- 0.0.0.0/0 0.0.0.0/0 /* sfw2.insert.pos */ PKTTYPE != unicast
LOG tcp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 5 tcp flags:0x17/0x02 LOG flags 6 level 4 prefix "SFW2-INext-DROP-DEFLT "
LOG icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 5 LOG flags 6 level 4 prefix "SFW2-INext-DROP-DEFLT "
LOG udp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 5 ctstate NEW LOG flags 6 level 4 prefix "SFW2-INext-DROP-DEFLT "
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain input_int (3 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain reject_func (0 references)
target prot opt source destination
REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 reject-with tcp-reset
REJECT udp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-proto-unreachable
Я также пытался отследить поток пакетов, используя:
# iptables -t raw -D PREROUTING -p udp -d 172.20.2.1 --dport 53 -j TRACE
# iptables -t raw -A PREROUTING -p udp -d 172.20.2.1 --dport 53 -j TRACE
# iptables -t raw -A PREROUTING -p udp -d 172.20.2.2 --dport 53 -j TRACE
Что я получил от него (слегка отфильтровал и переформатировал):
[5535166.799140] 9211 raw:PREROUTING:policy:2 DST=172.20.16.6 SRC=172.20.2.1 SPT=53 PROTO=UDP IN=bond0 DPT=44632
[5535166.799172] 9211 filter:INPUT:rule:2 DST=172.20.16.6 SRC=172.20.2.1 SPT=53 PROTO=UDP IN=bond0 DPT=44632
(второй столбец - ID=
стоимость)
Так что, отсутствует какое-то правило iptables или мне нужно что-то изменить?
Стоит ли добавлять в iptables больше статов TRACE?