iptables - Paketin belirli bir arayüze yönlendirilmesi hedeflenir mi?


25

Ev sunucumun iki eth1standart arayüzü var (standart bir internet bağlantısı) ve tun0(bir OpenVPN tüneli). iptablesUID 1002 tarafından sahip olunan yerel bir işlem tarafından üretilen tüm paketleri tun0ve diğer tüm paketleri de çıkmaya zorlamak istiyorum eth1.

Eşleşen paketleri kolayca işaretleyebilirim:

iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11

Şimdi, POSTROUTING zincirinde (muhtemelen mangle tablasından) 11 ile işaretlenmiş paketleri eşleştirmek ve göndermek tun0, sonra da tüm paketleri eşleştirmek ve göndermek için bir kural koymak için bazı kurallar koymak istiyorum eth1.

ROUTE hedefini buldum, ancak bu yalnızca kaynak arayüzü yeniden yazıyor gibi görünüyor (yanlış okuduğum sürece).

İptables bu yeteneğine sahip mi? Bunun yerine yönlendirme tablosuyla uğraşmak zorunda mıyım ( bunun yerine ip routesadece eski routekomutlar aracılığıyla )?

Düzenleme: Belki daha fazla bilgi vermem gerektiğini düşündüm. Şu anda başka iptables kurallarım yok (gelecekte ilgisiz işleri yürütmek için bazı kurallar oluşturabilsem de). Ayrıca, çıktı ip route:

default via 192.168.1.254 dev eth1  metric 203
10.32.0.49 dev tun0  proto kernel  scope link  src 10.32.0.50
85.17.27.71 via 192.168.1.254 dev eth1
192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.73  metric 203

Yönlendirme masasına dokunmadım - şu anki hali budur (oldukça kirli görünmesine rağmen). Üzgünüm, routebu makinede eski komut yüklü değil .

Ve ip addr(elbette, eth0 ve eth2'nin çıktısı göz ardı edilebilir - bunlar şu anda kullanılmayan NIC'ler):

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 1c:6f:65:2a:73:3f brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast     state UP qlen 1000
    link/ether 00:1b:21:9d:4e:bb brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.73/24 brd 192.168.1.255 scope global eth1
    inet6 fe80::21b:21ff:fe9d:4ebb/64 scope link
       valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:1b:21:6a:c0:4b brd ff:ff:ff:ff:ff:ff
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc     pfifo_fast state UNKNOWN qlen 100
    link/none
    inet 10.32.0.50 peer 10.32.0.49/32 scope global tun0

Düzenleme: Çalışması gereken bir şeyler aldım, ancak işaretli paketleri tun0'a iletmiyor. Temel olarak, bir tablo (11) ekledim ve kullandım:

ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11

Sadece sudo -u user1000 wget -qO- whatismyip.org, evimin dış IP adresini alıyorum, ancak yaparsam sudo -u user1002 wget -qO- whatismyip.org, evimin IP adresini de alıyorum (ancak IP’yi OpenVPN tünelinin diğer ucundan almalıyım).

Çalıştırma iptables -vL, paketlerin işaretleme kuralıyla eşleştiğini doğrular, ancak yönlendirme kuralına uymuyor gibi görünüyor.

EDIT: Bu konuda uzun zaman geçirdim ve hala işe yaramamasına rağmen, biraz daha yakınım sanırım.

İptables kuralı mangletablonun OUTPUT zincirinde olmalıdır. natKaynak adresini ayarlamak için tablonun POSTROUTING zincirinde bir MASQUERADE kuralına ihtiyacım olduğunu düşünüyorum . Ancak, OUTPUT'un mangleı sonrasında gerçekleşen yeniden yönlendirme düzgün çalışmıyor.

Şimdi bunun için 5 saat geçirdim, bu yüzden ara vereceğim ve muhtemelen bu akşam ya da bir ara öğleden sonra geri dönecek.

Yanıtlar:


26

Son zamanlarda biraz farklı olsa da benzer bir konuya değindim. Diğer tüm trafiği (aynı ana bilgisayar için bile) varsayılan arabirim üzerinden yönlendirirken, yalnızca TCP bağlantı noktasını 25 (SMTP) bir OpenVPN tap0 arabirimi üzerinden yönlendirmek istedim .

Bunu yapmak için paketleri işaretlemek ve işlem için kurallar koymak zorunda kaldım. Önce, çekirdek 2tablo paketlerini through table ile işaretli yapan bir kural ekleyin 3(sonra açıklanacaktır):

ip rule add fwmark 2 table 3

Sembolik bir isim ekleyebilirdin /etc/iproute2/rt_tables, ama bunu yapmak için zahmet etmedim. Sayı 2ve 3rastgele seçilir. Aslında, bunlar aynı olabilir ancak netlik için bu örnekte yapmadım (kendi kurulumumda yapmam rağmen).

Ağ geçidinin olduğu varsayılarak, trafiği farklı bir arabirim üzerinden yönlendirmek için bir rota ekleyin 10.0.0.1:

ip route add default via 10.0.0.1 table 3

Çok önemli! Yönlendirme önbelleğinizi temizleyin, aksi halde bir yanıt alamaz ve birkaç saat boyunca ellerinizle saçlarınızda oturamazsınız:

ip route flush cache

Şimdi, belirlenmiş paketleri işaretlemek için bir güvenlik duvarı kuralı ayarlayın:

iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2

Yukarıdaki kural sadece paketler yerel makineden geliyorsa uygulanır. Http://inai.de/images/nf-packet-flow.png adresini ziyaret edin . Gereksinimlerinize göre ayarlayın. Örneğin, yalnızca giden HTTP trafiğini tap0arayüz üzerinden yönlendirmek istiyorsanız , 465'ten 80'e değiştirin.

tap0LAN adresinizi kaynak IP olarak almaktan gönderilen paketlerin önlenmesi için, arabirim adresinize değiştirmek için aşağıdaki kuralı kullanın ( 10.0.0.2arabirim için IP adresi olarak kabul edin tap0):

iptables -t nat -A POSTROUTING -o tap0 -j SNAT --to-source 10.0.0.2

Son olarak, ters yol kaynak onaylamasını gevşetin. Bazıları ayarlamanızı önerir 0, ancak https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt adresine2 göre daha iyi bir seçenek gibi görünüyor . Bunu atlarsanız, paketleri alacaksınız (kullanarak onaylanabilir ), ancak paketler kabul edilmez. Paketlerin kabul edilmesini sağlayan ayarı değiştirme komutu:tcpdump -i tap0 -n

sysctl -w net.ipv4.conf.tap0.rp_filter=2

MASQUERADE yerine neden SNAT kullanıyorsunuz? MASQUERADE aynı şeyi yapmıyor mu, IP adresi "çalışma zamanı" ndaki arabirimden toplanıyor ve config dosyasına kodlanmış değil mi?
Ethan

6
@Ethan From man iptables: Yalnızca dinamik olarak atanmış IP (çevirmeli) bağlantılarla kullanılmalıdır: statik bir IP adresiniz varsa, SNAT hedefini kullanmalısınız. Maskeleme, paketin çıkmakta olduğu arabirimin IP adresine bir eşleme belirtmeye eşdeğerdir, ancak arabirim aşağı indiğinde bağlantıların unutulması etkisine de sahiptir. Haklısınız, ancak IP adresim asla değişmeyeceğinden, manpage tarafından yapılan öneri başına SNAT kullanmaya karar verdim.
Lekensteyn

(Test edilmemiş olmasına rağmen) son adımın (ters yol kaynak doğrulama) gerekli olmadığını düşünüyorum. PREROUTINGZincire DNAT, doğru kaynak adresine (varsayılan ağ geçidinize göre) başka bir kural ekleyebilirsiniz .
Christian Wolf

7

Bunu çözdüm. Sorun, tablo 11'deki yönlendirme kurallarıyla ilgiliydi. Tablo 11 , çarpılıyor ancak yönlendirme kuralları, çalışamaz duruma getiriyor. Bu senaryo şu anda kullandığım şeydi ve iyi çalışıyor gibi gözüküyor (açıkçası kurulumuma özgü olsa da). Ayrıca ana uplinke (eth1) yönelik yeni bir tablo 21 yarattım.

# Add relevant iptables entries.
iptables -t mangle -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# Flush ALL THE THINGS.
ip route flush table main
ip route flush table 11
ip route flush table 21
ip rule flush

# Restore the basic rules and add our own.
ip rule add lookup default priority 32767
ip rule add lookup main priority 32766
ip rule add fwmark 11 priority 1000 table 11
# This next rule basically sends all other traffic down eth1.
ip rule add priority 2000 table 21

# Restore the main table.  I flushed it because OpenVPN does weird things to it.
ip route add 127.0.0.0/8 via 127.0.0.1 dev lo
ip route add 192.168.1.0/24 dev eth1 src 192.168.1.73
ip route add default via 192.168.1.254

# Set up table 21.  This sends all traffic to eth1.
ip route add 192.168.1.0/24 dev eth1 table 21
ip route add default via 192.168.1.254 dev eth1 table 21

# Set up table 11.  I honestly don't know why 'default' won't work, or
# why the second line here is needed.  But it works this way.
ip route add 10.32.0.49/32 dev tun0 table 11
ip route add 10.32.0.1 via 10.32.0.50 dev tun0 table 11
ip route add 0.0.0.0/1 via 10.32.0.50 dev tun0 table 11

ip route flush cache

## MeanderingCode edit (henüz yorum yapamam çünkü)

Bu cevap için teşekkürler! Rota bilgilerini burada tutmak zorunda kalacağınız gibi (muhtemelen çoğaltmak veya rotaları ayarlamak isteyebilecek diğer şeyleri kırmak zorunda kalacaksınız), bu karışıklığa yol açabilir gibi görünüyor.

Yönlendirme tablonuzda OpenVPN'den "tuhaf şeyler" yaşıyor olabilirsiniz, çünkü sunucu "trafiğe kapalı" internet yerine, tüm trafiğin VPN ağ arayüzü üzerinden yönlendirilmesine olanak tanıyacak şekilde rotaları "zorlayacak" şekilde yapılandırılmıştır. Veya OpenVPN konfigürasyonunuz ya da herhangi bir komut dosyası / uygulamanın ayarladığı rotaları ayarlamaktır.

İlk durumda, size OpenVPN yapılandırmasını düzenleyebilir ve "yol-nopull" içeren bir çizgi koymak
(birçok güncel Linux masaüstü dağıtımlar örneğin, ağ-manager-openvpn) OpenVPN veya herhangi sarmalayıcı için ikincisi, çek yapılandırmada
In Her iki durumda da, ayarlandığı yerdeki yönlendirme yapılandırmasını ortadan kaldırmak, bu betiği ne zaman çalıştırdığınıza ve sisteminizin başka ne yaptığına bağlı olarak, tabloyu temizlemekten daha temiz ve güvenlidir.

Şerefe!


2

Bence sen istiyorum ki:

/sbin/ip route add default via 10.32.0.49 dev tun0 table 11
/sbin/ip rule add priority 10000 fwmark 11 table 11

http://lartc.org/howto/lartc.netfilter.html

Ama yukarıdakileri test etmedim.


İlk komut "Hata:" ya "dan" a tekrar eder ya da "10.32.0.49" bir çöptür. "
Ethan,

Maalesef varsayılan ve IP arasındaki geçişi unuttum.
mfarver

Denedim. defaultAnahtar kelimeyi dışarıda bırakmakla aynı etkiye sahip görünüyor .
Ethan,

Seçenekleri ortadan kaldırmak için tun0'da paket yakalama işlemini deneyebilir ve paketlerin bu arayüzde sona erip bitmediğini görebilirsiniz. tcpdump -i tun0 .. alternatif olarak, kullanıcı kimliğine dayandırmanız gerekiyor mu? Bunu sadece hedef IP adresine göre yapabilir misiniz (daha kolay)? rota ekleme <uzak sunucu> üzerinden 10.32.0.49
mfarver

Hedef IP adresinin dışına çıkarsa dayanamıyorum - bunların çoğu olurdu. Ayrıca teorik olarak bunu pid üzerinden alabilirim, ama bu daha da zor, çünkü servist (ler) başlayana kadar ihaleyi bilemeyeceğim.
Ethan

0

Bu iptables komutu olmadan yapılabilir. Basit ip komutunu çalıştırın.

UID 1002 için:

ip rule add uidrange 1002-1002 table 502

Tablo 502 için varsayılan rota eklemek istediğiniz arabirim üzerinden

eth0 ip rule add default via a.b.c.d dev eth0

Bu komutu test ettim ve işe yaramadı:Error: argument "uidrange" is wrong: Failed to parse rule type
kasperd

@ kasperd yanlış yapıyor olmalı, çünkü benim için iyi çalışıyor.
horseyguy
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.