[Megoldva] iptables udp port forward

Sziasztok!

A suliban a következő iptables szabály engedélyezi a portokat:


IPT="/sbin/iptables"
LAN_IFACE="eth0" #A diákok ezen a hálókártyán kommunikálnak
LAN_NET="172.16.0.0/16"
WAN_IFACE="ppp0"

$IPT -A FORWARD -p tcp -i $LAN_IFACE -s $LAN_NET -o $WAN_IFACE -m set --match-set diak-portok dst -j ACCEPT

Ez csak a TCP kapcsolatokat engedélyezi. Kipróbáltam, hozzáadtam az iptables-höz ugyan ezt a szabályt annyi módosítással, hogy a tcp-t átírtam udp-re, de továbbra sincsenek engedélyezve az ipset-ben megadott portok udp-re.

Mi lehet a gond? Hogyan lehetne megoldani? Esetleg át lehet-e írni ezt a szabályt, hogy TCP és UDP portot is feloldja?

Hozzászólások

És a visszirány hova menne?
Élő TCP kapcsolatnál a NAT tábládban tudod, hogy X forgalom melyik LAN gép melyik portja és melyik WAN gép melyik portja között zajlik, mert ez stateful.
UDP-nél pedig elküldted a datagram-ot és annyi, ez egy stateless protokoll.

Vannak mindenféle nat-pmp, upnp és hasonló varázslatok, de ezeket szerintem inkább kisebb LAN-okra találták ki, nem tudom hogy iskolányi szinten mennyire jók.

WAN_IFACE="ppp0"

2016-ban betárcsázós internet? :)

Viccet félretéve két észrevételem lenne:

1. A "port forward" a topik tárgyában kicsit félrevezető, mivel az valójában olyan címfordítást jelent, ahol a tűzfal egy adott IP-címének adott portjára beérkező forgalmat (INPUT lánc) átfordítasz egy másik IP-címre, akár a portszám megtartásával, akár annak megváltoztatásával. Feltételezve, hogy van egy globális, mindenfajta forgalomra vonatkozó NAT szabály a tűzfal POSTROUTING láncában ("-j MASQUERADE" vagy "-j SNAT" céllal), nem lesz szükség címfordításra jelen esetben.
2. A válaszcsomagokat is át kell engedni a tűzfalon. Ezt általában úgy szokás megoldani, hogy a lánc elejére teszel egy olyan szabályt, ami engedélyezi a RELATED és ESTABLISHED állapotban lévő kapcsolatokhoz tartozó csomagokat. Bár az UDP stateless protokoll, az iptables conntrack modulja a forrás és cél IP-k és portok alapján "látja", ha a válaszcsomag egy bentről kezdeményezett kapcsolathoz tartozik és ASSURED állapotba helyezi a kapcsolatot, ami jelen esetben egyenértékű az ESTABLISHED állapottal.

Valami ilyesmire lesz szükség (kipróbálni nem tudom sajnos, emlékezetből írom):


# kimenő forgalom engedélyezése
$IPT -A FORWARD -p udp -i $LAN_IFACE -s $LAN_NET -o $WAN_IFACE -m multiport --dports 5000:5500,8088 -j ACCEPT
# visszajövő forgalom engedélyezése
$IPT -I FORWARD -p udp -i $WAN_IFACE -d $LAN_NET -o $LAN_IFACE -m state RELATED,ESTABLISHED -j ACCEPT

Működhet a dolog ipset használatával is, a lényeg, hogy gondoskodni kell a "kintről" érkező válaszcsomagok átengedéséről is. Ha nem akarod a conntrack állapotokat használni a szabályban, ez is működhet:


# kimenő forgalom engedélyezése
$IPT -A FORWARD -p udp -i $LAN_IFACE -s $LAN_NET -o $WAN_IFACE -m multiport --dports 5000:5500,8088 -j ACCEPT
# visszajövő forgalom engedélyezése
$IPT -A FORWARD -p udp -i $WAN_IFACE -d $LAN_NET -o $LAN_IFACE -m multiport --sports 5000:5500,8088 -j ACCEPT