iptables --set-mark - Rute port yang berbeda melalui antarmuka yang berbeda


13

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
masukkan deskripsi gambar di sini

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.


Maaf, tetapi apakah ada alasan untuk tidak mengikat apache hanya ke localhostdan ke alamat eth2antarmuka?
Jan Marek

@JanMarek: Tidak disebutkan apache di sini. Dan sebagai informasi, mengikat soket pada ethXalamat ip akan mencegah host di ethXlan mengakses server lokal menggunakan ethYalamat ip, dan tidak akan mencegah host dari ethYmengakses server menggunakan ethXalamat ip. Ingat bahwa Linux menggunakan model host yang lemah.
BatchyX

OK, ada kemungkinan lebih banyak server web, bukan hanya server apache ... Namun, server web yang terikat pada antarmuka eth2 dapat menjadi solusi sederhana. Tapi saya bisa salah, saya tahu.
Jan Marek

Jawaban:


4

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

route add default gw 192.168.1.254

Ketika Anda melakukannya route -n, itu harus menjadi satu-satunya rute default (Dest: 0.0.0.0)

0.0.0.0    192.168.1.254    0.0.0.0    UG    0    0    0    eth1

fw-router.sh

# Reset / Siram iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P MENERIMA INPUT
iptables -P MENERIMA MAJU
iptables -P OUTPUT ACCEPT

# Reset / Siram / Pengaturan IP Route (tabel 4)
tabel ip rute siram 4
ip route show table utama | grep -Ev ^ default | saat membaca ROUTE; jangan ip route tambahkan tabel 4 $ ROUTE; selesai
ip route tambahkan tabel 4 default melalui 192.168.0.1

Paket #Mark dengan D.Port yang cocok
iptables -t mangle -A PREROUTING -p tcp --dport 22 -s 10.0.0.0/24 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 80 -s 10.0.0.0/24 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 443 -s 10.0.0.0/24 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 4070 -s 10.0.0.0/24 -j MARK --set-mark 4

Aturan #SNAT
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --ke-sumber 192.168.1.74
iptables -t nat -A POSTROUTING -o eth2 -j SNAT --ke-sumber 192.168.0.91

#IP Rute
aturan ip tambahkan fwmark 4 tabel 4
ip rute cache flush

#IP Stack
#Ini adalah bagian yang hilang dari panduan ini
gema 1> / proc / sys / net / ipv4 / ip_forward
untuk f di / proc / sys / net / ipv4 / conf / * / rp_filter; lakukan echo 0> $ f; selesai
gema 0> / proc / sys / net / ipv4 / route / flush

PS1: Singkatnya, MASQUERADEtidak 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 perlu SNATkontrol arah.

PS2: iptables murni tidak cukup.


Pertama-tama, tepuk tangan untuk langsung ke skrip :) Saya akan mencoba ini malam ini ketika saya kembali ke lingkungan di mana ini akan berjalan pada!
Torxed

hmm, mungkin perlu revisi berat. Biarkan saya tahu hasilnya.
John Siu

Direvisi, seharusnya bisa bekerja sekarang.
John Siu

Manis, akan kembali kepadamu sebentar lagi: D
Torxed

Aku mencintaimu, sangat sakit kepala dan kamu menyelesaikannya! Terima kasih!
Torxed

5

Catatan: Saya hanya mempertimbangkan skrip pertama, mengabaikan skrip lama.

  • Anda tidak perlu modprobe modul netfilter dengan tangan dengan iptables saat ini. Ini hanya diperlukan untuk pelacak koneksi khusus.
  • Jangan campur aduk routedan ip route. Ini adalah kejahatan murni. Cukup gunakan ipdi mana-mana dan melupakan ifconfigdanroute
  • /etc/iproute2/rt_tablestidak diatur ulang di seluruh reboot. Menambahkan entri yang sama berulang kali bukan ide yang baik, Anda hanya perlu melakukannya sekali. Ingat bahwa rt_tableshanya mendefinisikan nama alias ke nilai numerik, itu tidak mengubah konfigurasi apa pun.

  • Sekarang untuk iptables: Dalam FORWARDrantai Anda, Anda menjatuhkan paket yang berasal dari LAN ke 4G. Ini buruk. yang FORWARDkait 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 dalam FORWARDatau setelah FORWARD(baik, secara teknis, rerouting dapat dilakukan setelah POSTROUTINGdalam 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 dari eth1, ini juga bukan masalah, karena ketika membalikkan alamat IP sumber dan alamat IP tujuan, kernel akan menjadi rute default dalam tabel main. Untuk paket yang diterima dari eth2, yang tidak Anda tandai, ini merupakan masalah, karena kernel akan mengenai rute default dalam tabel main, dan menganggap bahwa paket-paket ini seharusnya telah diterima eth1. Solusi termudah adalah menonaktifkan penyaringan jalur balik pada eth1:

sysctl -w net.ipv4.conf.eth1.rp_filter=0

Semua komentar hebat dan ya, ada beberapa logika yang salah di pihak saya, misalnya menambahkan ke rt_tables setiap kali dan terutama tidak membersihkan tabel tertentu serta saya harus tetapi saya akan sampai di sana :) Saya akan mencoba semuanya dan melihat jika berhasil, jika demikian, +50 untuk Anda dan yang paling penting Anda telah menyelamatkan seorang pria di belakang dari dipotong-potong dan dikupas! :)
Torxed

Skrip di bawah ini berfungsi, tetapi Anda juga pantas menerima rasa terima kasih, Anda memberi saya satu atau dua hal untuk dipikirkan dan rp_filter = 0 sangat membantu! : D
Torxed

@ BatchyX sangat informatif, pilih Anda juga.
John Siu

@Torxed Posting yang saya lihat menyebutkan rp_filter untuk SEMUA antarmuka harus dinonaktifkan. Saya tidak yakin apakah itu bekerja dengan cara lain.
John Siu

@ JohnSiu: Anda hanya perlu menonaktifkan filter rp pada antarmuka yang bermasalah. Dalam hal ini, ini eth1, karena tidak ada rute yang menuju ke antarmuka itu ketika tanda tidak diatur. eth2 tidak memiliki masalah seperti itu, karena rute default masuk ke antarmuka itu. Untuk eth0, sebenarnya berguna untuk mengaktifkan filter rp, jika tidak, seseorang di LAN dapat memalsukan paket IP dengan alamat sumber berada di internet dan alamat tujuan pada LAN, dan router dengan senang hati akan menerimanya, dan meneruskannya kembali ke ... eth0.
BatchyX
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.