# LPI Linux Certification/Implementing A Proxy Server
## Detailed Objectives (208.3)

(LPIC-2 Version 4.5)
Weight: 2
Description: Candidates should be able to install and configure a proxy server, including access policies, authentication and resource usage.
Key Knowledge Areas:
* Squid 3.x configuration files, terms and utilities
* Access restriction methods
* Client user authentication methods
* Layout and content of ACL in the Squid configuration files
Terms and Utilities:
* squid.conf
* acl
* http_access

## Exercises

* Implementing a proxy server
We will be using the squid web proxy server version 2.4 and Linux kernel version 2.4 .
Proxying can be done in two ways : normal proxying and transparent proxying
* In normal proxying, the client specifies the hostname and port number of a proxy in his web browsing software. The browser then makes requests to the proxy, and the proxy forwards them to the origin servers.
* In transparent proxying, ...
Use transparent proxying if : You want to force clients on your network to use the proxy, whether they want to or not. You want clients to use a proxy, but don't want them to know they're being proxied. You want clients to be proxied, but don't want to go to all the work of updating the settings in hundreds or thousands of web browsers.
There are two types of transparent proxying :
* Squid on the gateway
* Squid on a separate box than the gateway

### Squid on the gateway box

Setting up squid for ordinary proxying is quite simple : after installing squid, edit the default configuration file squid.conf Find the following directives, uncomment them, and change them to the appropriate values:
* httpd_accel_host virtual
* httpd_accel_port 80
* httpd_accel_with_proxy on
* httpd_accel_uses_host_header on
Next, look at the cache_effective_user and cache_effective_group directives, and set them up with a dedicated user and group (i.e squid/squid)
Finally, look at the http_access directive. The default is usually ``http_access deny all. This will prevent anyone from accessing squid. For now, you can change this to ``http_access allow all, but once it is working, you will probably want to read the directions on ACLs (Access Control Lists), and setup the cache such that only people on your local network (or whatever) can access the cache.
ACLs in squid will enable you to restrict access to the proxy.
The general format for an ACL rule is : acl aclname acltype string1 ... ACL rules can then be used in the http_access directive
ACL types are :
* Src : acl aclname src ip-address/netmask
* Dst : acl aclname dst ip-address/netmask
* Time : acl aclname time [day-abbreviations: M,T,W,H,F,A,S] [h1:m1-h2:m2]
* Port : acl aclname port port-no
* Proto : acl aclname proto protocol
* Method : acl aclname method method-type
* Maxconn : acl aclname maxconn integer
Next, initialize the cache directories with squid -z (if this is a not a new installation of squid, you should skip this step). Next, launch squid via the /etc/init.d/squid script, and you should be able to set your web browser's proxy settings to the IP of the box and port 3128 (unless you changed the default port number) and access squid as a normal proxy. Implementing a proxy server Transparent proxying can be set up in two different ways : on the router or on another (remote) host Transparent proxying on the router will involve setting up squid in the « normal », and configuring the packet filtering subsystem to redirect clients' connections to squid
The kernel's networking options required are :
* Under 'General Setup'
    Networking support
    Sysctl support
* Under 'Networking Options'
    Network packet filtering
    TCP/IP networking
* Under 'Networking Options' -> IP: Netfilter Configuration
    Connection tracking
    IP tables support
    Full NAT
    REDIRECT target support
* Under 'File Systems'
    /proc filesystem support
You must say NO to Fast switching under Networking Options !
Once you have your new kernel up and running, make sure you have IP forwarding enabled. Next, to configure iptables to enable transparent proxying, all you have to do is :

### Transparent proxying to a remote box

Let's assume we have two boxes called squid-box and iptables-box, and that they are on the network local-network. First, on the machine that squid will be running on, squid-box, you do not need iptables or any special kernel options on this machine, just squid. You *will*, however, need the 'http_accel' options as described above. Now, on the machine that iptables will be running on, iptables-box, you will need to configure the kernel as described above, except that you don't need the REDIRECT target support. You will need 2 iptables rules : iptables -t nat -A PREROUTING -i eth0 -s ! squid-box -p tcp --dport 80 -j DNAT --to squid-box:3128 iptables -t nat -A POSTROUTING -o eth0 -s local-network -d squid-box -j SNAT --to iptables-box The first one sends the packets to squid-box from iptables-box. The second makes sure that the reply gets sent back through iptables-box, instead of directly to the client. This is very important, because otherwise squid will never receive the answer from the target web server (and thus, no caching can take place!)
Key terms, files and utilities :
* squid.conf
* Acl
* http_access
* Exercises