Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Oct 2006 23:42:31 +0100
From:      Chris <phatfish@gmail.com>
To:        freebsd-questions@freebsd.org
Subject:   Port redirection troubles with natd/ipwf
Message-ID:  <718eeb340610171542i2ffa99e5jbf3df8f8406a2093@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Hello,

I have set myself up a nice FreeBSD router, but im having trouble getting my
firewall and NAT configured. I have a basic setup at the moment that is
working well, using IPFW for a firewall and also running natd because i have
a few computers here on my LAN that want Internet access.

However i cannot seem to work out how to get port redirection through NAT
working correctly. Currently i have it setup (as i hope my configs bellow
show) that all incoming traffic from the web is blocked, unless it was
initiated by a host on the LAN; then the check-state and keep-state rules
allow the traffic through for that session.

My problem comes when i want to so say, "its ok for traffic to pass through
this port to a target on the LAN". As far as i can make out that is done
with the "redirect_port" setting in natd.conf -- my conf has ports 113 and
3002 redirected to 10.0.0.11. 113 for IDENT, and 3002 as a custom port for a
windows ftp server.

Take an IDENT request for example, i can see the traffic coming in on port
113, getting nat'd to the correct LAN ip, and even mIRC registering the
IDENT request. But it never gets back out. The same with FTP on 3002, if
someone attempts to connect they get a message in their client that the
request timed out, but i can see a login attempt in the server logs.

I have a feeling there is a simple answer to this, but im stuck. Any help is
appreciated. My config is bellow, i can provide logs of the behavior if a
fix is not obvious.

Thank you.

>> ifconfig
re0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        options=18<VLAN_MTU,VLAN_HWTAGGING>
        inet6 fe80::214:*** prefixlen 64 scopeid 0x1
        ether 00:14:bf:59:be:84
        media: Ethernet autoselect (none)
        status: no carrier
re1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        options=18<VLAN_MTU,VLAN_HWTAGGING>
        inet6 fe80::214:*** prefixlen 64 scopeid 0x2
        ether 00:14:bf:59:be:8b
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
re2: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        options=18<VLAN_MTU,VLAN_HWTAGGING>
        inet6 fe80::214:*** prefixlen 64 scopeid 0x3
        ether 00:14:bf:59:c1:26
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
vr0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::211:*** prefixlen 64 scopeid 0x4
        inet ***.***.***.*** netmask 0xfffffc00 broadcast 255.255.255.255
        ether 00:11:d8:a1:22:13
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5
        inet 127.0.0.1 netmask 0xff000000
bridge0: flags=8043<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
        inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
        ether ac:de:48:30:8d:de
        priority 32768 hellotime 2 fwddelay 15 maxage 20
        member: re2 flags=7<LEARNING,DISCOVER,STP>
                port 3 priority 128 path cost 55 forwarding
        member: re1 flags=7<LEARNING,DISCOVER,STP>
                port 2 priority 128 path cost 55 forwarding
        member: re0 flags=7<LEARNING,DISCOVER,STP>
                port 1 priority 128 path cost 55 disabled

>> cat /etc/natd.conf
dynamic yes
use_sockets yes
same_ports yes
unregistered_only

redirect_port tcp 10.0.0.11:113 113
redirect_port udp 10.0.0.11:113 113
redirect_port tcp 10.0.0.11:3002 3002
redirect_port udp 10.0.0.11:3002 3002

>> cat /etc/rc.firewall.test
(these rules were made mainly using the NAT stateful ruleset here
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-ipfw.html
)
#!/bin/sh

######
# Default variables
######
cmd="ipfw -q add"    # Rule prefix
wan="vr0"        # Inbound interface (Public WAN)
lan="bridge0"        # Outbound interfaces (Private LAN)
nat="skipto 600"    # "Skipto" location for outgoing packets that need NAT
ks="keep-state"        # Adds rule to dynamic rules table

######
# Ruleset
######

ipfw -q -f flush

###
# Allowed Loopback and LAN traffic
###

$cmd 00005 allow all from any to any via $lan
$cmd 00006 allow all from any to any via lo0

###
# NAT inbound traffic and check all traffic against rules in dynamic rules
table
###

$cmd 00010 divert natd ip from any to any in via $wan
$cmd 00011 check-state

###
# Rejected outbound traffic
###

###
# Allowed outbound traffic
###

# Allow all outbound traffic
$cmd 00205 $nat icmp from any to any out via $wan $ks
$cmd 00210 $nat tcp from any to any out via $wan setup $ks
$cmd 00211 $nat udp from any to any out via $wan $ks

###
# Rejected inbound traffic
###

# Late arriving packets
$cmd 00315 deny all from any to any frag in via $wan

# ACK packets that did not match the dynamic rule table
$cmd 00320 deny tcp from any to any established in via $wan

###
# Allowed inbound traffic
###

# ISP's DNS and DHCP
$cmd 00404 allow all from ***.***.4.100 to any 53 in via $wan $ks
$cmd 00405 allow all from ***.***.8.100 to any 53 in via $wan $ks
$cmd 00406 allow all from 10.247.20.1 to any 68 in via $wan $ks

# Test rules
$cmd 00410 allow log logamount 50 tcp from any to any 113 in via $wan $ks
$cmd 00411 allow log logamount 50 udp from any to any 113 in via $wan $ks

$cmd 00420 allow log logamount 50 tcp from any to any 3002 in via $wan $ks
$cmd 00421 allow log logamount 50 udp from any to any 3002 in via $wan $ks

###
# Log and deny unauthorized traffic
###

$cmd 00505 deny log all from any to any in via $wan
$cmd 00506 deny log all from any to any out via $wan

###
# This is skipto location for outbound stateful rules
###

$cmd 00600 divert natd ip from any to any out via $wan
$cmd 00601 allow ip from any to any

######
# EOF;
#####

>> ipfw -d show
00005 341874 226401838 allow ip from any to any via bridge0
00006      0         0 allow ip from any to any via lo0
00010 159810 102549336 divert 8668 ip from any to any in via vr0
00011      0         0 check-state
00205      8       480 skipto 600 icmp from any to any out via vr0
keep-state
00210 317839 222819674 skipto 600 tcp from any to any out via vr0 setup
keep-state
00211   9208   1513077 skipto 600 udp from any to any out via vr0 keep-state
00315      0         0 deny ip from any to any frag in via vr0
00320    937     72516 deny tcp from any to any established in via vr0
00404      0         0 allow ip from ***.***.4.100 to any dst-port 53 in via
vr0 keep-state
00405      0         0 allow ip from ***.***.8.100 to any dst-port 53 in via
vr0 keep-state
00406    116     38068 allow ip from 10.247.20.1 to any dst-port 68 in via
vr0 keep-state
00410      2       120 allow log logamount 50 tcp from any to any dst-port
113 in via vr0 keep-state
00411      0         0 allow log logamount 50 udp from any to any dst-port
113 in via vr0 keep-state
00420     17       776 allow log logamount 50 tcp from any to any dst-port
3002 in via vr0 keep-state
00421      0         0 allow log logamount 50 udp from any to any dst-port
3002 in via vr0 keep-state
00422      0         0 allow log logamount 50 ip from any to any dst-port
3002 in via vr0 keep-state
00505   4656    409960 deny log logamount 6 ip from any to any in via vr0
00506   1664     80112 deny log logamount 6 ip from any to any out via vr0
00600 172967 122305174 divert 8668 ip from any to any out via vr0
00601 328900 224576731 allow ip from any to any
65535     86     62670 deny ip from any to any
## Dynamic rules (158):
00210      6      1848 (294s) STATE tcp 10.0.0.11 1575 <-> ***.249.91.18 80
00210    582     39177 (292s) STATE tcp 10.0.0.11 1205 <-> ***.12.25.125
5190
00211     42      3215 (2s) STATE udp 10.0.0.11 1158 <-> ***.142.64.162
27014
00210    725     41173 (263s) STATE tcp 10.0.0.11 1206 <-> ***.46.110.86
1863



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?718eeb340610171542i2ffa99e5jbf3df8f8406a2093>