9. Proxy Server

Preliminars


Treballem en un ordinador amb dos NICs (dues targes Ethernet) i volem que l'ordinador actuï com a "proxy server".
Al treballar amb dues targes alhora poden sorgir alguns problemes.

L'ordinador assignarà un nom del tipus eth0, eth1, eth2 a cadascun dels dispositius de xarxa, però assignarà el nom de forma més o menys arbitrària depenent de quin driver carregui primer. Anem a veure que podem fer per a controlar millor la situació.

Si fem

sudo ifconfig

tindrem tota la informació dels dispositius instal·lats, per exemple

eth0      Link encap:Ethernet  HWaddr 00:e0:53:03:21:b5 
          inet addr:192.168.1.19  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::2e0:53ff:fe03:21b5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12178 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8726 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:12417945 (11.8 MiB)  TX bytes:945501 (923.3 KiB)
          Interrupt:22 Memory:fdeff000-fdeff0ff

eth1      Link encap:Ethernet  HWaddr 00:13:d3:52:59:9c 
          inet addr:172.16.0.1  Bcast:172.16.0.255  Mask:255.255.255.0
          inet6 addr: fe80::213:d3ff:fe52:599c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5504 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8707 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:434174 (423.9 KiB)  TX bytes:8879583 (8.4 MiB)
          Interrupt:20 Base address:0x2000

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:16436  Metric:1
          RX packets:120 errors:0 dropped:0 overruns:0 frame:0
          TX packets:120 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:9676 (9.4 KiB)  TX bytes:9676 (9.4 KiB)


La HWaddr correspon a la MAC de cada dispositiu. A mi al començament el primer dispositiu m'apareixia com a eth2 i el segon com a eth0. Per a canviar els noms fem

sudo gedit /etc/udev/rules.d/70-persistent-net.rules

i ens sortirà algo com ara:

# PCI device 0x1904:0x2031 (sc92031)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:53:03:21:b5", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x10ec:0x8139 (8139too)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:13:d3:52:59:9c", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# USB device 0x:0x (cdc_ether)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0e:50:68:e1:af", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"

Poseu els dispositius amb el nom que vulgueu i l'ordre que vulgueu.
Fixeu-vos que els dispositius s'identifiquem amb la MAC.

Per a configurar els paràmetres de connexió de cadascun dels dispositius fem

sudo gedit /etc/network/interfaces

Si volem assignar adreces IP estàtiques simplement haurem de tenir algo com ara:

auto lo eth0 eth1

iface lo inet loopback

iface eth0 inet static
address 192.168.1.19
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1

iface eth1 inet static
address 192.168.2.1
netmask 255.255.255.0

En el meu cas, el dispositiu eth1 és el que estarà connectat a la LAN que estem a punt de crear.
Fixeu-vos que no s'ha de definir ni gateway ni dns.

Els ordinadors de la LAN tindran adreces de l'estil 192.168.2.x i hauran de de tenir els servidor DNS correspon al proveidor de ADSL, en el meu cas 192.168.1.1 (fixeu-vos que és l'adreça del router de la companyia que tingueu)

Per a que tots aquests canvis sorgeixin efecte anirà bé reiniciar els dispositius fent

sudo /etc/init.d/networking stop; sudo /etc/init.d/networking start

Un cop ho tenim tot ben configurat, podem passar al següent pas.



El Kernel i NAT  

El kernel és el que té la capacitat d'inspeccionar els paquets i modificar-ne les adreces (funció NAT).

Necessitem una manera de dir-li al kernel el que ha de fer. Amb Debian Squeeze farem servir el comandament IPTABLES.
Utilitzarem una serie de comandaments IPTABLES, i cadascun establira una regla que dictara que fer amb els paquets.
El conjunt de comandaments IPTABLES estableix el que s'anomena una "ruleset" or "chain".

El conjunt de comandaments necessaris, conjuntament amb uns quants comentaris es troba a continuació:


#!/bin/sh

# IPTABLES PROXY script for the Linux 2.4 kernel.
# This script is a derivitive of the script presented in
# the IP Masquerade HOWTO page at:
# www.tldp.org/HOWTO/IP-Masquerade-HOWTO/firewall-examples.html
# It was simplified to coincide with the configuration of
# the sample system presented in the Guides section of
# www.aboutdebian.com
#
# This script is presented as an example for testing ONLY
# and should not be used on a production proxy server.
#
# PLEASE SET THE USER VARIABLES
# IN SECTIONS A AND B OR C

echo -e "\n\nSETTING UP IPTABLES PROXY..."


# === SECTION A
# ----------- FOR EVERYONE

# SET THE INTERFACE DESIGNATION FOR THE NIC CONNECTED TO YOUR INTERNAL NETWORK
# The default value below is for "eth0". This value
# could also be "eth1" if you have TWO NICs in your system.
# You can use the ifconfig command to list the interfaces
# on your system. The internal interface will likely have
# have an address that is in one of the private IP address
# ranges.
# Note that this is an interface DESIGNATION - not
# the IP address of the interface.
# Enter the internal interface's designation for the
# INTIF variable:

INTIF="eth0"


# SET THE INTERFACE DESIGNATION FOR YOUR "EXTERNAL" (INTERNET) CONNECTION
# The default value below is "ppp0" which is appropriate
# for a MODEM connection.
# If you have two NICs in your system change this value
# to "eth0" or "eth1" (whichever is opposite of the value
# set for INTIF above). This would be the NIC connected
# to your cable or DSL modem (WITHOUT a cable/DSL router).
# Note that this is an interface DESIGNATION - not
# the IP address of the interface.
# Enter the external interface's designation for the
# EXTIF variable:

EXTIF="ppp0"


# ! ! ! ! ! Use ONLY Section B *OR* Section C depending on
# ! ! ! ! the type of Internet connection you have.


# === SECTION B
# ----------- FOR THOSE WITH STATIC PUBLIC IP ADDRESSES

# SET YOUR EXTERNAL IP ADDRESS
# If you specified a NIC (i.e. "eth0" or "eth1" for
# the external interface (EXTIF) variable above,
# AND if that external NIC is configured with a
# static, public IP address (assigned by your ISP),
# UNCOMMENT the following EXTIP line and enter the
# IP address for the EXTIP variable:

#EXTIP="your.static.IP.address"



# === SECTION C
# ---------- DIAL-UP MODEM, AND RESIDENTIAL CABLE-MODEM/DSL (Dynamic IP) USERS


# SET YOUR EXTERNAL INTERFACE FOR DYNAMIC IP ADDRESSING
# If you get your IP address dynamically from SLIP, PPP,
# BOOTP, or DHCP, UNCOMMENT the command below.
# (No values have to be entered.)
# Note that if you are uncommenting these lines then
# the EXTIP line in Section B must be commented out.

#EXTIP="`/sbin/ifconfig ppp0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"


# -------- No more variable setting beyond this point --------


echo "Loading required stateful/NAT kernel modules..."

/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc

echo " Enabling IP forwarding..."
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

echo " External interface: $EXTIF"
echo " External interface IP address is: $EXTIP"

echo " Loading proxy server rules..."

# Clearing any existing rules and setting default policy
iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F

# FWD: Allow all connections OUT and only existing and related ones IN
iptables -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT

# Enabling SNAT (MASQUERADE) functionality on $EXTIF
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

echo -e " Proxy server rule loading complete\n\n"


Per a configurar bé aquest script només cal llegir els comentaris is substituir la informació que es demana.
Aquest script el podem guardar amb el nom proxy.txt

Després fem:

sudo cp /home/ftp/pub/incoming/proxy.txt /etc/init.d/proxy.sh
sudo chmod 755 /etc/init.d/proxy.sh 


per a copiar el fitxer en la carpeta adequada i fer-lo executable per a root.

Per a que el procés es posi en marxa fem

sudo /etc/init.d/proxy.sh

i si tot està ben configurat, ja tindrem la mínima expressió d'un proxy server en marxa.



Si necessiteu resoldre algun dubte, poseu-vos en contacte a través d'aquest enllaç.