* NATing on a single interface?
@ 2006-10-26 9:08 Philip Pemberton
2006-10-26 15:45 ` Robert Nichols
0 siblings, 1 reply; 8+ messages in thread
From: Philip Pemberton @ 2006-10-26 9:08 UTC (permalink / raw)
To: netfilter
Hi,
I've got an ADSL router with a built-in firewall. It's a nice little box,
the ADSL front-end is solid (and ADSL2+ compatible, which is nice). Only
problem is, it has a maximum of 16 firewall port-forward rules and no support
for time-based firewalling. What I'd like to do is make the router forward
packets onto my firewall box, then have iptables deal with NATing and stuff
like that.
At the moment, the network looks like this:
ADSL ---SpeedtouchUSB@ppp0---> FIREWALL ---eth0---> Other machines
What I want is something more like:
10.1.0.2 10.1.0.1 10.0.0.1 10.0.0.0/16
ADSL Router ----------> Firewall ------(nat)-----> LAN
ADSL Router: 10.1.0.2/16
Firewall: 10.0.0.1/16 and 10.1.0.1/16
LAN: 10.0.0.0/16
Ordinarily I'd fit another NIC into the firewall, then use Arno's IPtables
script to do the NATing from eth0 (external) to eth1 (internal). Problem is,
the firewall server can't take another NIC - it's only got one onboard and no
facility to add another (the server is a Linksys NSLU2 - an embedded server in
other words) unless I add a USB adapter, which would be a bit less than ideal
for LAN routing (I hear the USB adapters are quite slow and prone to packet loss).
So what I'd like to do is have the DSL router forwarding to the firewall
server, then have the firewall server do NATing and firewalling for the entire
LAN subnet, all on a single interface. Is this doable, or do I really need to
add another Ethernet interface?
I've read a few IPtables HOWTOs and I just don't understand how it's all
supposed to work (which is why I used the Arno script in the first place)...
Thanks.
--
Phil. | (\_/) This is Bunny. Copy and paste Bunny
usenet06@philpem.me.uk | (='.'=) into your signature to help him gain
http://www.philpem.me.uk/ | (")_(") world domination.
If mail bounces, replace "06" with the last two digits of the current year.
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: NATing on a single interface? 2006-10-26 9:08 NATing on a single interface? Philip Pemberton @ 2006-10-26 15:45 ` Robert Nichols 2006-10-26 20:44 ` Philip Pemberton 0 siblings, 1 reply; 8+ messages in thread From: Robert Nichols @ 2006-10-26 15:45 UTC (permalink / raw) To: netfilter Philip Pemberton wrote: > So what I'd like to do is have the DSL router forwarding to the > firewall server, then have the firewall server do NATing and firewalling > for the entire LAN subnet, all on a single interface. Is this doable, or > do I really need to add another Ethernet interface? There's no reason a forwarded packet can't go back out the same interface on which it arrived. There's an obvious compromise in security when you have both sides of the firewall on the same physical network, but if you trust your own machines and just want to protect against external attacks you should be OK as long as the DSL router forwards packets to the firewall machine only. -- Bob Nichols Yes, "NOSPAM" is really part of my email address. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: NATing on a single interface? 2006-10-26 15:45 ` Robert Nichols @ 2006-10-26 20:44 ` Philip Pemberton 2006-10-26 23:52 ` Robert Nichols 0 siblings, 1 reply; 8+ messages in thread From: Philip Pemberton @ 2006-10-26 20:44 UTC (permalink / raw) To: netfilter Robert Nichols wrote: > There's no reason a forwarded packet can't go back out the same > interface on which it arrived. There's an obvious compromise in > security when you have both sides of the firewall on the same I do trust my own machines, basically because they're mine - I'm very obsessive about keeping the OS and virus scanners up to date. > physical network, but if you trust your own machines and just > want to protect against external attacks you should be OK as > long as the DSL router forwards packets to the firewall machine > only. It appears to be mangling the packets - e.g. an inbound packet from 12.34.56.78 to 98.76.54.32 (PPP_IP) gets its destination IP changed to the DMZ address (e.g. 10.0.0.1 for my server). Return packets are sent to the source (e.g. 12.34.56.78 in the example) using the DSL router (10.1.0.2) as the gateway. What I need to figure out is how to actually set up the firewall. I did find a nice IPTables tutorial, but it's 357 pages long! Guess I'd better stop procrastinating and start reading.... Thanks. -- Phil. | (\_/) This is Bunny. Copy and paste Bunny usenet06@philpem.me.uk | (='.'=) into your signature to help him gain http://www.philpem.me.uk/ | (")_(") world domination. If mail bounces, replace "06" with the last two digits of the current year. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: NATing on a single interface? 2006-10-26 20:44 ` Philip Pemberton @ 2006-10-26 23:52 ` Robert Nichols 2006-10-27 9:09 ` Philip Pemberton 0 siblings, 1 reply; 8+ messages in thread From: Robert Nichols @ 2006-10-26 23:52 UTC (permalink / raw) To: netfilter Philip Pemberton wrote: > It appears to be mangling the packets - e.g. an inbound packet from > 12.34.56.78 to 98.76.54.32 (PPP_IP) gets its destination IP changed to > the DMZ address (e.g. 10.0.0.1 for my server). Return packets are sent > to the source (e.g. 12.34.56.78 in the example) using the DSL router > (10.1.0.2) as the gateway. > > What I need to figure out is how to actually set up the firewall. I > > did find a nice IPTables tutorial, but it's 357 pages long! Guess I'd > better stop procrastinating and start reading.... If your other machines are set up to use the DSL router as the default route, of course that's where the return packets will go. You have two choices: 1. (Preferable) Set up the default route on your other machines so that they use the firewall machine as their gateway to the outside world. 2. SNAT the forwarded packets so that they appear to come from the firewall machine. This really screws up logging on your other machines (all traffic will appear to originate on the firewall machine), so you probably don't want to do it that way. If that's Oskar Andreasson's tutorial you've got, you'll find you really don't need to read through the whole thing. The section on the DNAT target is what you need right now. -- Bob Nichols Yes, "NOSPAM" is really part of my email address. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: NATing on a single interface? 2006-10-26 23:52 ` Robert Nichols @ 2006-10-27 9:09 ` Philip Pemberton 2006-10-27 14:40 ` Robert Nichols 0 siblings, 1 reply; 8+ messages in thread From: Philip Pemberton @ 2006-10-27 9:09 UTC (permalink / raw) To: netfilter Robert Nichols wrote: > If your other machines are set up to use the DSL router as the default > route, of course that's where the return packets will go. You have > two choices: > > 1. (Preferable) Set up the default route on your other machines so > that they use the firewall machine as their gateway to the outside > world. Which is what's happening now. DNSMasq (lightweight DHCP/DNS server) allocates IP addresses based on /etc/ethers and /etc/hosts, and tells those machines to use 10.0.0.1 as the gateway. 10.0.0.1 (the firewall server) forwards those onto their eventual destination, and handles masquerading in the opposite direction, so that one or more LAN-based machines can access the Internet using only one public IP address. > 2. SNAT the forwarded packets so that they appear to come from the > firewall machine. This really screws up logging on your other > machines (all traffic will appear to originate on the firewall > machine), so you probably don't want to do it that way. Based on > If that's Oskar Andreasson's tutorial you've got, you'll find you Yep. > really don't need to read through the whole thing. The section on > the DNAT target is what you need right now. Well, I've read the chapter on TCP/IP, now I'm just skimming through the stuff on DNAT and Masquerading. Problem with DNAT is that it seems to be more of a port-forwarding system rather than allowing more than one machine to access the Internet from one public IP. I think I'll spend tonight playing around with firewall rules and routing tables. No doubt I'll take some flak from the rest of the family in the process ("why can't you just use the old modem?" and stuff like that) I was going to use "Arno's IPTables Firewall" to do this, but it doesn't seem to support single-NIC NAT routing. Guess I'll have to write my own firewall script.. in at the deep end, as always :) Thanks. -- Phil. | (\_/) This is Bunny. Copy and paste Bunny usenet06@philpem.me.uk | (='.'=) into your signature to help him gain http://www.philpem.me.uk/ | (")_(") world domination. If mail bounces, replace "06" with the last two digits of the current year. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: NATing on a single interface? 2006-10-27 9:09 ` Philip Pemberton @ 2006-10-27 14:40 ` Robert Nichols 2006-10-27 19:33 ` Port forwarding fun (was NATing on a single interface?) Philip Pemberton 0 siblings, 1 reply; 8+ messages in thread From: Robert Nichols @ 2006-10-27 14:40 UTC (permalink / raw) To: netfilter Philip Pemberton wrote: > Well, I've read the chapter on TCP/IP, now I'm just skimming through the > stuff on DNAT and Masquerading. Problem with DNAT is that it seems to be > more of a port-forwarding system rather than allowing more than one > machine to access the Internet from one public IP. Well, you started out saying that your router's limitation of "a maximum of 16 firewall port-forward rules" was a problem, so I jumped to the conclusion that you were trying to do port forwarding. -- Bob Nichols Yes, "NOSPAM" is really part of my email address. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Port forwarding fun (was NATing on a single interface?) 2006-10-27 14:40 ` Robert Nichols @ 2006-10-27 19:33 ` Philip Pemberton 2006-10-27 20:26 ` Philip Pemberton 0 siblings, 1 reply; 8+ messages in thread From: Philip Pemberton @ 2006-10-27 19:33 UTC (permalink / raw) To: netfilter Robert Nichols wrote: > Well, you started out saying that your router's limitation of "a > maximum of 16 firewall port-forward rules" was a problem, so I > jumped to the conclusion that you were trying to do port forwarding. What I've done is set my router's DMZ option to "10.1.0.1". In other words, everything my router receives is forwarded on to 10.1.0.1 -- the firewall box. The firewall box is doing a pretty good job of handling the IP masquerading, but I'm having trouble getting port-forwarding to work. What I want to do is forward port 99 inbound to port 80 on 10.0.0.8. I've added a rule to do this (search for 'DNAT') but although it seems to accept the connection, I get a Receive Timeout error on the client machine, and the GRC ShieldsUp port scanner reports the port as 'stealthed' (i.e. machine is silently dropping packets). The weird thing is, the target machine isn't even receiving the SYN, and I can't figure out why. If I change the DNAT rule to forward to 10.0.0.1:80 (the firewall box's HTTP server), the rule works fine. If I change the IP to 10.0.0.8, it doesn't. I'm not seeing anything in syslog from my LOG rules either... Here's my firewall script: --8<-- cut here --8<-- #!/bin/sh ############################################################################## # Simple single-NIC IPTables firewall script # Philip Pemberton -- http://www.philpem.me.uk/ # Rev: 2006-10-27 20:13 BST # # Based on Arno's IPtables Firewall Script (<http://rocky.leidenuniv.nl>) # and Brandon Hutchinson's Multi-Homed IPTables Firewall # (<http://www.brandonhutchinson.com/multi_homed_iptables_firewall.html>) ############################################################################## # TODO list: # - Get port forwarding working # - Allow pf to be configured eg. "1020>10.0.0.18" fwds port 1020 to # 10.0.0.18; "1234>10.0.0.92:80" fwds port 1234 to port 80 on 10.0.0.92 # - Coloured stdout log messages - headings white, "firewall up" green, etc. # - Easier configuration! # - Better documentation! # Path to IPTables IPT=/sbin/iptables # TCP/UDP ports to open OPEN_TCP="http https ssh" OPEN_UDP="" ############################################################################## echo "=======================================================================" echo "= IPTables firewall starting" echo "=======================================================================" echo "Attempting to flush all rules in the filter table" $IPT --flush $IPT -t nat --flush $IPT -t mangle --flush # Accept packets from local loopback echo "Accepting packets from local loopback" $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # Set default policy to DROP echo "Setting default policy to DROP" $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP $IPT -t nat -P PREROUTING ACCEPT 2>/dev/null $IPT -t nat -P OUTPUT ACCEPT 2>/dev/null $IPT -t nat -P POSTROUTING ACCEPT 2>/dev/null $IPT -t mangle -P OUTPUT ACCEPT 2>/dev/null $IPT -t mangle -P PREROUTING ACCEPT 2>/dev/null # Enable some IPv4 tweaks echo "Enabling some IPv4 security tweaks:" echo " Activating IP forwarding" echo 1 > /proc/sys/net/ipv4/ip_forward echo " Enabling broadcast echo protection" echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo " Disabling source-routed packets" for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $f done echo " Enabling TCP SYN cookie protection" echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo " Disabling ICMP Redirect acceptance" for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > $f done echo " Disabling sending of ICMP Redirect messages" for f in /proc/sys/net/ipv4/conf/*/send_redirects; do echo 0 > $f done echo " Enabling RP_Filter anti-spoof protection" # Drop spoofed packets coming in on an interface, which if replied to, # would result in the reply going out a different interface. for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f done echo " Logging packets with impossible addresses (martians)" for f in /proc/sys/net/ipv4/conf/*/log_martians; do echo 1 > $f done echo "Dropping packets with invalid TCP state combinations" # First list of TCP state flags lists the bits to be tested # Second list of TCP state flags lists the bits that must be set to match test ##### # All of the bits are cleared $IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # SYN and FIN are both set $IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # SYN and RST are both set $IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP # FIN and RST are both set $IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP # FIN is set without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP # PSH is set without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP # URG is set without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP # Allow forwarding and masquerading on local net echo "Allowing forwarding and masquerading on local net" $IPT -t nat -A POSTROUTING -s 10.0.0.0/16 -d ! 10.0.0.0/16 -j MASQUERADE $IPT -A FORWARD -i eth0 -o eth0 -s 10.0.0.0/16 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -i eth0 -o eth0 -d 10.0.0.0/16 -m state --state ESTABLISHED,RELATED -j ACCEPT # Also accept broadcast traffic for the global broadcast address (for DHCP) echo "Accepting packets from the global broadcast address" $IPT -A INPUT -i eth0 -d 255.255.255.255 -j ACCEPT # Accept packets from the local LAN subnet echo "Accepting packets from the local LAN subnet" $IPT -A INPUT -i eth0 -s 10.0.0.0/16 -j ACCEPT $IPT -A OUTPUT -o eth0 -d 10.0.0.0/16 -j ACCEPT # TODO: use these instead? would these be better? need to rtfm... #$IPT -A INPUT -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT #$IPT -A OUTPUT -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Allow packets to go out to the gateway echo "Allowing outbound packets to gateway" $IPT -A INPUT -i eth0 -d 10.1.0.0/16 -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -o eth0 -s 10.1.0.0/16 -j ACCEPT $IPT -A OUTPUT -o eth0 -s 10.0.0.0/16 -j ACCEPT # Open some TCP ports echo -n "Opening TCP ports: " for i in $OPEN_TCP; do echo -n "$i " $IPT -A INPUT -i eth0 -p tcp --dport $i -j ACCEPT done echo "[done]" # Open some UDP ports echo -n "Opening UDP ports: " for i in $OPEN_UDP; do echo -n "$i " $IPT -A INPUT -i eth0 -p udp --dport $i -j ACCEPT done echo "[done]" # Forward some ports echo "Forwarding port 99 to 10.0.0.8:80" $IPT -t nat -A PREROUTING -p tcp -m tcp --dport 99 -j DNAT --to-destination 10.0.0.8:80 ############################################################################## # BIG FAT WARNING: # All IPTables rules MUST be added BEFORE the two logging rules, otherwise # you'll get "packet dropped" entries in syslog. Oh, and the packets will # get dropped too. ############################################################################## # LOG rules stolen from Arno's IPTables Firewall Script, which can be # downloaded from http://rocky.leidenuniv.nl/ echo "Logging dropped packets" $IPT -A INPUT -m limit --limit 1/sec -j LOG --log-prefix "Dropped INPUT packet: " --log-level 7 $IPT -A OUTPUT -m limit --limit 1/sec -j LOG --log-prefix "Dropped OUTPUT packet: " --log-level 7 # Let the user know the firewall is running echo "=== Firewall is up and running ===" # end of firewall-script --8<-- cut here --8<-- Can anyone see anything obviously wrong with this? Thanks. -- Phil. | (\_/) This is Bunny. Copy and paste Bunny usenet06@philpem.me.uk | (='.'=) into your signature to help him gain http://www.philpem.me.uk/ | (")_(") world domination. If mail bounces, replace "06" with the last two digits of the current year. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Port forwarding fun (was NATing on a single interface?) 2006-10-27 19:33 ` Port forwarding fun (was NATing on a single interface?) Philip Pemberton @ 2006-10-27 20:26 ` Philip Pemberton 0 siblings, 0 replies; 8+ messages in thread From: Philip Pemberton @ 2006-10-27 20:26 UTC (permalink / raw) To: netfilter > # Forward some ports > echo "Forwarding port 99 to 10.0.0.8:80" > $IPT -t nat -A PREROUTING -p tcp -m tcp --dport 99 -j DNAT > --to-destination 10.0.0.8:80 Oh $CURSE. Forgot the FORWARD rule: $IPT -A FORWARD -p tcp -d 10.0.0.8 --dport 80 -j ACCEPT Now it works, and I'm a happy bunny once more. I would appreciate some constructive criticism relating to my iptables script though - possible security/style improvements, etc. Spotted that on <http://www.hackorama.com/network/portfwd.shtml>. Found on the second page of results from a Google search for 'iptables DNAT port-forward'. Thanks. -- Phil. | (\_/) This is Bunny. Copy and paste Bunny usenet06@philpem.me.uk | (='.'=) into your signature to help him gain http://www.philpem.me.uk/ | (")_(") world domination. If mail bounces, replace "06" with the last two digits of the current year. ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2006-10-27 20:26 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-10-26 9:08 NATing on a single interface? Philip Pemberton 2006-10-26 15:45 ` Robert Nichols 2006-10-26 20:44 ` Philip Pemberton 2006-10-26 23:52 ` Robert Nichols 2006-10-27 9:09 ` Philip Pemberton 2006-10-27 14:40 ` Robert Nichols 2006-10-27 19:33 ` Port forwarding fun (was NATing on a single interface?) Philip Pemberton 2006-10-27 20:26 ` Philip Pemberton
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.