У меня есть машина с двумя интерфейсами, которые имеют разные маршрутизируемые адреса 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-соединение. Он должен видеть одно соединение для каждого клиента и обрабатывать несколько клиентов одновременно.
Əvvəlcə şəbəkə topologiyanızı çəkək.
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
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.
İ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.
ext2.IP
ünvanına göndərir. Orijinal paket C.IP:
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:
10.0.0.1-ə yenidən yazmalıdır: 443
. İndi şəklində paketimiz var: C.IP:
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:
şəklində GW1
təyinat MAC ünvanı ilə çevriləcəkdir.
GW1
əlavə paketi yenidən yazmaqla bu paketi xarici şəbəkəyə yönəldir.
SYN-ACK
. Cavab belə görünür: 10.0.0.1:443 ->
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:
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 ->
Ə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.
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
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.