iptables --set-mark - Farklı bağlantı noktalarını farklı arabirimler üzerinden yönlendirin


16

Kısa öykü,
3 arayüz, eth0 (LAN), eth1 (ADSL), eth2 (4G).
eth0 -> eth1: İşler
(port 80, 443, 4070) eth0 -> eth2: Olmaz


Bu, fikrin grafiksel bir temsilidir:

Liman 80 & 443 üzeri eth2
karınca dinlenme yoluyla eth1
resim açıklamasını buraya girin

Netscheme:

eth0: -ip 10.0.0.1 -net 10.0.0.0/8 -gw 10.0.0.1 (the servers own intf) 
eth1: -ip 192.168.1.74 -net 192.168.1.0/24 -gw 192.168.1.254 
eth2: -ip 192.168.1.91 -net 192.168.0.0/24 -gw 192.168.0.1 






Bu yeni senaryo 22 ve 4070'i uygun tabloya yönlendiriyor.
Bununla birlikte, bu tabloya ulaştıktan sonra eth2'ye yönlendirilmez.




Bu komut dosyası 22 ve 4070 hariç çalışır!

(Bağlantı noktası 80 yorumlanmamıştır ve çalışır ancak yanlış olan eth1 aracılığıyla.)

modprobe iptable_nat
modprobe ip_conntrack

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

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -F PREROUTING
iptables -t nat -F
iptables -t mangle -F
iptables -F
# This next line restores any issues trying to connect to something
# if you get weird ACK packets when trying to connect (at least i did)!
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
ip route flush table main

iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 22 -j MARK --set-mark 1
###  iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 4070 -j MARK --set-mark 1

## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
## -- Does the same as ip route below? route add default gw 192.168.1.254


echo "201 eth2.out" >> /etc/iproute2/rt_tables

ip rule add fwmark 1 table eth2.out
ip route add default via 192.168.0.1 dev eth2 table eth2.out
ip route add default via 192.168.1.254 dev eth1



## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE









Eski komut dosyası:


  Ignore everything below unless you're interested in retracing my steps!!




Kötü bir şey yapmam durumunda ortamımı ayarlamak için bir router.sh betiği oluşturdum. 4G bağlantısına göndermek istediğim 3 bağlantı noktası var ve geri kalanı bir sabit hat ADSL bağlantısı üzerinden. Bunu yapmak için, iptables komutlarını varsayılan rotada işlemek ve benim 4G arabirimimden göndermek istiyorsanız --dport == 443 | 80 | 4070

Ancak, bu işe yaramıyor; Ne olursa olsun hala sabit telefonumdan geçiyorum.

Benim senaryom böyle görünüyor:

#!/bin/bash

## routing tables
# wireless = 4G via eth2
# adsl = adsl via eth1

modprobe iptable_nat
modprobe ip_conntrack

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

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F
ip route flush table main
ip route flush table wireless
ip route flush table adsl

## Setup routing tables
# ADSL
ip route add table adsl to 192.168.1.0/24 dev eth1
# 4G
ip route add table wireless to 192.168.0.0 dev eth2
ip rule add fwmark 0x1 table wireless

## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
route add default gw 192.168.1.254


## Forward ports into the LAN
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.0.3:80


## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1

## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -j LOG
#iptables --table nat --append POSTROUTING --out-interface eth2 --jump SNAT --to-source "192.168.1.74"
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Ben de betiğin bottomg bu 3 eklemek için çalıştım:

iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 80 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 443 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 4070 -j SNAT --to "192.168.0.91"

Ayrıca başarıyla denendi:

iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1

Son fakat en az değil, denedi:

## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1

Yönlendirme çalışıyor, internette gezinebiliyorum, müzik dinleyebiliyorum ya da değil, ama yanlış arayüz üzerinden yapıyorum. Uzun zamandır etrafta dolaştım ve ne yaptığımı ve neden yaptığımı anlamak için parçalar ve parçalar buldum. Trafik tc ile şekillendirme yapabilirdi ama iptables paketleri işaretlemek mümkün ise bana uzun bir yol yardımcı olacaktır.

Benim tahminim farklı kurallar, özellikle MASQUERADE kısmı yanlış sipariş yapmak olduğunu ? ya da orada olsa bile?

Birisi DNAT bağlantı noktasının harici bir arabirimden (bir veya iki protokol) dahili 10.0.0.0 adres alanına nasıl tcp: 80 diyeceğini açıklayabilir mi?



Çıktılar:

root@Netbridge:~# route -n Kernel IP routing table Destination    

Gateway         Genmask         Flags Metric Ref    Use Iface<br>
0.0.0.0         192.168.1.254   0.0.0.0         UG    0      0        0 eth1<br>
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 eth0<br>
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth2<br>
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1


root@Netbridge:~# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:4e  
          inet addr:10.0.0.1  Bcast:10.255.255.255  Mask:255.0.0.0

eth1      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:58  
          inet addr:192.168.1.74  Bcast:192.168.1.255  Mask:255.255.255.0

eth2      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:62  
          inet addr:192.168.0.91  Bcast:192.168.0.255  Mask:255.255.255.0

Bu yönergeleri izleyin:
hedef-por
-iptables-ileri-belirli-port-to-özgül-nic tabanlı farklı arayüzlerde çıkış trafik-trafik
Birkaç diğer ilgili iş parçacıkları arasında.


Üzgünüm, ama apache'yi sadece arayüzün localhostadresine ve adresine bağlamamanın bir nedeni var eth2mı?
Jan Marek

@ JanMarek: Burada apache'den bahsedilmiyor. Ve bilgileriniz için, bir ethXip'in adresine bir soket bağlamak , ethXlan üzerindeki ana makinelerin ethYip adresini kullanarak yerel sunucuya erişmesini engeller ve ana makinelerin ip adresini ethYkullanarak sunucuya erişmesini engellemez ethX. Linux'un zayıf bir ana bilgisayar modeli kullandığını unutmayın.
BatchyX

Tamam, sadece apache sunucusu değil, daha fazla web sunucusu var ... Ama, web sunucusunu eth2 arabirimine bağlamak basit bir çözüm olabilir. Ama yanılmış olabilirim, biliyorum.
Jan Marek

Yanıtlar:


6

BatchyX zaten iptables ve yönlendirme hakkında çok iyi bir açıklama yapıyor, bu yüzden tembelliklerimi kullanacağım ve doğrudan senaryoya gideceğim.

80,443,22,4070 ile 192.168.0.91 arasındaki limanlara giden tüm trafik NAT olmalıdır. Geri kalan her şey 192.168.1.254'e kadar NAT olacaktır.

Testimi tekrar yaparım ve bu kılavuzu izlerim . Bu kılavuzda eksik olan senaryomdaki son 3 satır. Hangi başka bir limandan öğrendim, ama bu bağlantının izini kaybetti.

Test edilmiş bir çalışma betiğidir.

Varsayılan Rota Gerekiyor

Senaryoya koymadığım bir şey, varsayılan rotayı ayarlamak. Olmalı

route add default gw 192.168.1.254

Bunu yaptığınızda route -n, tek varsayılan yol olmalıdır (Hedef: 0.0.0.0)

0.0.0.0    192.168.1.254    0.0.0.0    UG    0    0    0    eth1

fw-router.sh

# İptables sıfırlama / yıkama
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P GİRİŞ KABULÜ
iptables -P İLERİ KABUL
iptables -P ÇIKIŞ KABULÜ

# Sıfırlama / Yıkama / IP Rotasını Ayarlama (tablo 4)
ip rota gömme masa 4
ip rota gösterisi tablosu ana | grep -Ev ^ varsayılan | ROTA okurken; ip yolu yapmak tablo ekle 4 $ GÜZERGAH; tamam
ip yolu 192.168.0.1 aracılığıyla varsayılan tablo 4 ekle

# D.Port ile eşleşen paket
iptables -t mangle -A PREROUTING -p tcp --dport 22 -s 10.0.0.0/24 -j MARK - ayar işareti 4
iptables -t mangle -A PREROUTING -p tcp --dport 80 -s 10.0.0.0/24 -j MARK - ayar işareti 4
iptables -t mangle -A PREROUTING -p tcp --dport 443 -s 10.0.0.0/24 -j MARK - ayar işareti 4
iptables -t mangle -A PREROUTING -p tcp --dport 4070 -s 10.0.0.0/24 -j MARK - ayar işareti 4

#SNAT Kuralları
iptables -t nat -BİR POSTROUTING -o eth1 -j SNAT - kaynağa 192.168.1.74
iptables -t nat -BİR POSTROUTING -o eth2 -j SNAT - kaynağa 192.168.0.91

#IP Rotası
ip kuralı eklemek fwmark 4 tablo 4
ip route flush önbellek

#IP Yığını
#Bu kılavuzdaki eksik kısım
echo 1> / proc / sys / net / ipv4 / ip_forward
/ proc / sys / net / ipv4 / conf / * / rp_filter için f; echo 0> $ f yapın; tamam
echo 0> / proc / sys / net / ipv4 / route / flush

PS1: Kısacası, bir MASQUERADEtür yük dengelemesi gerektiren veya gelen trafiği işlemek için DNAT'a ihtiyaç duyan birden fazla harici IP'ye sahip NAT için (çoğu durumda ve kesinlikle sizin durumunuzda) çalışmaz. SNATYön kontrolüne ihtiyacınız var .

PS2: Saf iptables yeterli değil.


Her şeyden önce, doğrudan senaryoya gitmek için alkış :) Ben bu çalışacağı ortama geri almak gibi bu gece deneyeceğim!
Aralık'ta Torxed

hmm, ağır revize gerekebilir. Sonucu bana bildirin.
John Siu

Gözden geçirilmiş, şimdi çalışıyor olmalı.
John Siu

Tatlı, kısa bir süre içinde size geri döneceğim: D
Torxed

Seni seviyorum, çok baş ağrısı ve çözdün! Teşekkür ederim!
Aralık'ta Torxed

6

Not: Sadece ilk senaryoyu düşündüm, eskisini görmezden geldim.

  • Netfilter modüllerini mevcut iptables ile elle modifiye etmenize gerek yoktur. Bu yalnızca özel bağlantı izleyiciler için gereklidir.
  • Karıştırma routeve ip route. Bu saf kötülük. Sadece ipher yerde kullanın ve unutun ifconfigveroute
  • /etc/iproute2/rt_tablesyeniden başlatmalarda sıfırlanmaz. Aynı girişi tekrar tekrar eklemek iyi bir fikir değildir, sadece bir kez yapmanız gerekir. Unutmayın rt_tablessadece sayısal değerlere isim takma adları tanımlamak, herhangi bir yapılandırmayı değiştirmez.

  • Şimdilik iptables: FORWARDZincirinizde LAN'dan 4G'ye gelen paketleri düşürüyorsunuz. Bu kötü. FORWARDKanca yapılır yönlendirme sonra kullanılır. Bu noktada, tüm ilke yönlendirmeleri yapılır ve paketin 4G'ye mi yoksa ADSL'ye mi gönderileceği zaten bilinir. İçinde FORWARDveya sonrasında yeniden yönlendirme yapılmaz FORWARD(teknik olarak, yeniden yönlendirme POSTROUTINGciddi durumlarda sonra yapılabilir , ancak noktaya geri dönülebilir).

Şimdi yönlendirmeniz için: Ubuntu'nun varsayılan olarak ters yol filtrelemeyi etkinleştirdiğini unutmayın. Ters yol filtreleme aşağıdaki gibi çalışır: Çekirdek, bir arabirim A'dan bir paket (iletilebilir veya iletilemez) alındığında, kaynak adresini ve hedef adresi ters çevirir ve ortaya çıkan paketin arabirim A üzerinden yönlendirilip yönlendirilmeyeceğini kontrol eder. Değilse, paket adres sızdırma girişimi olarak bırakılır.

Alınan paketler için eth0bu bir sorun değildir. Alınan paketler için eth1, bu, aynı zamanda bir sorun değildir, çünkü kaynak IP adresi ve hedef IP adresini geri manevra yaparken, çekirdek olacak Tabloda varsayılan rota main. eth2İşaretlemediğiniz alınan paketler için bu bir sorundur, çünkü çekirdek tablodaki varsayılan yola çarpar mainve bu paketlerin alınmış olması gerekir eth1. En kolay çözüm eth1'de ters yol filtrelemeyi devre dışı bırakmaktır:

sysctl -w net.ipv4.conf.eth1.rp_filter=0

Tüm harika yorumlar ve evet, benim tarafımda bazı hatalı mantık vardır, örneğin her seferinde rt_tables'a ekleme ve özellikle bazı tabloları temizlemem gerektiği kadar temizlemem ama oraya gideceğim :) Her şeyi bir gidip göreceğim eğer işe yararsa, eğer +50 size ve en önemlisi bir erkeği parçalara ve barışlara kıyılmaktan kurtardınız! :)
Aralık'ta Torxed

1
Aşağıda senaryo çalışıyor ama efendim tüm şükranları hak ediyorsun, düşünmem gereken bir iki şey verdin ve rp_filter = 0 uzun bir yol kat etti! : D
Torxed

@BatchyX çok bilgilendirici, size de oy verdi.
John Siu

@Torxed ALL arayüzü için rp_filter'dan bahsettiğim gönderinin devre dışı bırakılması gerekiyor. Başka şekilde çalışıp çalışmadığından emin değilim.
John Siu

@JohnSiu: Sorunlu olduğu arayüzlerde rp filtresini devre dışı bırakmanız yeterlidir. Bu durumda, eth1'dir, çünkü işaretler ayarlanmadığında bu arayüze giden bir rota yoktur. eth2'nin böyle bir sorunu yoktur, çünkü varsayılan yol bu arayüze gider. Eth0 için, aslında rp filtresini etkin tutmak yararlıdır, aksi takdirde, LAN'daki bir kişi internette bir kaynak adresi ve LAN'da bir hedef adresi olan bir IP paketini taklit edebilir ve yönlendirici bunu memnuniyetle kabul eder ve iletir geri ... eth0.
BatchyX
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.