summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ipmasq/rules/A80pfw.rul41
-rw-r--r--ipmasq/rules/A80precompute_pfw.def56
-rw-r--r--ipmasq/rules/M70masq.def40
-rw-r--r--ipmasq/rules/M80pfw.def47
4 files changed, 184 insertions, 0 deletions
diff --git a/ipmasq/rules/A80pfw.rul b/ipmasq/rules/A80pfw.rul
new file mode 100644
index 0000000..de86102
--- /dev/null
+++ b/ipmasq/rules/A80pfw.rul
@@ -0,0 +1,41 @@
+# Define masqueraded hosts with an IP address or a range of addresses:
+#
+# portfw_ip_<hostname>="<ipaddr>[-<ipaddr>]"
+#
+# <hostname> must be lowercase
+# <ipaddr>-ranges works only with iptables/netfilter (2.4.x kernels)
+#
+
+#portfw_ip_foo="10.42.42.1"
+#portfw_ip_bar="10.42.42.2"
+
+# Define pools either forwarding port (ranges) to same port on
+# masqueraded host or redirecting a single port to another port:
+#
+# portfw_pool_<pool>="<protocol>[,<protocol>...] <port>[:<port>][,<port>...]] <hostname>"
+# portfw_pool_<pool>="<protocol>[,<protocol>...] <port> <hostname> [<dest port>]"
+#
+# <pool> can only contain lowercase a-z and underscore (_)
+# <protocol> is either tcp or udp (or possibly others)
+# <port> can be either numbers or service names
+# <port>-ranges is denoted with colon (:) and only works with iptables/netfilter (2.4.x kernels)
+# <hostname> must be lowercase.
+#
+
+#portfw_pool_ssh=" tcp ssh foo"
+#portfw_pool_dns=" tcp,udp domain foo"
+#portfw_pool_mail=" tcp smtp,pop3,imap foo"
+#portfw_pool_mailsec=" tcp ssmtp,pop3s,imaps foo"
+#portfw_pool_http=" tcp http,https foo"
+
+#portfw_pool_bar_ssh=" tcp 2222 bar 22"
+#portfw_pool_foobar=" tcp 88,8080:8089 bar "
+
+# Requests from inside to the external IP of a portforwarded host will fail.
+# Remap local requests so they look like coming from the firewall itself?
+# (This works only eith iptables/netfilter)
+# (Alternatively you need a local nameserver setup with the inside address)
+#
+############ This doesn't work yet...
+#PORTFW_REMAP_LOCAL="y"
+############ This doesn't work yet...
diff --git a/ipmasq/rules/A80precompute_pfw.def b/ipmasq/rules/A80precompute_pfw.def
new file mode 100644
index 0000000..491da60
--- /dev/null
+++ b/ipmasq/rules/A80precompute_pfw.def
@@ -0,0 +1,56 @@
+# You should not edit this file. Instead, create a file with the same
+# name as this one, but with a .rul extension instead of .def. The
+# .rul file will override this one.
+#
+# However, any changes you make to this file will be preserved.
+
+# Some reused regex'es
+re_protos='[a-z\,]\+'
+re_ports='[a-z0-9\,:]\+'
+re_port='[a-z0-9:]\+'
+re_host='[a-z0-9]\+'
+re_pool='[a-z0-9_]\+'
+re_cfg="[[:space:]]*\($re_protos\)[[:space:]]\+\($re_ports\)[[:space:]]\+\($re_host\)\([[:space:]]\+\($re_port\)\)\?[[:space:]]*"
+re_cfgline="portfw_pool_\($re_pool\)[[:space:]]*=[[:space:]]*'$re_cfg'"
+
+# Extract portforward hosts
+PFW=$(set | grep '^portfw_ip_' | sed "s/^portfw_ip_\($re_host\).*/\1/")
+
+# remove hosts with no pools attached
+if [ -n "$PFW" ]; then
+ for i in $PFW; do
+ poolhits=$(set | grep '^portfw_pool_' | sed "s/$re_cfgline/\4/" | grep "^$i$")
+ if [ -z "$poolhits" ]; then
+ PFW=$(echo $PFW | sed "s/\( *\|^\)$i\( *\|$\)/\1/")
+ fi
+ done
+fi
+
+# Extract ips and ports
+if [ -n "$PFW" ]; then
+ if [ "$SHOWRULES" = "yes" ]; then
+ echo "#: These ports are forwarded:"
+ fi
+ PFWPOOLS=""
+ for i in $PFW; do
+ eval "ip=\"\$portfw_ip_$i\""
+ pools=$(set | grep '^portfw_pool_' | sed "s/$re_cfgline/\1:\4/" | grep ":$i$" | sed "s/:$i$//")
+ for pool in $pools; do
+ PFWPOOLS="$PFWPOOLS $pool"
+ eval "config=\"\$portfw_pool_$pool\""
+ protos_bulk=$(echo $config | sed "s/$re_cfg/\1/")
+ protos=$(echo $protos_bulk | sed 's/,/ /g')
+ origports_bulk=$(echo $config | sed "s/$re_cfg/\2/")
+ origports=$(echo $origports_bulk | sed 's/,/ /g')
+ destport=$(echo $config | sed "s/$re_cfg/\5/")
+ [ "$origports" = "$destport" ] && destport=""
+ eval "PFWPROTO_$pool=\"\$protos\""
+ eval "PFWORIGPORTS_$pool=\"$origports\""
+ eval "PFWIP_$pool=\"$ip\""
+ eval "PFWPORT_$pool=\"$destport\""
+ if [ "$SHOWRULES" = "yes" ]; then
+ echo -e "#: $protos_bulk \t$origports_bulk \t->\t $ip $destport \t($pool->$i)"
+ fi
+ done
+ done
+fi
diff --git a/ipmasq/rules/M70masq.def b/ipmasq/rules/M70masq.def
new file mode 100644
index 0000000..8c75509
--- /dev/null
+++ b/ipmasq/rules/M70masq.def
@@ -0,0 +1,40 @@
+# You should not edit this file. Instead, create a file with the same
+# name as this one, but with a .rul extension instead of .def. The
+# .rul file will override this one.
+#
+# However, any changes you make to this file will be preserved.
+
+#: Masquerade packets from internal networks
+if [ -n "$INTERNAL" -a -n "$EXTERNAL" ]; then
+ for j in $EXTERNAL; do
+ for i in $INTERNAL; do
+ ipnm_cache $i
+ case $MASQMETHOD in
+ ipfwadm)
+ $IPFWADM -F -a masq -W ${j%%:*} -S $IPOFIF/$NMOFIF
+ ;;
+ ipchains)
+ if [ -n "$PEEROFIF" ]; then
+ $IPCHAINS --no-warnings -A forward -j MASQ -i ${j%%:*} -s $PEEROFIF/$NMOFIF
+ else
+ $IPCHAINS --no-warnings -A forward -j MASQ -i ${j%%:*} -s $IPOFIF/$NMOFIF
+ fi
+ ;;
+ netfilter)
+ i=$(echo $i | cut -d ":" -f 1)
+ j=$(echo $j | cut -d ":" -f 1)
+ if [ -n "$PEEROFIF" ]; then
+ $IPTABLES -t nat -A POSTROUTING -s $PEEROFIF/$NMOFIF -o ${j%%:*} -j MASQUERADE
+ $IPTABLES -A FORWARD -i $i -o ${j%%:*} -s $PEEROFIF/$NMOFIF -j ACCEPT
+ $IPTABLES -A FORWARD -o $i -i ${j%%:*} -d $PEEROFIF/$NMOFIF -j ACCEPT
+ else
+ $IPTABLES -t nat -A POSTROUTING -s $IPOFIF/$NMOFIF -o ${j%%:*} -j MASQUERADE
+ $IPTABLES -A FORWARD -i $i -o ${j%%:*} -s $IPOFIF/$NMOFIF -j ACCEPT
+ $IPTABLES -A FORWARD -o $i -i ${j%%:*} -d $IPOFIF/$NMOFIF -j ACCEPT
+ fi
+ ;;
+ esac
+ done
+ done
+fi
+
diff --git a/ipmasq/rules/M80pfw.def b/ipmasq/rules/M80pfw.def
new file mode 100644
index 0000000..38e212f
--- /dev/null
+++ b/ipmasq/rules/M80pfw.def
@@ -0,0 +1,47 @@
+# You should not edit this file. Instead, create a file with the same
+# name as this one, but with a .rul extension instead of .def. The
+# .rul file will override this one.
+#
+# However, any changes you make to this file will be preserved.
+
+#: Masquerade packets from internal networks
+if [ -n "$INTERNAL" -a -n "$EXTERNAL" -a -n "$PFW" ]; then
+ for pool in $PFWPOOLS; do
+ eval "PROTOS=\"\$PFWPROTO_$pool\""
+ eval "ORIGPORTS=\"\$PFWORIGPORTS_$pool\""
+ eval "PFWIP=\"\$PFWIP_$pool\""
+ eval "PFWPORT=\"\$PFWPORT_$pool\""
+ for PROTO in $PROTOS; do
+ for ORIGPORT in $ORIGPORTS; do
+ ORIGPORT_DASH=$(echo $ORIGPORT | sed 's/:/-/g')
+ for j in $EXTERNAL; do
+ ipnm_cache $j
+ EXTIP=$IPOFIF
+ case $MASQMETHOD in
+ ipfwadm)
+ ipmasqadm portfw -a -P $PROTO -L $EXTIP $ORIGPORT_DASH -R $PFWIP $PFWPORT
+ ;;
+ ipchains)
+ ipmasqadm portfw -a -P $PROTO -L $EXTIP $ORIGPORT_DASH -R $PFWIP $PFWPORT
+ ;;
+ netfilter)
+ $IPTABLES -A PREROUTING -t nat -p $PROTO -d $EXTIP --dport $ORIGPORT -j DNAT --to $PFWIP${PFWPORT:+:$PFWPORT}
+ ;;
+ esac
+ for i in $INTERNAL; do
+ ipnm_cache $i
+ case $MASQMETHOD in
+ netfilter)
+ $IPTABLES -A FORWARD -i $j -o $i -p $PROTO --dport $ORIGPORT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
+# TODO: This should be done only for the interface containing the portforward host
+# if [ "$PORTFW_REMAP_LOCAL" = "y" ]; then
+# $IPTABLES -A POSTROUTING -t nat -p $PROTO -d $PFWIP ${PFWPORT:+--dport $PFWPORT} -s $IPOFIF/$NMOFIF -j SNAT --to $IPOFIF
+# fi
+ ;;
+ esac
+ done
+ done
+ done
+ done
+ done
+fi