Re: [List] ipfw nat on 14.4 not working
Philipp <[email protected]> Fri, 17 Jul 2026 21:33:05 +0200
| Newsgroups | gmane.os.freebsd.questions |
|---|---|
| Message-ID | <[email protected]> |
[2026-07-15 19:28] Frank Leonhardt <[email protected]> > On 25/06/2026 11:05, Philipp wrote: > > Hi > > > > Since I updated to 14.4 release my nat setup only works for icmp. I hav= e > > one public interface and two epair interfaces. The epairs (vnet42, > > vnet43) are connected to a bridge and on the bridge are a bunch of jail= s. > > > > I can connect to the service of the jails from the host itself. But the > > ports redirects don't work and the jails can't use tcp/udp to hosts on > > the internet. > > > > The public interface has the address 80.190.133.201 and the vnet interf= ace > > have the address 10.188.42.1/24 and 10.188.43.1/24. the vnet* epairs ar= e > > connected to a bridge. The jails are created by ezjail and the jib[0] t= ool > > is used to create epairs and attach to this bridge. I haven't had time = to > > look at ether_gen_addr so it's off. > > > > the ipfw.rules looks like this: > > > > #!/bin/sh > > # Flush out the list before we begin. > > ipfw -q -f flush > > > > pif=3D"em1" > > > > #public interface > > pif=3Dem1 > > > > ipfw nat 123 delete > > ipfw nat 123 config ip 80.190.133.201 redirect_port tcp 10.188.42.84:80= 80 redirect_port tcp 10.188.42.1:22 22 > > # redirect_port tcp 10.188.43.54:2222 2222 \ > > # redirect_port tcp 10.188.43.55:2223 2223 \ > > # redirect_port tcp 10.188.42.84:443 443 \ > > # redirect_port tcp 10.188.42.86:25 25 \ > > # redirect_port tcp 10.188.42.86:587 587 \ > > # redirect_port tcp 10.188.42.46:993 993 \ > > # redirect_port tcp 10.188.42.46:4190 4190 > > > > #${fwcmd} add 00120 nat 123 ip4 from any to any via $pif > > ipfw add 00120 nat 123 ip from 10.0.0.0/8 to any via $pif #out via $pif > > ipfw add 00121 nat 123 ip from any to 80.190.133.201 via $pif #in via $= pif > > ipfw add 00122 check-state > > # ICMP > > ipfw add 00130 allow icmp from any to any > > ipfw add 00131 allow icmp6 from any to any > > > > ipfw add 00132 allow ip from 10.0.0.0/8 to any keep-state > > > > #ipfw add 00140 skipto 200 ipv6 from 2a01:138:9000:bc00::/56 to any out= via $pif > > #ipfw add 00141 skipto 200 ipv6 from me6 to any out via $pif > > #ipfw add 00142 skipto 200 ipv6 from any to 2a01:138:9000:bc00::/56 in = via $pif > > #ipfw add 00143 skipto 200 ipv6 from any to me6 in via $pif > > #ipfw add 00144 skipto 200 ipv4 from any to me in via $pif > > #ipfw add 00145 skipto 200 ipv4 from me to any out via $pif > > #ipfw add 00150 drop ipv6 from any to any via $pif > > #ipfw add 00151 drop all from any to any frag in via $pif > > #ipfw add 00152 drop ipv4 from any to any via $pif > > > > ipfw add 00210 allow tcp from any to any 22 via $pif # keep-state > > ipfw add 00211 allow tcp from any to any 25 in via $pif # keep-state > > ipfw add 00212 allow tcp from any to any 587 in via $pif # keep-state > > ipfw add 00213 allow tcp from any to any 993 in via $pif #keep-state > > ipfw add 00214 allow tcp from any to any 2222 in via $pif # keep-state > > ipfw add 00215 allow tcp from any to any 4190 in via $pif # keep-state > > ipfw add 00216 allow tcp from any to any 2223 in via $pif # keep-state > > ipfw add 00217 allow udp from any to any 60000-61000 in via $pif > > ipfw add 00218 allow tcp from any to any 80 in via $pif > > ipfw add 00219 allow tcp from any to any 443 in via $pif > > ipfw add 00220 allow all from any to any out via $pif keep-state > > #ipfw add 00221 allow all from any to any in via $pif keep-state > > #ipfw add 00230 allow tcp from any to 2a01:138:9000:bc00::/56 in via $p= if > > #ipfw add 00231 allow udp from any to 2a01:138:9000:bc00::/56 in via $p= if > > #ipfw add 00232 allow tcp from any to 80.190.133.201 in via $pif > > #ipfw add 00233 allow udp from any to 80.190.133.201 in via $pif > > > > # vnet42 > > ipfw add 41999 allow all from 10.188.42.0/24 to any in via vnet42 keep-= state > > ipfw add 42000 allow all from 2a01:138:9000:bc42::/64 to any in via vne= t42 keep-state > > #ipfw add 42001 allow tcp from 10.188.42.0/24 to any in via vnet42 keep= -state > > #ipfw add 42002 allow udp from 10.188.42.0/24 to any in via vnet42 keep= -state > > ipfw add 42003 allow all from any to any 80 via vnet42 keep-state > > ipfw add 42004 allow tcp from any to 2a01:138:9000:bc42::2e 993 out via= vnet42 keep-state > > #ipfw add 42005 allow tcp from any to 10.188.42.46 993 out via vnet42 k= eep-state > > ipfw add 42006 allow tcp from any to 2a01:138:9000:bc42::15e4:2d4d 587 = out via vnet42 keep-state > > ipfw add 42007 allow tcp from any to 2a01:138:9000:bc42::15e4:2d4d 25 o= ut via vnet42 keep-state > > #ipfw add 42009 allow tcp from any to 10.188.42.86 25 out via vnet42 ke= ep-state > > #ipfw add 42010 allow tcp from any to 10.188.42.86 587 out via vnet42 k= eep-state > > ipfw add 42011 allow tcp from any to 2a01:138:9000:bc42::2e 4190 out vi= a vnet42 keep-state > > #ipfw add 42012 allow tcp from any to 10.188.42.46 4190 out via vnet42 = keep-state > > ipfw add 42013 allow all from any to 2a01:138:9000:bc42::53 53 out via = vnet42 keep-state > > ipfw add 42014 allow tcp from any to 2a01:138:9000:bc42::54 443 out via= vnet42 keep-state > > > > # vnet43 > > #ipfw add 42999 allow all from 10.188.43.0/24 to any in via vnet43 keep= -state > > ipfw add 43000 allow all from 2a01:138:9000:bc43::/64 to any in via vne= t43 keep-state > > ipfw add 43002 allow all from 10.188.43.0/24 to any in via vnet43 keep-= state > > ipfw add 43003 allow udp from any to 10.188.43.0/24 60000-61000 out via= vnet43 keep-state > > ipfw add 43004 allow udp from any to 2a01:138:9000:bc43::/64 60000-6100= 0 out via vnet43 keep-state > > ipfw add 43013 allow tcp from any to 10.188.43.0/24 22 out via vnet43 k= eep-state > > ipfw add 43014 allow tcp from any to 2a01:138:9000:bc43::/64 22 out via= vnet43 keep-state > > ipfw add 43023 allow tcp from any to 10.188.43.0/24 2223 out via vnet43= keep-state > > ipfw add 43024 allow tcp from any to 2a01:138:9000:bc43::/64 2223 out v= ia vnet43 keep-state > > # git ssh port > > ipfw add 43100 allow tcp from any to 2a01:138:9000:bc43::36 2222 out vi= a vnet43 keep-state > > ipfw add 43101 allow tcp from any to 10.188.43.54 2222 out via vnet43 k= eep-state > > > > # catch all > > ipfw add 64999 reject ip6 from any to any > > ipfw add 65000 allow tcp from any to any > > ipfw add 65001 allow udp from any to any > > > > This is a bit messi at the moment because I had done some changes and > > tests because of the nat problem. The strange thing is I have tested > > if I redirect the port 22 to the vnet interface of the host and this > > works. It just doesn't work for the jails. > > > > Any idea what is going wrong or what change I have missed? > > > > Philipp > > Thanks for the hints. I have now changed my nat to pf so I can't test right away but I try to switch back. > I believe this is a known problem with checksum offloading and NAT. > > Try: > > ifconfig epairXa -txcsum -rxcsum -tso -lro > ifconfig em1 -txcsum -rxcsum -tso -lro With this hint I found 503bf058cd0a which adds checksum offloading to epair(4). So I would guess disabling txcsum and rxcsum fixes the issue. This also explaines why it worked on 14.3. Sadly this is not good documented. I only know about one part in the handbook to set net.inet.tcp.tso=3D"0"[0]. > Problems with ipfw and NAT (which required a special kernel module, = > which I believe is included now) was one of the things that prompted me = > to switch to pf, where everything is wonderful. I still can't get my head around the last match style of pf, thats why I prefere ipfw (even with the ungly rule numbers). Philipp [0] https://docs.freebsd.org/en/books/handbook/firewalls/#in-kernel-nat