UDP broadcast forwarding

 ( Gyuszk | 2007. január 9., kedd - 10:10 )

Üdv! A következő a helyzet:
Van egy Debian Sarge i386 -os szervergépem két db hálókártyával (eth0, eth1).

eth0 Link encap:Ethernet HWaddr 00:04:E2:EB:8E:56
inet addr:193.xxx.xxx.31 Bcast:193.xxx.xxx.255 Mask:255.255.255.0
inet6 addr: fe80::204:e2ff:feeb:8e56/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

eth1 Link encap:Ethernet HWaddr 00:48:54:6E:B3:EA
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::248:54ff:fe6e:b3ea/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

A fenti módon mennek. Az eth0 csatlakozik a kolis LAN-ra (bár tulajdonképpen az internetre, mivel saját fix publikus IP-t kapunk), az eth1 pedig a saját belső LAN-omra. A kettő között iptables-el történő NAT /Masquerading van, + tűzfal.
A probléma az, hogy a két desktop gépem a belső lLAn-omon lóg, és CS-zni szeretnék egy olyan szerverhez csatlakozva ami a kolis lanon fut.
A szerverhez tudnék csatlakozni, mert kifelé mindenféle kapcsolatot engedélyeztem, azonban a szervert nem találja meg a játék szerverböngészője ami LAN-os szervereket keres. A LAN-on a CS (illetve a Half Life Dedicated Server) amikor szervert keres, akkor a játékkliens a 255.255.255.255 -re broadcastol UDP csomagokat (source port random, destination port 27015-27020). Ezek a broadcastelések azonban nem jutnak el a másik szobában levő CS szerverhez (ez a kolis lanon van).
Átmeneti workaround lenne ha a debianos átjárón futtatnánk a CS szervert, de egyelőre túl gyík ahhoz, procicsere kell (most P2, vettünk hozzá P3-at).

A probléma tehát az lenne, hogy a gépem (192.168.0.2) felől érkező, 255.255.255.255 irányú UDP broadcastolás eljusson az eth1 által elérhető kolis LAN-ra is. Alább csatolom a jelenleg futtatott iptables konfigurációt, amiben kiemelem azt a részt, amelyikkel ezt meg próbálom oldani.

Lehetséges hogy ezen kivül valamilyen visszaigazolást is kell küldenie a szervernek (amiben a nevét, az ip cimét, az aktuális pályát és játékosok számát és egyéb információt küld el) a kliens felé, ezt még wireshark-al megsniffelem.

Netfilter konfiguráció:

# A $SYSCTL valtozo uresbe tetele, igy nem a sysctl programot fogja a kernel beallitasara hasznalni, hanem echo-kkal a /proc-on keresztul
SYSCTL=""

# A netfilter rendszer userspace-beli vezerloprogramjainak eleresi utvonalai
IPT="/sbin/iptables"
IPTS="/sbin/iptables-save"
IPTR="/sbin/iptables-restore"

# Kulso (internet) interfesz
INET_IFACE="eth0"

# Belso (LAN) interfesz
LOCAL_IFACE="eth1"
LOCAL_IP="192.168.0.1"
LOCAL_NET="192.168.0.0/8"
LOCAL_BCAST="255.255.255.0"

# Loopback (127.0.0.1) interfesz
LO_IFACE="lo"
LO_IP="127.0.0.1"

if [ "$1" = "save" ]
then
echo -n "Tuzfal elmentese: /etc/netfilter/iptables ... "
$IPTS > /etc/netfilter/iptables
echo "done"
exit 0
elif [ "$1" = "restore" ]
then
echo -n "Tuzfal visszaallitasa /etc/netfilter/iptables ... "
$IPTR < /etc/netfilter/iptables
echo "done"
exit 0
fi

echo "Kernel modulok betoltese ..."

/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe iptable_filter
/sbin/modprobe ipt_state

# /sbin/modprobe ipt_LOG
# /sbin/modprobe ip_conntrack_irc

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter

echo "Tuzfalszabalyok resetelese ..."

$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT

$IPT -F
$IPT -t nat -F
$IPT -t mangle -F

$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

if [ "$1" = "stop" ]
then
echo "A tuzfal minden szabalya defaulton, igy jelenleg nincs semmifele tuzfal."
exit 0
fi
echo "A tuzfal mindenfele ki, be, illetve athalado csomagot eldob. Teljes vedelem."
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
echo ".. sikerult. Ezekutan minden tevekenyseg csak kulon engedellyel lehetseges."

echo "Sajat chain-ok letrehozasa ..."

$IPT -N bad_packets
$IPT -N bad_tcp_packets
$IPT -N icmp_packets
$IPT -N udp_inbound
$IPT -N udp_outbound

$IPT -N tcp_inbound
$IPT -N tcp_outbound

# Egyeni chainok feltoltese
# bad_packets chain
# Minden INVALID csomag azonnali eldobasa

$IPT -A bad_packets -p ALL -m state --state INVALID -j LOG --log-prefix "Hibas csomag:"
$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP

# A TCP csomagok tovabbi ellenorzese
$IPT -A bad_packets -p tcp -j bad_tcp_packets

# Minden oke, tehat visszateres
$IPT -A bad_packets -p ALL -j RETURN

# bad_tcp_packets chain
#
# Minden TCP csomag at fog kelni ezen a chainon.
# Minden uj kapcsolat elvileg egy syn csomaggal kezdodik.
# Ha megsem, akkor valami mas lesz, peldaul port scanneles.
# Minden ilyen NEW csomagot eldobunk, ami nem syn.

# Visszarakas az eredeti chainba, akkor ha a rossz csomag
# egy belso interfeszrol erkezett. Ez akkor biztonsagos, ha
# a tuzfal egy jol megbizhato belso halozatot ved.

$IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE -j RETURN

$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "Uj kapcsolat, nem syn:"
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

# Minden oke, visszateres:
$IPT -A bad_tcp_packets -p tcp -j RETURN

# icmp_packets chain

# A kovetkezo sort enabledre kell tenni, ha pingelheto hostot akarunk:
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT

# Time Exceeded
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

# Not matched, so return so it will be logged
$IPT -A icmp_packets -p ICMP -j RETURN

# udp_inbound chain
#
# Ez a chain tartalmazza a bejovo UDP csomagokat.
# Ez az internet/kifele nezo interfesz INPUT -jara vonatkozik.
# A NetBIOS (Windows) csomagokat kerdezes nelkul droppolja.

$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 3997 -j ACCEPT
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 3998 -j ACCEPT
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 27005 -j ACCEPT
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 27007 -j ACCEPT
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 27015 -j ACCEPT
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 27025 -j ACCEPT

$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 138 -j DROP

# Network Time Protocol (NTP) Server
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 123 -j ACCEPT

# DNS Server
# Configure the server to use port 53 as the source port for requests
# Note, if you run a caching-only name server that only accepts queries
# from the private network or localhost, you can comment out this line.
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 53 -j ACCEPT

# $IPT -A udp_inbound -p UDP -s 0/0 --source-port 53 -j ACCEPT

# Dynamic Address
# If DHCP, the initial request is a broadcast. The response
# doesn't exactly match the outbound packet. This explicitly
# allow the DHCP ports to alleviate this problem.
# If you receive your dynamic address by a different means, you
# can probably comment this line.
$IPT -A udp_inbound -p UDP -s 0/0 --source-port 67 --destination-port 68 -j ACCEPT

$IPT -A udp_inbound -p UDP -j RETURN

# udp_outbound chain
#
# This chain is used with a private network to prevent forwarding for
# UDP requests on specific protocols. Applied to the FORWARD rule from
# the internal network. Ends with an ACCEPT

# Nincs talalat, tehat elfogadva (ACCEPT)
$IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT

# tcp_inbound chain
#
# Ez a bejovo, kulso internet felol erkezo
# TCP csomagok helye. Alapban minden tiltva, a lenti
# szolgaltatasok kivetelevel.

# HTTP
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT

# HTTPS (Secure Web Server)
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 443 -j ACCEPT

# FTP Server (Control)
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 21 -j ACCEPT

# FTP Client (Data Port for non-PASV transfers)
$IPT -A tcp_inbound -p TCP -s 0/0 --source-port 20 -j ACCEPT

# Email Server (SMTP)
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 25 -j ACCEPT

# Email Server (POP3)
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 110 -j ACCEPT

# sshd
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT

# Not matched, so return so it will be logged
$IPT -A tcp_inbound -p TCP -j RETURN

# tcp_outbound chain

# No match, so ACCEPT
$IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT

echo "Process INPUT chain ..."

# Minden engedelyezese kintrol
$IPT -A INPUT -p ALL -i $LO_IFACE -j ACCEPT

# Hibas csomagok eldobalasa
$IPT -A INPUT -p ALL -j bad_packets

# Rules for the private network (accessing gateway system itself)
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -s $LOCAL_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -d $LOCAL_BCAST -j ACCEPT

# Internet felol bejovo szabalyok

# Bejovo kapcsolatok elfogadasa
$IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

# Route the rest to the appropriate user chain
$IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound
$IPT -A INPUT -p UDP -i $INET_IFACE -j udp_inbound
$IPT -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets

# Drop without logging broadcasts that get this far.
# Cuts down on log clutter.
# Comment this line if testing new rules that impact
# broadcast protocols.
$IPT -A INPUT -p ALL -d 255.255.255.255 -j DROP

# Log packets that still don't match
$IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died: "

echo "Process FORWARD chain ..."

# Used if forwarding for a private network

# Drop bad packets$IPT -A FORWARD -p ALL -j bad_packets

# Accept TCP packets we want to forward from internal sources
$IPT -A FORWARD -p tcp -i $LOCAL_IFACE -j tcp_outbound

# Accept UDP packets we want to forward from internal sources
$IPT -A FORWARD -p udp -i $LOCAL_IFACE -j udp_outbound

# If not blocked, accept any other packets from the internal interface
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT

# Deal with responses from the internet
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

# Log packets that still don't match
$IPT -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "FORWARD packet died: "

echo "Process OUTPUT chain ..."

# A kifele valo kapcsolodas engedelyezese

# Azonban a hibas kimeno ICMP csomagokat el kell dobni!
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP

# Local host
$IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT

# A belso halozat fele
$IPT -A OUTPUT -p ALL -s $LOCAL_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LOCAL_IFACE -j ACCEPT

# Az internet fele
$IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT

# Azon csomagok naplozasa amik meg mindig nem feleltek meg:
$IPT -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "OUTPUT csomag meghalt: "

echo "Szabalyok betoltese a NAT tablazatbol ..."

$IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE

# !!!!!!!!!!
# Probalkozas az UDP csomagok broadcastjere
# !!!!!!!!!!

EXTIP="193.225.227.255" // ez a ketto nem konkret ip cim hanem broadcast
PORTFWIP="192.168.0.255"

$IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 27015 -j ACCEPT
$IPT -A PREROUTING -t nat -p udp -d $EXTIP --dport 27015 -j DNAT --to $PORTFWIP:27015

$IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 27016 -j ACCEPT
$IPT -A PREROUTING -t nat -p udp -d $EXTIP --dport 27016 -j DNAT --to $PORTFWIP:27016

$IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 27017 -j ACCEPT
$IPT -A PREROUTING -t nat -p udp -d $EXTIP --dport 27017 -j DNAT --to $PORTFWIP:27017

$IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 27018 -j ACCEPT
$IPT -A PREROUTING -t nat -p udp -d $EXTIP --dport 27018 -j DNAT --to $PORTFWIP:27018

$IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 27019 -j ACCEPT
$IPT -A PREROUTING -t nat -p udp -d $EXTIP --dport 27019 -j DNAT --to $PORTFWIP:27019

$IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 27020 -j ACCEPT
$IPT -A PREROUTING -t nat -p udp -d $EXTIP --dport 27020 -j DNAT --to $PORTFWIP:27020

$IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 3997 -j ACCEPT
$IPT -A PREROUTING -t nat -p udp -d $EXTIP --dport 3997 -j DNAT --to $PORTFWIP:3997

$IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 3998 -j ACCEPT
$IPT -A PREROUTING -t nat -p udp -d $EXTIP --dport 3998 -j DNAT --to $PORTFWIP:3998

$IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 27005 -j ACCEPT
$IPT -A PREROUTING -t nat -p udp -d $EXTIP --dport 27005 -j DNAT --to $PORTFWIP:27005

$IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 27007 -j ACCEPT
$IPT -A PREROUTING -t nat -p udp -d $EXTIP --dport 27007 -j DNAT --to $PORTFWIP:27007

$IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 27025 -j ACCEPT
$IPT -A PREROUTING -t nat -p udp -d $EXTIP --dport 27025 -j DNAT --to $PORTFWIP:27025

A válaszokat előre is köszönöm!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

kapgyátok be.
kínait kérdeztem?
:D

Talan:
# apt-cache show bcrelay
Package: bcrelay
Priority: optional
Section: net
Architecture: i386
Source: pptpd
Version: 1.3.0-1ubuntu1
Filename: pool/main/p/pptpd/bcrelay_1.3.0-1ubuntu1_i386.deb
Description: Broadcast relay daemon
The bcrelay daemon relays broadcasts between two interfaces. It is shipped
with the pptpd package, but can be used for other purposes.
X-Original-Maintainer: Rene Mayrhofer

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!