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?
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.
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
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)
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.
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