LINUX.ORG.RU
ФорумAdmin

НАТ и маршрутизация между интерфейсами сервера (eth tun)

 


0

1

Доброго времени суток!

Есть два сервера (впс) имеющие белые ип адреса и находящееся не в одной подсети. Пусть они будут иметь адреса 1.2.4.5 и 6.7.8.9 (оба адреса на eth0). Сервера связаны между собой туннелем ipip, т.е. у каждого сервера поднят интерфейс tun0. У первого сервера ип на tun0 - 10.1.1.1, у второго - 10.1.1.2. По туннелю пакеты бегают - все нормально. У обоих серверов в иптаблесе дефолтные политики в ACCEPT. Маршрутизация разрешена. Мне необходимо пробросить запрос на 80-порт со второго сервера, через туннель и первый сервер в инет. Для этого на втором сервере делаем следующее:

-------------------------------------------------------

echo «0» > /proc/sys/net/ipv4/conf/tun0/rp_filter

iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 0x2

ip route add default via 10.1.1.1 dev tun0 table 102

ip rule add fwmark 0x2/0x2 lookup 102

-------------------------------------------------------

На первом сервере:

-------------------------------------------------------

echo «1» > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -p tcp -o eth0 --dport 80 -j SNAT --to-source 1.2.4.5

(или вместо SNAT ставлю маскарад - на результат не влияет)

iptables -t mangle -A PREROUTING -p tcp -i eth0 --sport 80 -j MARK --set-mark 0x2

ip route add default via 10.1.1.2 dev tun0 table 102

ip rule add fwmark 0x2/0x2 lookup 102

-------------------------------------------------------

Со второго сервера делаем запрос на 80 порт любым способом (телнетом, курлом).

Если на первом сервере запустить что-то вида tcpdump -nn -i tun0 tcp port 80, то увидим пакеты которые чешут через туннель на 80 порт. Примерно так:

listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes

21:14:10.821618 IP 6.7.8.9.59062 > 95.82.154.42.80: Flags [ S ] , seq 2930093569, win 14600, options [ mss 1460, sackOK, TS val 7033099 ecr 0,nop,wscale 7 ], length 0

. . . .

Если запустить tcpdump -nn -i eth0 tcp port 80, то никаких пакетов излучаться не будет - тишина.

Т.е. нат в построутинге не срабатывает. Если сделать iptables -vnL -t nat --line-numbers , то видно, что нужной цепочке пакеты не шли. Судя по всему проскакивает один пакет и на этом все. Соответственно, соединение не происходит.

Первый сервер на убунту 16.04 (поднят с 14.04), второй - центос 6.8.

Прошу помочь в решении проблемы.



Последнее исправление: lukemarlos (всего исправлений: 6)

Наискосок, посмотрите что у вас с правилами iptables на первом, может forward где-то дропает.

anc ★★★★★
()

Точно работать не может из за "--sport 80".

Но вообще сама суть реализации кривая. Маршрутизацию по источнику должен использовать только тот, кому надо выбрать маршрут по какому-либо условию. Когда же маршрут выбран, то далее должна работать просто маршрутизация. Вторая сторона правильно не должна даже догадываться, что у «клиента» есть второй канал, это ни к чему, ибо это ничего кроме ручной реализации маршрутизации с нагрузкой на процессор не даст. С аналогией провайдинга - если клиент оплачивает канал, то наличие второго это чисто маркетинговая заморочка «вот же неблагодарный, юзает ещё канал у другого провайдера», а не техническая. С технической стороны маршрутизацией по источнику и NAT-ом должен заниматься только один ваш сервер.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.