it-swarm-eu.dev

Výstupní přenos na různých rozhraních na základě cílového portu

Moje otázka je v podstatě stejná jako Povolit pouze určitý odchozí provoz na určitých rozhraních .

Mám dvě rozhraní eth1 (10.0.0.2) a wlan0 (192.168.0.2). Moje výchozí cesta je pro eth1. Řekněme, že chci, aby veškerý provoz https procházel wlan0. Pokud nyní použiji řešení navržené v jiné otázce, provoz https projde wlan0, Ale bude mít stále zdrojovou adresu eth1 (10.0.0.2). Protože tato adresa není směrovatelná pro bránu wlan0, Odpovědi se nikdy nevrátí. Snadným způsobem by bylo správně nastavit vazbu-addr v aplikaci, ale v tomto případě to nelze použít.

Myslím, že musím přepsat src-addr:

# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

Tcpdump nyní vidí odchozí pakety v pořádku a příchozí pakety přicházejí za 192.168.0.2, pravděpodobně však nikdy nekončí v aplikaci, protože vše, co jsem kdy viděl, je to, že aplikace znovu odesílá pakety SYN, i když SYN- ACK již byl přijat.

Tak jsem si myslel, možná musím také přepsat příchozí adresu:

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

ale to také nefungovalo. Takže jsem tady trochu zaseknutý. Nějaké návrhy?

25
rumpel

Jste blízko.

Skutečný důvod, proč aplikace nevidí zpáteční provoz, je kvůli jádru vestavěné v ochraně před IP spoofingem. To znamená, že zpětný provoz neodpovídá směrovací tabulce, a je proto zrušen. To lze napravit vypnutím ochrany proti podvodům takto:

Sudo sysctl net.ipv4.conf.wlan0.rp_filter=0

Ale nedoporučoval bych to. Správnějším způsobem je vytvoření alternativní směrovací instance.

  1. Značka je nutná. Nech to.
  2. Zdroj NAT je také nezbytný).
  3. Konečný DNAT není nutný, takže jej můžete odstranit.

Ujistěte se, že máte nainstalován balíček iproute. Pokud máte příkaz ip, pak jste nastaveni (což vypadá, jako byste to udělali, ale pokud to nedostanete první).

Upravit /etc/iproute2/rt_tables a přidejte novou tabulku připojením následujícího řádku:

200 wlan-route

Poté musíte nakonfigurovat novou směrovací tabulku s názvem wlan-route s výchozí bránou a vytvořte pravidla pro podmíněný přenos provozu do této tabulky. Předpokládám, že vaše výchozí brána je 192.168.0.1. To samozřejmě musí odpovídat vaší skutečné síti, a nejen mým předpokladům.

ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route

Váš konečný anotovaný skript by vypadal takto:

# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2
25
bahamat

bahamatovo řešení je správné; Mějte však na paměti, že jediný způsob, jak to udělat, bylo zakázat rp_filter pro každé rozhraní v systému, nejen pro dvě (v tomto případě eth1 a wlan0) zapojená do NATing.

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush

(viz DŮLEŽITÁ poznámka na konci této stránky: Advanced Routing Howto - zde uvedený odkaz neexistuje, ale našel jsem jej prostřednictvím zpětného stroje)

10
Davide C

Jeden návrh: měli byste vždy použít --sport namísto --dport ve výstupním řetězci.

NAT změní dport a to způsobí, že se vaše pravidlo stane nedotknutelným.

0
user73451

Myslím, že níže je potřeba:

ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
0
user181234