Dalam pengaturan saya, lalu lintas TX multicast ditandai oleh iptables tetapi kebijakan routing menggunakan tabel routing baru tidak pernah berfungsi. Meskipun itu bekerja untuk paket TX unicast (mengarahkan paket yang berasal dari eth0 ke eth5). Menggunakan tc saya bisa mendapatkan trafik mcast eth0 ke eth5 Alamat src mac dan src ip diubah dari eth5 jadi tidak akan ada masalah dengan sakelar pembelajaran. Semua dukungan kernel untuk penjadwalan paket kernel CONFIG_NET_SCHED harus diaktifkan
Di bawah ini BEKERJA untuk pengalihan lalu lintas unicast dan multicast dari eth0 ke eth5
Netfilter dapat digunakan untuk berinteraksi secara langsung dengan struktur yang mewakili sebuah paket di kernel. Struktur ini, sk_buff, berisi bidang yang disebut "__u32 nfmark" yang akan kita modifikasi. TC kemudian akan membaca nilai itu untuk memilih kelas tujuan suatu paket.
IP_ADDR_ETH0 = ifconfig eth0 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
iptables -t mangle -A OUTPUT -s $ {IP_ADDR_ETH0} -p udp --match multiport --dports 329.330 -o eth0 -j MARK --set-mark 2
Pergi untuk membuat pohon yang mewakili kebijakan penjadwalan kami, dan yang menggunakan PRIO qdisc (penjadwal paket) (dapat mencoba yang lain tersedia). qdiscs melampirkan di root perangkat
tc qdisc menambahkan dev eth0 root handle 15: prio
Sekarang memiliki kebijakan pembentukan lalu lintas di satu sisi, dan di sisi lain menandai paket. Untuk menghubungkan keduanya, kita perlu filter.
refer man tc-mirred (8): Tindakan mirred memungkinkan mirroring paket (menyalin) atau mengalihkan (mencuri) paket yang diterimanya. Mirroring adalah apa yang kadang-kadang disebut sebagai Switch Port Analyzer (SPAN) dan biasanya digunakan untuk menganalisis dan / atau men-debug aliran.
refer man tc-fw (8): fw - fwmark filter kontrol lalu lintas memungkinkan filter fw untuk mengklasifikasikan paket berdasarkan pada fwmark yang sebelumnya diatur oleh iptables. Jika identik dengan 'pegangan' filter, filter cocok. iptables memungkinkan untuk menandai paket tunggal dengan target MARK, atau seluruh koneksi menggunakan CONNMARK.
MAC_ADDR_ETH1 = cat /sys/class/net/eth1/address
IP_ADDR_ETH1 = ifconfig eth1 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
tc filter tambahkan dev eth0 parent 15: 0 protokol ip prio 1 handle 0x2 fw aksi pedit ex munge eth src set $ {MAC_ADDR_ETH1} pipe \ action pedit ex munge ip src set $ {IP_ADDR_ETH1} pipe \ action mirred egress redirect egress dev eth1
tampilkan aturan yang ditetapkan di atas: tc qdisc tunjukkan dev eth0 tc filter tunjukkan dev eth0
hapus / hapus set aturan di atas: tc qdisc del dev eth0 root