Anda sudah dekat.
Alasan sebenarnya bahwa aplikasi tidak melihat lalu lintas balik adalah karena perlindungan spoofing IP bawaan kernel. Yaitu, lalu lintas balik tidak cocok dengan tabel perutean dan oleh karena itu dibatalkan. Anda dapat memperbaikinya dengan menonaktifkan perlindungan spoofing seperti ini:
sudo sysctl net.ipv4.conf.wlan0.rp_filter=0
Tapi saya tidak akan merekomendasikannya. Cara yang lebih tepat adalah membuat instance perutean alternatif.
- Tanda itu diperlukan. Pertahankan.
- NAT sumber juga diperlukan.
- DNAT akhir tidak diperlukan, jadi Anda dapat menghapusnya.
Pastikan Anda memiliki iproute
paket diinstal. Jika Anda memiliki ip
perintah maka Anda sudah siap (yang sepertinya Anda lakukan, tetapi jika tidak mendapatkannya terlebih dahulu).
Edit /etc/iproute2/rt_tables
dan tambahkan tabel baru dengan menambahkan baris berikut:
200 wlan-route
Anda kemudian perlu mengonfigurasi tabel perutean baru bernama wlan-route
dengan gateway default dan membuat aturan untuk mengirimkan lalu lintas ke tabel tersebut secara kondisional. Saya akan menganggap gateway default Anda adalah 192.168.0.1. Biasanya ini harus sesuai dengan jaringan Anda yang sebenarnya, dan bukan hanya asumsi saya.
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route
Skrip terakhir Anda yang dianotasi akan terlihat seperti ini:
# 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
solusi bahamat benar; namun, perlu diketahui bahwa satu-satunya cara bagi saya untuk membuat ini berfungsi adalah dengan menonaktifkan rp_filter untuk setiap antarmuka dalam sistem, tidak hanya keduanya (eth1 dan wlan0 dalam kasus ini) yang terlibat dalam NATing.
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush
(lihat catatan PENTING di akhir halaman ini:Advanced Routing Howto -- link yang diposting di sana sudah tidak ada lagi, tetapi saya menemukannya melalui mesin wayback)