DNAT с использованием iptables работает только для трафика, входящего на eth0

У меня есть машина с двумя интерфейсами, которые имеют разные маршрутизируемые адреса IPv4. Чтобы вернуть трафик на правильный интерфейс, я использовал этот ответ и комментарий , и он работает: я могу подключиться к машине по ssh, используя любой IP-адрес. (Не знаю, окажет ли это какое-либо влияние, но может.)

Теперь я добавил следующие правила iptables для обратного проксирования / DNAT , используя этот ответ . Мой сценарий загрузки теперь выглядит так:

# eth0 is automatically brought up and gets 192.168.1.2 as IP

sudo ip link set eth1 up
sudo ip addr add 192.168.2.2/24 dev eth1
sudo ip rule add from 192.168.2.2 table frometh1
sudo ip route add default via 192.168.2.1 dev eth1 table frometh1

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.1:443
sudo iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.1:443
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

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

Изначально -i eth * не указывалось, а правило DNAT представляло собой всего одну команду. Правила MASQUERADE также были одной командой путем замены -o eth * на -d 10.0.0.1 . Я разделил их, пытаясь сделать интерфейсы явными, на случай, если iptables неявно использует один из интерфейсов.

Когда я пытаюсь достичь 192.168.1.2:443 , трафик перенаправляется и маскируется, как ожидалось . Счетчик попаданий для правильного правила DNAT в таблице PREROUTING увеличивается, а правильное правило MASQUERADE увеличивается. Я могу успешно установить TCP-соединение.

При попытке достичь 192.168.2.2:443 я вижу трафик, входящий на интерфейс, а счетчик попаданий для правильного правила DNAT в таблице PREROUTING равен увеличился. Но исходящего пакета нет, и ни одно из двух правил MASQUERADE в POSTROUTING не увеличивается. TCP SYN никогда не достигает удаленной системы ( 10.0.0.1 ).

Обратите внимание, что не имеет значения, происходит ли пересылка через eth0 или eth1, можно перенаправить трафик на цель ( 10.0.0.1 ) через eth0 или eth1.

Почему правила iptables работают только для eth0, а не для eth1?

Редактировать: Возможно, уместно знать, что проксирование в пользовательском пространстве работает нормально:

mkfifo /tmp/fifo
sudo nc -kvlp 443 </tmp/fifo | nc 10.0.0.1 443 >/tmp/fifo

Позволяет трафику проходить в обоих направлениях, , как описано в этом блоге . Проблема с этим решением заключается в том, что удаленный конец видит только одно постоянное TCP-соединение. Он должен видеть одно соединение для каждого клиента и обрабатывать несколько клиентов одновременно.

0
задан 29 May 2019 в 18:38
1 ответ

Əvvəlcə şəbəkə topologiyanızı çəkək.

network diagram

Düşünürəm ki, bu əks yol filtrinin yan təsiridir, çünki paketlər marşrutlaşdırma qərarı mərhələsində atılır.

Çıxışı yoxlayın nstat -az 'TcpExtIPReversePathFilter' əmrinin. Çox güman ki, çeklərdə artırılan sıfırdan sayğac göstərir.

ip marşrutunu iif eth1 komutundan götürərək marşrutu yoxlayın. etibarsız çapraz cihaz bağlantısı kimi bir şey göstərəcəyini düşünürəm.

ip netconf şou içindəki interfeyslərdə rp_filter vəziyyətini görə bilərsiniz. komanda çıxışı.

rp_filter funksiyasını söndürün və ya boş rejiminə daha yaxşı qoyun. rp_filter DDoS gücləndirmə hücumlarında geniş istifadə olunan aşağı axın şəbəkələrində ip adreslərinin saxtalaşdırılmasının qarşısını alır. Sizin vəziyyətinizdə tənzimləmə yeni riskləri əlavə etmir, çünki linux hostunuz bağlı şəbəkələr üçün əsas keçid deyil.

Quruluşunuzdakı son məsələ deyil. Mövcudsa rp_filter ilə problemi həll edin və konfiqurasiyanızın işləməsi üçün cavabı genişləndirəcəyəm.

Yeniləmə

İndi rp_filter məsələsi həll edildikdə, cəhd edək konfiqurasiyanın gözlənildiyi kimi işləməsi üçün.

Nə baş verdiyini və səhv olduğunu izah etməyə başlayaq.

  1. Müştəri hostu paketi ext2.IP ünvanına göndərir. Orijinal paket

C.IP: -> : 443

  1. Paket GW2 -ə çatır və port yönləndirməsindən keçdikdən sonra aşağıda göstərilənə bənzəyir və olacaq linux hostuna göndərilməlidir.

C.IP: -> 192.168.2.2:443

  1. Paket linux ana kompüterinə gəldikdə, DNAT qaydası təyinatı yenidən 10.0.0.1-ə yenidən yazmalıdır: 443 . İndi şəklində paketimiz var:

C.IP: -> 10.0.0.1:443 [1.1212] Yalnızca təyinat linuxun yenidən yazılmasından sonra marşrutu axtarır (marşrutlaşdırma qərarı). Paketlərdəki mənbə ünvanı hələ də orijinal olduğundan əlavə marşrut qaydanız iştirak etməyəcək və paket əsas marşrut cədvəli vasitəsilə yönləndiriləcək (güman edirəm ki, GW1 istifadə olunacaq). Məsələnin kök səbəbi bu olduğunda inkişaf etdirəcəyik.

  • Paket eth0 interfeysi vasitəsilə GW1 'ə göndərilir. Mənbə ünvanı -o eth0 -j MASQUERADE qaydası ilə yenidən yazılacaqdır. Paket:

  • 192.168.1.2: -> 10.0.0.1:443 şəklində GW1 təyinat MAC ünvanı ilə çevriləcəkdir.

    1. GW1 əlavə paketi yenidən yazmaqla bu paketi xarici şəbəkəyə yönəldir.

    : -> 10.0.0.1:443

    1. Uzaq sistem paketi alır, idarə edir və üzərində cavab verir. tcp datagram ilə bayraqlarla SYN-ACK . Cavab belə görünür:

    10.0.0.1:443 -> :

    1. GW1 cavabı alır, təyinat ünvanının tərs ünvan tərcüməsini edir və cavabı daha sonra linux hostuna göndərir:

    10.0.0.1:443 -> 192.168.1.2:

    1. Nəhayət linux hostu SYN-ACK cavabını alır, əks ünvan tərcüməsini də edir və cavabı daha da irəli aparmaq üçün marşrutu axtarmağa çalışır. Ancaq bu addımdan sonra bir şey səhv olur, ancaq bu, sadəcə addımdakı məsələnin nəticəsidir 4 . Daha yaxşı başa düşmək üçün firewall qayda dəstini yoxlamalısınız.

    10.0.0.1:443 -> :

    Çözüm

    Əsas məqsəd paketləri eyni yoldan geri qaytarmaqdır. bu paketlərin alındığı interfeys. Bunu etmək üçün sadə marşrut qaydalarından istifadə edəcəyik.

    1. İki əlavə marşrut cədvəlini yaradın (hər bir uplink kanalı üçün)
    ip route add 192.168.1.0/24 dev eth0 table 10
    ip route add 0/0 via 192.168.1.1 dev eth0 table 10
    
    ip route add 192.168.2.0/24 dev eth1 table 11
    ip route add 0/0 via 192.168.2.1 dev eth1 table 11
    
    1. Marşrut qaydalarını giriş interfeysi ilə uyğunlaşdırın:
    ip rule add iif eth0 lookup 10 pref 1010
    ip rule add iif eth1 lookup 11 pref 1011
    

    Xüsusi olaraq alınan bütün paketlər. interfeys, yalnız tək interfeys üçün marşrutların olduğu məhdud marşrutlaşdırma cədvəli ilə yönləndiriləcəkdir. Ən sadə həll, lakin linux sahibinin paketləri interfeyslər arasında ötürmə qabiliyyətini aradan qaldırır ( eth0 -dan eth1 və əksinə). Bu sizin üçün uyğun deyilsə, başqa bir yol var, amma daha mürəkkəbdir. Ehtiyacınız olarsa izah edərəm.

    1
    ответ дан 4 December 2019 в 15:42

    Теги

    Похожие вопросы