Add package fff-layer3-ipv4snat #26

Closed
ChristianD wants to merge 1 commits from ChristianD/firmware:ipv4snat into master
Member

With this package it is possible to make SNAT with IPv4 on the router

The user must set a peer_ip setting in gateway.meta.peer_ip to get a single ip for peering interfaces.
At ipaddr the user must set a ip that not use in babel (e.g. 192.168.0.1/16) for the clients

With this package the ipaddr address is SNAT to the peer_ip and every router need only one
freifunk ip and can use the same ipaddr on every router.

It is a system like cgnat from big provider

Signed-off-by: Christian Dresel freifunk@dresel.systems

With this package it is possible to make SNAT with IPv4 on the router The user must set a peer_ip setting in gateway.meta.peer_ip to get a single ip for peering interfaces. At ipaddr the user must set a ip that not use in babel (e.g. 192.168.0.1/16) for the clients With this package the ipaddr address is SNAT to the peer_ip and every router need only one freifunk ip and can use the same ipaddr on every router. It is a system like cgnat from big provider Signed-off-by: Christian Dresel <freifunk@dresel.systems>
rohammer reviewed 2020-12-31 11:18:32 +01:00
@ -0,0 +13,4 @@
TITLE:=Freifunk-Franken layer3 configuration with nat
URL:=https://www.freifunk-franken.de
DEPENDS:= \
+iptables-mod-nat-extra \
Member

braucht es das? Wenn ich opkg frage:

#: opkg info iptables-mod-nat-extra
....
Description: iptables extensions for extra NAT targets.
 
 Targets:
 - MIRROR
 - NETMAP

Aber du verwendest SNAT und machst kein NETMAP.

braucht es das? Wenn ich opkg frage: ``` #: opkg info iptables-mod-nat-extra .... Description: iptables extensions for extra NAT targets. Targets: - MIRROR - NETMAP ``` Aber du verwendest SNAT und machst kein NETMAP.
Author
Member

ohne dem funktioniert kein SNAT, probiere mal mit der aktuellen Firmware ein SNAT:

root@fff-gw-cd-home:~# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.0.1
iptables v1.8.3 (legacy): unknown option "--to-source"
Try `iptables -h' or 'iptables --help' for more information.

mit diesem Ding tut es dann einwandfrei

ohne dem funktioniert kein SNAT, probiere mal mit der aktuellen Firmware ein SNAT: root@fff-gw-cd-home:~# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.0.1 iptables v1.8.3 (legacy): unknown option "--to-source" Try `iptables -h' or 'iptables --help' for more information. mit diesem Ding tut es dann einwandfrei
Member

Hi, kannst du auch zu machen. Das macht OpenWrt einfach so. Die haben sich scheinbar das libipt_SNAT einfach weggespart und man muss das obige nehmen. Das bringt libipt_NETMAP mit. Und das kann das auch plus NETMAP

Hi, kannst du auch zu machen. Das macht OpenWrt einfach so. Die haben sich scheinbar das libipt_SNAT einfach weggespart und man muss das obige nehmen. Das bringt libipt_NETMAP mit. Und das kann das auch plus NETMAP
ChristianD marked this conversation as resolved
rohammer reviewed 2020-12-31 11:19:47 +01:00
@ -0,0 +7,4 @@
# Check if NAT is set
# If NAT is set
if uci -q get gateway.@client[0].nat; then
Member

Da kommt die Frage auf, was ist mit @client[n]?

Da kommt die Frage auf, was ist mit @client[n]?
Author
Member

das ist bisher nicht vorgesehen und überall so gebaut, daher habe ich das auch erstmal so weiter übernommen. Will man mal ein @client[n] haben muss man das hier mit anpassen

das ist bisher nicht vorgesehen und überall so gebaut, daher habe ich das auch erstmal so weiter übernommen. Will man mal ein @client[n] haben muss man das hier mit anpassen
Member

Ich fände es schon gut, wenn man bei einem zweiten Clientnetz auch nat einschalten koennte. Oder eins ohne und das andere mit. usw.

Ich fände es schon gut, wenn man bei einem zweiten Clientnetz auch nat einschalten koennte. Oder eins ohne und das andere mit. usw.
Author
Member

Ich glaube aktuell funktioniert technisch noch gar kein 2. Clientnetz (Interface anlegen und Kram fehlt da alles). Daher kann man da auch noch kein SNAT einschalten wenn kein 2. Client funktioniert.

Korrigiert mich wenn ich falsch liege

Ich glaube aktuell funktioniert technisch noch gar kein 2. Clientnetz (Interface anlegen und Kram fehlt da alles). Daher kann man da auch noch kein SNAT einschalten wenn kein 2. Client funktioniert. Korrigiert mich wenn ich falsch liege
rohammer reviewed 2020-12-31 11:25:54 +01:00
@ -0,0 +16,4 @@
# first we flush the table
iptables -t nat --flush
# and load the new settings
iptables -t nat -A POSTROUTING -s $ipaddr -j SNAT --to-source $peer_ip
Member

-s $ipaddr matcht doch nur die IP des Routers. Moechte man nicht das clientnetz natten? Also hier die Netzwerkadresse/mask eintragen.

Im Wiki steht gateway.@client[0].ipaddr als Type "list" drin. Was passiert, wenn da mal mehrere vorhanden sind?

-s $ipaddr matcht doch nur die IP des Routers. Moechte man nicht das clientnetz natten? Also hier die Netzwerkadresse/mask eintragen. Im Wiki steht gateway.@client[0].ipaddr als Type "list" drin. Was passiert, wenn da mal mehrere vorhanden sind?
Author
Member

in $ipaddr steht das Netz, was an br-client gehangen wird:

ipaddr=$(uci get gateway.@client[0].ipaddr); then

also z.b. 192.168.0.1/16

root@testknoten:~# uci get gateway.@client[0].ipaddr
192.168.0.1/16

in $peer_ip steht die IP Adresse die per Babel ins Freifunk announced wird und worauf geNATet wird:

if ! peer_ip=$(uci get gateway.meta.peer_ip); then

also z.b. 10.50.169.106 (ohne Subnetzmaske, es handelt sich aber um ein /32)

root@testknoten:~# uci get gateway.meta.peer_ip
10.50.169.106

Demnach NATet das iptables das gesamte 192.168.0.1/16 auf 10.50.169.106

Die eiinzige Frage die ich mir gerade stelle, eigentlicbh wäre 192.168.0.0/16 ich vermute aber mal das dies iptables egal ist. 192.168.0.0/16 kann ich aber nicht als gateway.@client[0].ipaddr eintragen, da dies genauso wie es dort steht an br-client gehangen wird.

Hier mal meine Beispielrouterkonfiguration und wie es auf dem Interfaces aussieht (eth0.3 ist das Babel Peering Interface):

root@testknoten:~# cat /etc/config/gateway 

config gateway 'meta'
	option config_version '1'
	option peer_ip '10.50.169.106'

config gateway
	option name 'cdtest'

config dns
	list server '10.50.138.5'

config client
	option vlan '1'
	option essid 'bla.freifunk'
	option chan2ghz '13'
	list ip6addr '2a0b:f4c0:1a:7B::/64'
	option nat '1'
	option ipaddr '192.168.0.1/16'
	option dhcp_start '192.168.1.1'

config vlan '1'
	option comment 'client'
	option ports '0t 4 5'

config vlan '2'
	option comment 'wan'
	option ports '0t 1'

config vlan '3'
	option comment 'babelpeer'
	option ports '0t 2 3'

config babelpeer 'vlan3'
	option vlan '3'
	option type 'wired'
	option rxcost '96'
root@testknoten:~# ifconfig
br-client Link encap:Ethernet  HWaddr F8:1A:67:A6:03:05  
          inet addr:192.168.0.1  Bcast:192.168.255.255  Mask:255.255.0.0
          inet6 addr: fdff::fa1a:67ff:fea6:305/64 Scope:Global
          inet6 addr: 2a0b:f4c0:1a:7b::/64 Scope:Global
          inet6 addr: fdff::1/64 Scope:Global
          inet6 addr: fe80::fa1a:67ff:fea6:305/64 Scope:Link
          inet6 addr: fdff::f81a:67a6:305/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13115 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:92 (92.0 B)  TX bytes:905378 (884.1 KiB)

eth0      Link encap:Ethernet  HWaddr F8:1A:67:A6:03:05  
          inet6 addr: fe80::fa1a:67ff:fea6:305/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1272308 errors:0 dropped:1 overruns:0 frame:0
          TX packets:386278 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:942974003 (899.2 MiB)  TX bytes:84271565 (80.3 MiB)
          Base address:0x8000 

eth0.1    Link encap:Ethernet  HWaddr F8:1A:67:A6:03:05  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13115 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:92 (92.0 B)  TX bytes:905378 (884.1 KiB)

eth0.2    Link encap:Ethernet  HWaddr F8:1A:67:A6:03:05  
          inet6 addr: fe80::fa1a:67ff:fea6:305/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:120277 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:41133614 (39.2 MiB)

eth0.3    Link encap:Ethernet  HWaddr FA:1A:67:A6:03:04  
          inet addr:10.50.169.106  Bcast:255.255.255.255  Mask:255.255.255.255
          inet6 addr: fe80::f81a:67ff:fea6:304/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1272125 errors:0 dropped:12034 overruns:0 frame:0
          TX packets:228776 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:925075993 (882.2 MiB)  TX bytes:39010419 (37.2 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:40070 errors:0 dropped:0 overruns:0 frame:0
          TX packets:40070 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:387468713 (369.5 MiB)  TX bytes:387468713 (369.5 MiB)

w2ap      Link encap:Ethernet  HWaddr F8:1A:67:A6:03:04  
          inet6 addr: fe80::fa1a:67ff:fea6:304/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:18 errors:0 dropped:0 overruns:0 frame:0
          TX packets:37144 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2272 (2.2 KiB)  TX bytes:3240195 (3.0 MiB)

root@testknoten:~# iptables -t nat --list -v
Chain PREROUTING (policy ACCEPT 10333 packets, 647K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 1499 packets, 107K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 323 packets, 24532 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 323 packets, 24532 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 SNAT       all  --  any    any     192.168.0.0/16       anywhere             to:10.50.169.106

und jetzt bei der iptables Ausgabe sieht man, das iptables das auch richtig macht und wenn es ein 192.168.0.1/16 bekommt, einfach das richtige 192.168.0.0/16 einträgt, so wie ich es erwartet habe

in $ipaddr steht das Netz, was an br-client gehangen wird: ipaddr=$(uci get gateway.@client[0].ipaddr); then also z.b. 192.168.0.1/16 root@testknoten:~# uci get gateway.@client[0].ipaddr 192.168.0.1/16 in $peer_ip steht die IP Adresse die per Babel ins Freifunk announced wird und worauf geNATet wird: if ! peer_ip=$(uci get gateway.meta.peer_ip); then also z.b. 10.50.169.106 (ohne Subnetzmaske, es handelt sich aber um ein /32) root@testknoten:~# uci get gateway.meta.peer_ip 10.50.169.106 Demnach NATet das iptables das gesamte 192.168.0.1/16 auf 10.50.169.106 Die eiinzige Frage die ich mir gerade stelle, eigentlicbh wäre 192.168.0.0/16 ich vermute aber mal das dies iptables egal ist. 192.168.0.0/16 kann ich aber nicht als gateway.@client[0].ipaddr eintragen, da dies genauso wie es dort steht an br-client gehangen wird. Hier mal meine Beispielrouterkonfiguration und wie es auf dem Interfaces aussieht (eth0.3 ist das Babel Peering Interface): ``` root@testknoten:~# cat /etc/config/gateway config gateway 'meta' option config_version '1' option peer_ip '10.50.169.106' config gateway option name 'cdtest' config dns list server '10.50.138.5' config client option vlan '1' option essid 'bla.freifunk' option chan2ghz '13' list ip6addr '2a0b:f4c0:1a:7B::/64' option nat '1' option ipaddr '192.168.0.1/16' option dhcp_start '192.168.1.1' config vlan '1' option comment 'client' option ports '0t 4 5' config vlan '2' option comment 'wan' option ports '0t 1' config vlan '3' option comment 'babelpeer' option ports '0t 2 3' config babelpeer 'vlan3' option vlan '3' option type 'wired' option rxcost '96' ``` ``` root@testknoten:~# ifconfig br-client Link encap:Ethernet HWaddr F8:1A:67:A6:03:05 inet addr:192.168.0.1 Bcast:192.168.255.255 Mask:255.255.0.0 inet6 addr: fdff::fa1a:67ff:fea6:305/64 Scope:Global inet6 addr: 2a0b:f4c0:1a:7b::/64 Scope:Global inet6 addr: fdff::1/64 Scope:Global inet6 addr: fe80::fa1a:67ff:fea6:305/64 Scope:Link inet6 addr: fdff::f81a:67a6:305/64 Scope:Global UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2 errors:0 dropped:0 overruns:0 frame:0 TX packets:13115 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:92 (92.0 B) TX bytes:905378 (884.1 KiB) eth0 Link encap:Ethernet HWaddr F8:1A:67:A6:03:05 inet6 addr: fe80::fa1a:67ff:fea6:305/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1272308 errors:0 dropped:1 overruns:0 frame:0 TX packets:386278 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:942974003 (899.2 MiB) TX bytes:84271565 (80.3 MiB) Base address:0x8000 eth0.1 Link encap:Ethernet HWaddr F8:1A:67:A6:03:05 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2 errors:0 dropped:0 overruns:0 frame:0 TX packets:13115 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:92 (92.0 B) TX bytes:905378 (884.1 KiB) eth0.2 Link encap:Ethernet HWaddr F8:1A:67:A6:03:05 inet6 addr: fe80::fa1a:67ff:fea6:305/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:120277 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:41133614 (39.2 MiB) eth0.3 Link encap:Ethernet HWaddr FA:1A:67:A6:03:04 inet addr:10.50.169.106 Bcast:255.255.255.255 Mask:255.255.255.255 inet6 addr: fe80::f81a:67ff:fea6:304/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1272125 errors:0 dropped:12034 overruns:0 frame:0 TX packets:228776 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:925075993 (882.2 MiB) TX bytes:39010419 (37.2 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:40070 errors:0 dropped:0 overruns:0 frame:0 TX packets:40070 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:387468713 (369.5 MiB) TX bytes:387468713 (369.5 MiB) w2ap Link encap:Ethernet HWaddr F8:1A:67:A6:03:04 inet6 addr: fe80::fa1a:67ff:fea6:304/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:18 errors:0 dropped:0 overruns:0 frame:0 TX packets:37144 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2272 (2.2 KiB) TX bytes:3240195 (3.0 MiB) ``` ``` root@testknoten:~# iptables -t nat --list -v Chain PREROUTING (policy ACCEPT 10333 packets, 647K bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 1499 packets, 107K bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 323 packets, 24532 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 323 packets, 24532 bytes) pkts bytes target prot opt in out source destination 0 0 SNAT all -- any any 192.168.0.0/16 anywhere to:10.50.169.106 ``` und jetzt bei der iptables Ausgabe sieht man, das iptables das auch richtig macht und wenn es ein 192.168.0.1/16 bekommt, einfach das richtige 192.168.0.0/16 einträgt, so wie ich es erwartet habe
Author
Member

Tatsächlich steht im Wiki ipaddr als list drinnen, das macht aber in meinen Augen keinen Sinn und wie man bei meinen Beispiel sieht nutze ich eigentlich auch generell option für ipv4.

Ich bin dafür das zu ändern.

Tatsächlich steht im Wiki ipaddr als list drinnen, das macht aber in meinen Augen keinen Sinn und wie man bei meinen Beispiel sieht nutze ich eigentlich auch generell option für ipv4. Ich bin dafür das zu ändern.
Member

Danke, wieder was gelernt.
Du kannst hier zu machen.
Das mit der ipaddr als list sollte man vielleicht noch mal in die Runde fragen.

Danke, wieder was gelernt. Du kannst hier zu machen. Das mit der ipaddr als list sollte man vielleicht noch mal in die Runde fragen.
ChristianD marked this conversation as resolved
adschm reviewed 2020-12-31 16:38:49 +01:00
@ -0,0 +3,4 @@
PKG_NAME:=fff-ipv4snat
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/fff-ipv4snat
Owner

PKG_BUILD_DIR kann weg, ist default.

PKG_BUILD_DIR kann weg, ist default.
ChristianD marked this conversation as resolved
Owner

Was ist SNAT?

Ich würde fff-ipv4-snat als Name bevorzugen. Generell könnte man noch ein bisschen mehr schwafeln, was das Package dann tun soll (für die Commit-Message; zur Not auf Deutsch und ich übersetze es dir ;-))

Was ist SNAT? Ich würde fff-ipv4-snat als Name bevorzugen. Generell könnte man noch ein bisschen mehr schwafeln, was das Package dann tun soll (für die Commit-Message; zur Not auf Deutsch und ich übersetze es dir ;-))
adschm added the
feature
layer3
packages/fff
labels 2020-12-31 16:43:16 +01:00
Author
Member

Was ist SNAT?

Ich könnte dir jetzt Textteile kopiere aber... Reicht das auch so?

https://www.itwissen.info/SNAT-source-NAT.html

Grundsätzlich das gleiche NAT wie du es bei deinen Heimrouter kennst, nur das hier auf eine fixe IP Adresse (der RouterIP) geNATet wird und nicht wie bei masquerade auf die IP die gerade aktuell auf einem Interface liegt.

Ich würde fff-ipv4-snat als Name bevorzugen.

Wie wäre es mit fff-layer3-ipv4snat ? Immerhin ist das eine layer3 Erweiterung?

Generell könnte man noch ein bisschen mehr schwafeln, was das Package dann tun soll (für die Commit-Message; zur Not auf Deutsch und ich übersetze es dir ;-))

Ich überlege mal ;)

> Was ist SNAT? Ich könnte dir jetzt Textteile kopiere aber... Reicht das auch so? https://www.itwissen.info/SNAT-source-NAT.html Grundsätzlich das gleiche NAT wie du es bei deinen Heimrouter kennst, nur das hier auf eine fixe IP Adresse (der RouterIP) geNATet wird und nicht wie bei masquerade auf die IP die gerade aktuell auf einem Interface liegt. > > Ich würde fff-ipv4-snat als Name bevorzugen. Wie wäre es mit fff-layer3-ipv4snat ? Immerhin ist das eine layer3 Erweiterung? >Generell könnte man noch ein bisschen mehr schwafeln, was das Package dann tun soll (für die Commit-Message; zur Not auf Deutsch und ich übersetze es dir ;-)) Ich überlege mal ;)
ChristianD force-pushed ipv4snat from 23b89ca465 to baedc4ae60 2021-01-01 09:06:29 +01:00 Compare
Author
Member

Diverse Kleinigkeiten überarbeitet:

  • PKG_BUILD_DIR entfernt
  • Warnung bei ipaddr=$(uci get gateway.@client[0].ipaddr entfernt und Abschnitt verschoben
  • for Konstrukt um "iptables -t nat -A POSTROUTING -s $ip -j SNAT --to-source $peer_ip" da es theoretisch möglich ist, das mehrere IPv4 Adressen gesetzt sein können
  • commit msg erweitert (gerne mein denglisch ausbessern ;))
  • rm auf rm -rf erweitert um sicher und ohne nachfrage zu löschen

noch offen:

  • @client[n], ich persönlich würde es gerne erstmal so lassen
  • packagename anpassen, warte darauf wie mein Vorschlag ankommt
Diverse Kleinigkeiten überarbeitet: - PKG_BUILD_DIR entfernt - Warnung bei ipaddr=$(uci get gateway.@client[0].ipaddr entfernt und Abschnitt verschoben - for Konstrukt um "iptables -t nat -A POSTROUTING -s $ip -j SNAT --to-source $peer_ip" da es theoretisch möglich ist, das mehrere IPv4 Adressen gesetzt sein können - commit msg erweitert (gerne mein denglisch ausbessern ;)) - rm auf rm -rf erweitert um sicher und ohne nachfrage zu löschen noch offen: - @client[n], ich persönlich würde es gerne erstmal so lassen - packagename anpassen, warte darauf wie mein Vorschlag ankommt
Owner

Wie wäre es mit fff-layer3-ipv4snat ? Immerhin ist das eine layer3 Erweiterung?

Weiß nicht, ob wir diesen Weg gehen sollten. Nur weil wir es gerade "nur" für layer3 implementiert haben ist es ja per se keine layer-3-spezifische Funktion? Ich würde eher bei fff-ipv4-snat bleiben, oder ggf. fff-snat-ipv4, weil eigentlich ersteres die Funktion ist, und ipv4 die "Variante"?

> Wie wäre es mit fff-layer3-ipv4snat ? Immerhin ist das eine layer3 Erweiterung? Weiß nicht, ob wir diesen Weg gehen sollten. Nur weil wir es gerade "nur" für layer3 implementiert haben ist es ja per se keine layer-3-spezifische Funktion? Ich würde eher bei fff-ipv4-snat bleiben, oder ggf. fff-snat-ipv4, weil eigentlich ersteres die Funktion ist, und ipv4 die "Variante"?
adschm reviewed 2021-01-01 17:18:48 +01:00
@ -0,0 +8,4 @@
define Package/fff-ipv4snat
SECTION:=base
CATEGORY:=Freifunk
TITLE:=Freifunk-Franken layer3 configuration with nat
Owner

nat->snat?

Entweder überall SNAT oder es ist nicht so wichtig und wir nehmen überall NAT ...

nat->snat? Entweder überall SNAT oder es ist nicht so wichtig und wir nehmen überall NAT ...
Author
Member

ja sollte man wohl ändern, mach ich beim nächsten Update mit

ja sollte man wohl ändern, mach ich beim nächsten Update mit
ChristianD marked this conversation as resolved
Author
Member

Wie wäre es mit fff-layer3-ipv4snat ? Immerhin ist das eine layer3 Erweiterung?

Weiß nicht, ob wir diesen Weg gehen sollten. Nur weil wir es gerade "nur" für layer3 implementiert haben ist es ja per se keine layer-3-spezifische Funktion? Ich würde eher bei fff-ipv4-snat bleiben, oder ggf. fff-snat-ipv4, weil eigentlich ersteres die Funktion ist, und ipv4 die "Variante"?

für die Node Firmware macht das ganze absolut gar keinen Sinn. Ich finde schon das es eine Layer 3 spezielle Funktion ist, die auch nur mit der +fff-layer3-config funktioniert (daher die Abhängigkeit dorthin). Ich hab sogar anfangs überlegt das Script einfach in fff-layer3-config abzulegen ohne eigenes package. Der Grund warum ich mich dagegen entschieden habe war, wenn jemand absolut kein NAT möchte weil er der Meinung ist das dies absolut gegen Freifunkprinzipien ist, kann er das Paket abwählen oder auch wenn die Community/Entwickler sagen, wir wollen das keinesfalls in der offiziellen Firmware, dann kann ich das für mich als extra Paket einfach mit anwählen beim bauen.

Schlussendlich ist es mir aber eigentlich wirklich egal, ich will da jetzt auch nicht ewig deshalb diskutieren, sag was dir am besten gefällt dann machen wir es so ;)

> > Wie wäre es mit fff-layer3-ipv4snat ? Immerhin ist das eine layer3 Erweiterung? > > Weiß nicht, ob wir diesen Weg gehen sollten. Nur weil wir es gerade "nur" für layer3 implementiert haben ist es ja per se keine layer-3-spezifische Funktion? Ich würde eher bei fff-ipv4-snat bleiben, oder ggf. fff-snat-ipv4, weil eigentlich ersteres die Funktion ist, und ipv4 die "Variante"? für die Node Firmware macht das ganze absolut gar keinen Sinn. Ich finde schon das es eine Layer 3 spezielle Funktion ist, die auch nur mit der +fff-layer3-config funktioniert (daher die Abhängigkeit dorthin). Ich hab sogar anfangs überlegt das Script einfach in fff-layer3-config abzulegen ohne eigenes package. Der Grund warum ich mich dagegen entschieden habe war, wenn jemand absolut kein NAT möchte weil er der Meinung ist das dies absolut gegen Freifunkprinzipien ist, kann er das Paket abwählen oder auch wenn die Community/Entwickler sagen, wir wollen das keinesfalls in der offiziellen Firmware, dann kann ich das für mich als extra Paket einfach mit anwählen beim bauen. Schlussendlich ist es mir aber eigentlich wirklich egal, ich will da jetzt auch nicht ewig deshalb diskutieren, sag was dir am besten gefällt dann machen wir es so ;)
Member

fff-layer3-ipv4snat ist doch ok, da es "nur" eine Erweiterung vom configuregatewayl3-config ist.

fff-layer3-ipv4snat ist doch ok, da es "nur" eine Erweiterung vom configure~~gateway~~l3-config ist.
ChristianD force-pushed ipv4snat from baedc4ae60 to 7c9b8d03f5 2021-01-10 12:09:45 +01:00 Compare
Author
Member

Ich hab das package jetzt mal nach fff-layer3-ipv4snat unbenannt und auch alle NAT in SNAT unbenannt damit es gleich ist.

Ich hab das package jetzt mal nach fff-layer3-ipv4snat unbenannt und auch alle NAT in SNAT unbenannt damit es gleich ist.
ChristianD changed title from Add package fff-ipv4snat to Add package fff-layer3-ipv4snat 2021-01-10 12:12:07 +01:00
fbl requested changes 2021-01-10 23:39:37 +01:00
fbl left a comment
Owner

An sich gefällt mir die Idee, an der Implementierung müssen wir aber noch etwas feilen. So wie es jetzt ist, ist mir das ganze deutlich zu anfällig bei späteren Änderungen kaputt zu gehen.

An sich gefällt mir die Idee, an der Implementierung müssen wir aber noch etwas feilen. So wie es jetzt ist, ist mir das ganze deutlich zu anfällig bei späteren Änderungen kaputt zu gehen.
@ -0,0 +4,4 @@
# If NAT is set
if uci -q get gateway.@client[0].nat; then
if ! peer_ip=$(uci get gateway.meta.peer_ip); then
echo "WARNING: No peer_ip set! For NAT you must set a peer_ip"
Owner

Wenn ein Feature konfiguriert ist, was mit der aktuellen Konfiguration nicht umsetzbar ist, unbedingt mit Fehler beenden, damit die Konfiguration nicht fertig läuft.
Außerdem dann "ERROR: " statt "WARNING: "

Wenn ein Feature konfiguriert ist, was mit der aktuellen Konfiguration nicht umsetzbar ist, unbedingt mit Fehler beenden, damit die Konfiguration nicht fertig läuft. Außerdem dann "ERROR: " statt "WARNING: "
@ -0,0 +14,4 @@
# configure-layer3 -t - reload set the iptables rule not rebootsafe
reload() {
# first we flush the table
iptables -t nat --flush
Owner

Die ganze Tabelle zu flushen ist für mich hier ein no-go. Damit flusht man sich potentiell sehr viel mehr weg, als man eigentlich möchte. Das explodiert, wenn man auch nur eine andere Sache in die nat-Tabelle eintragen möchte.

Entweder wir finden einen Weg die Regel wieder sauber zu finden, oder wir starten die ganze Firewall neu, so dass alle Regeln nochmal sauber angewendet werden - war mir eigentlich viel lieber wäre. Ggf. muss man hier noch die Firewall anpassen.
Vorsicht: Die Schnittstelle unserer Firewall gibt aktuell eigentlich kein apply-before-safe her. Da müsste man wohl noch was bauen, z.B. dass die Firewall noch Zeug aus /tmp included, was nach Reboot weg ist. Vielleicht lohnt es sich hier mal zu gucken wie uci das macht.

Die ganze Tabelle zu flushen ist für mich hier ein no-go. Damit flusht man sich potentiell sehr viel mehr weg, als man eigentlich möchte. Das explodiert, wenn man auch nur eine andere Sache in die nat-Tabelle eintragen möchte. Entweder wir finden einen Weg die Regel wieder sauber zu finden, oder wir starten die ganze Firewall neu, so dass alle Regeln nochmal sauber angewendet werden - war mir eigentlich viel lieber wäre. Ggf. muss man hier noch die Firewall anpassen. Vorsicht: Die Schnittstelle unserer Firewall gibt aktuell eigentlich kein apply-before-safe her. Da müsste man wohl noch was bauen, z.B. dass die Firewall noch Zeug aus /tmp included, was nach Reboot weg ist. Vielleicht lohnt es sich hier mal zu gucken wie uci das macht.
Author
Member

Prinzipiell gebe ich dir erstmal recht, flush ist unschön.
Anderseits muss ich aber sicherstellen, das nicht irgendeine rule dabei steht die meine rule unbrauchbar macht sonst funktioniert im worst case das ganze Paket hier nicht. Man könnte also sagen der flush ist nötig damit ich einen sicheren Ausgangszustand habe. Vermutlich ist aber auch hier flush wieder der falsche Weg.

Beim OpenWRT werden die uci firewall in /etc/config/network geschrieben allerdings ist dafür ein firewall Paket nötig das wir nicht haben (glaube ich zumindest, müsste ich jetzt nochmal gucken).

Die ganze Firewall neu starten ist vielleicht keine schlechte Idee, darüber denke ich mal nach vllt. kann man da was brauchbares draus machen.

Dein apply-bevor-safe "Problem" verstehe ich gerade nicht.

Prinzipiell gebe ich dir erstmal recht, flush ist unschön. Anderseits muss ich aber sicherstellen, das nicht irgendeine rule dabei steht die meine rule unbrauchbar macht sonst funktioniert im worst case das ganze Paket hier nicht. Man könnte also sagen der flush ist nötig damit ich einen sicheren Ausgangszustand habe. Vermutlich ist aber auch hier flush wieder der falsche Weg. Beim OpenWRT werden die uci firewall in /etc/config/network geschrieben allerdings ist dafür ein firewall Paket nötig das wir nicht haben (glaube ich zumindest, müsste ich jetzt nochmal gucken). Die ganze Firewall neu starten ist vielleicht keine schlechte Idee, darüber denke ich mal nach vllt. kann man da was brauchbares draus machen. Dein apply-bevor-safe "Problem" verstehe ich gerade nicht.
Owner

Dein apply-bevor-safe "Problem" verstehe ich gerade nicht.

Wenn du die Firewallregeln schon beim Test anlegst (configuregateway -t), dann ist die Firewallregeln schon rebootsicher abgelegt. Alle anderen Einstellungen gehen verloren, wenn man kein commit macht und dann rebootet.

Daher müsste man die Firewall so erweitern, dass diese auch irgendwoher nicht-persistente Regeln lesen kann. Beispielsweise aus der Ramdisk, also /tmp.

> Dein apply-bevor-safe "Problem" verstehe ich gerade nicht. Wenn du die Firewallregeln schon beim Test anlegst (configuregateway -t), dann ist die Firewallregeln schon rebootsicher abgelegt. Alle anderen Einstellungen gehen verloren, wenn man kein commit macht und dann rebootet. Daher müsste man die Firewall so erweitern, dass diese auch irgendwoher nicht-persistente Regeln lesen kann. Beispielsweise aus der Ramdisk, also /tmp.
@ -0,0 +27,4 @@
iptables -t nat --flush
rm -rf /usr/lib/firewall.d/30-NAT
for ip in $ipaddr; do
iptables -t nat -A POSTROUTING -s $ip -j SNAT --to-source $peer_ip
Owner

reload() wird automatisch auch nach einem apply() aufgerufen. Hier gehört also nur rein, was tatsächlich das "applien" betrifft.

reload() wird automatisch auch nach einem apply() aufgerufen. Hier gehört also nur rein, was tatsächlich das "applien" betrifft.
Author
Member

Hm ich stolpere hier gerade drüber:

Wenn ich Testmode verwende, will ich die rule nur in /tmp haben also muss in reload() ein:

echo "iptables -t nat -A POSTROUTING -s $ip -j SNAT --to-source $peer_ip" >> /tmp/firewall.d/30-NAT

rein.

in applien soll die rule nach /usr/lib/firewall.d/30-NAT einfügen, da danach aber wieder ein reload() aufgerufen wird, ist sie automatisch auch wieder im /tmp drinnen und damit doppelt vorhanden wenn man die Firewall neu startet. Irgendwie mäh oder überseh ich etwas?

Hm ich stolpere hier gerade drüber: Wenn ich Testmode verwende, will ich die rule nur in /tmp haben also muss in reload() ein: echo "iptables -t nat -A POSTROUTING -s $ip -j SNAT --to-source $peer_ip" >> /tmp/firewall.d/30-NAT rein. in applien soll die rule nach /usr/lib/firewall.d/30-NAT einfügen, da danach aber wieder ein reload() aufgerufen wird, ist sie automatisch auch wieder im /tmp drinnen und damit doppelt vorhanden wenn man die Firewall neu startet. Irgendwie mäh oder überseh ich etwas?
Author
Member

Vielleicht erledigt sich das aber damit #26 (comment)

Ich werde erstmal die uci Idee weiter verfolgen bevor ich nochmal an /tmp bastel

Vielleicht erledigt sich das aber damit https://git.freifunk-franken.de/freifunk-franken/firmware/pulls/26#issuecomment-955 Ich werde erstmal die uci Idee weiter verfolgen bevor ich nochmal an /tmp bastel
adschm reviewed 2021-01-13 21:43:10 +01:00
@ -0,0 +2,4 @@
# Check if NAT is set
# If NAT is set
if uci -q get gateway.@client[0].nat; then
Owner

Mir gefällt die Hierarchie-Änderung hier nicht. Ich fände es wesentlich schöner, wenn man innerhalb der Funktionen Bedingungen ansetzt als die Funktionen anhand einer Bedingung zu definieren.

Mir gefällt die Hierarchie-Änderung hier nicht. Ich fände es wesentlich schöner, wenn man innerhalb der Funktionen Bedingungen ansetzt als die Funktionen anhand einer Bedingung zu definieren.
Author
Member

Geb ich dir mittlerweile recht, ich denke auch das umzudrehen ist besser. Ist in Arbeit

Geb ich dir mittlerweile recht, ich denke auch das umzudrehen ist besser. Ist in Arbeit
Member

Hi Christian,
irgendwie zwickt sich das alles. Ich denke es liegt daran, dass eine iptables rule via uci konfiguriert werden soll. Sowas haben wir noch nicht. Du hast versucht den uci-Mechanismus mit set-revert-commit usw. irgendwie nachzubauen. Darum auch das flushen und direktes Schreiben der ruls im Skript. Das hat da echt nix verloren.
Besser waere es doch, wenn die rules grundsaetzlich in Abhaengigkeit von uci-Eintraegen gesetzt/konfiguriert wird. Also in /usr/lib/firewall.d/30-NAT sowas: uci get gateway.@client[$n].nat && iptables -t nat -A POSTROUTING .... Und im 33-snat.conf Skript machst du wie gewohnt nur die uci-Settings. Damit hat man auch den set-revert-commit Mechanismus, und muss nicht mit Files in /tmp rum machen.
Und am Schluss immer ein /etc/init.d/firewall start.
Es gibt auch schon einen procd_add_reload_trigger "fff-firewall" im init-Skript. Ob es sich lohnt, wegen der einen nat-Zeile damit was zu machen, kann ich auf die Schnelle nicht sagen.

Ps. Du hast sicher das [$n] bemerkt. Ich lass nicht locker ;-)

Hi Christian, irgendwie zwickt sich das alles. Ich denke es liegt daran, dass eine iptables rule via uci konfiguriert werden soll. Sowas haben wir noch nicht. Du hast versucht den uci-Mechanismus mit set-revert-commit usw. irgendwie nachzubauen. Darum auch das flushen und direktes Schreiben der ruls im Skript. Das hat da echt nix verloren. Besser waere es doch, wenn die rules grundsaetzlich in Abhaengigkeit von uci-Eintraegen gesetzt/konfiguriert wird. Also in /usr/lib/firewall.d/30-NAT sowas: `uci get gateway.@client[$n].nat && iptables -t nat -A POSTROUTING .... ` Und im `33-snat.conf` Skript machst du wie gewohnt nur die uci-Settings. Damit hat man auch den set-revert-commit Mechanismus, und muss nicht mit Files in /tmp rum machen. Und am Schluss immer ein /etc/init.d/firewall start. Es gibt auch schon einen `procd_add_reload_trigger "fff-firewall"` im init-Skript. Ob es sich lohnt, wegen der einen nat-Zeile damit was zu machen, kann ich auf die Schnelle nicht sagen. Ps. Du hast sicher das `[$n]` bemerkt. Ich lass nicht locker ;-)
Author
Member

Hallo Robert

Die Idee ist grundsätzlich gar nicht schlecht aber:

Also in /usr/lib/firewall.d/30-NAT sowas: uci get gateway.@client[$n].nat && iptables -t nat -A POSTROUTING .... Und im 33-snat.conf Skript machst du wie gewohnt nur die uci-Settings. Damit hat man auch den set-revert-commit Mechanismus, und muss nicht mit Files in /tmp rum machen.

Da komme ich gerade nicht ganz mit, die uci get gateway... ist ja etwas, was der User schreibt. Wohin mach ich dann mein set-revert-commit Zeug? Ich brauch da doch noch eine weitere uci file wo ich das Zeug hinterlege oder?

Also User setzt uci get gateway.@client[$n].nat=1

Das set-revert-commit in 33-snat.conf liest das nun und muss nun irgendwohin ein uci set (und commit mit apply()) machen das dann von /usr/lib/firewall.d/30-NAT wieder gelesen werden kann. Wohin ist dieses irgendwohin?

Ps. Du hast sicher das [$n] bemerkt. Ich lass nicht locker ;-)

Ich glaub das purzelt bei deiner Idee dann am Ende recht leicht mit raus, auch wenn wir gar keinen Mechanismus für [$n] aktuell haben (man kann es auch ohne NAT aktuell nicht verwenden) schau ich mal ob man das mit rein bekommt.

Hallo Robert Die Idee ist grundsätzlich gar nicht schlecht aber: > Also in /usr/lib/firewall.d/30-NAT sowas: `uci get gateway.@client[$n].nat && iptables -t nat -A POSTROUTING .... ` Und im `33-snat.conf` Skript machst du wie gewohnt nur die uci-Settings. Damit hat man auch den set-revert-commit Mechanismus, und muss nicht mit Files in /tmp rum machen. Da komme ich gerade nicht ganz mit, die uci get gateway... ist ja etwas, was der User schreibt. Wohin mach ich dann mein set-revert-commit Zeug? Ich brauch da doch noch eine weitere uci file wo ich das Zeug hinterlege oder? Also User setzt uci get gateway.@client[$n].nat=1 Das set-revert-commit in 33-snat.conf liest das nun und muss nun irgendwohin ein uci set (und commit mit apply()) machen das dann von /usr/lib/firewall.d/30-NAT wieder gelesen werden kann. Wohin ist dieses irgendwohin? > Ps. Du hast sicher das `[$n]` bemerkt. Ich lass nicht locker ;-) Ich glaub das purzelt bei deiner Idee dann am Ende recht leicht mit raus, auch wenn wir gar keinen Mechanismus für [$n] aktuell haben (man kann es auch ohne NAT aktuell nicht verwenden) schau ich mal ob man das mit rein bekommt.
Author
Member

Ich hab zu @rohammer Idee hier mal ein RFC gemacht: #79

Ich hab zu @rohammer Idee hier mal ein RFC gemacht: https://git.freifunk-franken.de/freifunk-franken/firmware/pulls/79
Author
Member

Kann zugemacht werden, geht hier weiter:

#79

Kann zugemacht werden, geht hier weiter: https://git.freifunk-franken.de/freifunk-franken/firmware/pulls/79
ChristianD closed this pull request 2021-01-27 23:04:52 +01:00

Pull request closed

Sign in to join this conversation.
No description provided.