Cerpen,
3 antarmuka, eth0 (LAN), eth1 (ADSL), eth2 (4G).
eth0 -> eth1: Bekerja
(port 80, 443, 4070) eth0 -> eth2: Tidak terjadi
Ini adalah representasi grafis dari ide tersebut:
Port 80 & 443 via eth2
semut sisanya via eth1
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
Script baru ini mengalihkan 22 dan 4070 ke tabel yang tepat, saya pikir.
Namun, setelah sampai ke meja itu, tidak bisa dialihkan ke eth2.
Script ini berfungsi, kecuali untuk 22 dan 4070!
(Port 80 tidak dikomentari dan berfungsi tetapi melalui eth1 yang salah.)
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
Skrip lama:
Ignore everything below unless you're interested in retracing my steps!!
Saya telah membuat skrip router.sh untuk mengatur lingkungan saya jika saya melakukan sesuatu yang buruk. Saya punya 3 port yang ingin saya kirim ke koneksi 4G dan sisanya melalui koneksi ADSL darat. Untuk melakukan ini, saya telah menginstruksikan iptables untuk membuat paket pada rute default dan mengirimkannya melalui antarmuka 4G saya jika --dport == 443 | 80 | 4070
Namun, ini tidak berhasil; Saya masih terus dialihkan melalui telepon rumah saya, apa pun yang terjadi.
Seperti inilah bentuk skrip saya:
#!/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
Saya juga mencoba menambahkan 3 ini ke bawah naskah:
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"
Juga mencoba tanpa hasil:
iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
Last but not least, mencoba:
## 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
Routing berfungsi, saya dapat menjelajahi web, mendengarkan musik dan apa-tidak, tapi saya melakukannya melalui antarmuka yang salah. Saya sudah mencari Google untuk waktu yang lama dan menemukan potongan-potongan untuk memahami apa yang saya lakukan dan mengapa saya melakukannya. Saya bisa melakukan traffic shaping melalui tc tetapi jika memungkinkan melalui menandai paket di iptables, ini akan sangat membantu saya.
Dugaan saya adalah saya melakukan kesalahan urutan pada aturan yang berbeda, terutama bagian MASQUERADE ? atau apakah itu seharusnya ada di sana?
Dapatkah seseorang menjelaskan bagaimana cara mengatakan port DNAT , tcp: 80 dari antarmuka eksternal (salah satu atau KEDUA protokol) ke ruang alamat internal 10.0.0.0?
Output:
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
Ikuti petunjuk ini:
output-traffic-pada-berbeda-antarmuka berbasis-pada-tujuan-por
iptables-maju-spesifik-port-ke-spesifik-nic
Di antara beberapa utas terkait lainnya.
localhost
dan ke alamateth2
antarmuka?ethX
alamat ip akan mencegah host diethX
lan mengakses server lokal menggunakanethY
alamat ip, dan tidak akan mencegah host dariethY
mengakses server menggunakanethX
alamat ip. Ingat bahwa Linux menggunakan model host yang lemah.Jawaban:
BatchyX sudah memberikan penjelasan yang sangat bagus tentang iptables dan routing, jadi saya akan menggunakan kemalasan saya dan langsung menuju ke script.
Seharusnya NAT semua lalu lintas ke port 80.443.222.4070 melalui 192.168.0.91. Semua sisanya akan NAT melalui 192.168.1.254
Saya melakukan pengujian ulang dan akhirnya mengikuti panduan ini . Apa yang hilang dalam panduan itu adalah 3 baris terakhir dalam skrip saya. Yang saya temukan dari port lain, tetapi saya kehilangan jejak tautan itu.
Ini adalah skrip yang diuji.
Butuh Rute Default
Satu hal yang tidak saya masukkan ke dalam skrip adalah mengatur rute default. Harus
Ketika Anda melakukannya
route -n
, itu harus menjadi satu-satunya rute default (Dest: 0.0.0.0)fw-router.sh
PS1: Singkatnya,
MASQUERADE
tidak bekerja (dalam banyak kasus, dan pasti dalam kasus Anda) untuk NAT dengan beberapa IP eksternal yang membutuhkan semacam penyeimbangan beban atau membutuhkan DNAT untuk menangani lalu lintas yang masuk. Anda perluSNAT
kontrol arah.PS2: iptables murni tidak cukup.
sumber
Catatan: Saya hanya mempertimbangkan skrip pertama, mengabaikan skrip lama.
route
danip route
. Ini adalah kejahatan murni. Cukup gunakanip
di mana-mana dan melupakanifconfig
danroute
/etc/iproute2/rt_tables
tidak diatur ulang di seluruh reboot. Menambahkan entri yang sama berulang kali bukan ide yang baik, Anda hanya perlu melakukannya sekali. Ingat bahwart_tables
hanya mendefinisikan nama alias ke nilai numerik, itu tidak mengubah konfigurasi apa pun.Sekarang untuk
iptables
: DalamFORWARD
rantai Anda, Anda menjatuhkan paket yang berasal dari LAN ke 4G. Ini buruk. yangFORWARD
kait digunakan setelah routing dilakukan. Pada titik ini, semua perutean kebijakan dilakukan, dan sudah diketahui apakah paket harus dikirim ke 4G atau ADSL. Tidak ada rerouting yang dilakukan dalamFORWARD
atau setelahFORWARD
(baik, secara teknis, rerouting dapat dilakukan setelahPOSTROUTING
dalam kasus yang parah, tetapi kembali ke titik).Sekarang untuk perutean Anda: Ingatlah bahwa Ubuntu mengaktifkan penyaringan jalur balik secara default. Penyaringan jalur balik berfungsi sebagai berikut: Ketika kernel menerima paket (mungkin diteruskan atau tidak) dari antarmuka A, itu akan membalikkan alamat sumber dan alamat tujuan, dan memeriksa apakah paket yang dihasilkan harus dialihkan melalui antarmuka A. Jika tidak, paket dijatuhkan sebagai upaya spoofing alamat.
Untuk paket yang diterima dari
eth0
, ini bukan masalah. Untuk paket yang diterima darieth1
, ini juga bukan masalah, karena ketika membalikkan alamat IP sumber dan alamat IP tujuan, kernel akan menjadi rute default dalam tabelmain
. Untuk paket yang diterima darieth2
, yang tidak Anda tandai, ini merupakan masalah, karena kernel akan mengenai rute default dalam tabelmain
, dan menganggap bahwa paket-paket ini seharusnya telah diterimaeth1
. Solusi termudah adalah menonaktifkan penyaringan jalur balik pada eth1:sumber