Setting up IP Masquerade on Linux (ipfwadm || ipchains)

Copyright (c) 1998,1999,2000 Kay.
Всички права запазени. Този документ може свободно да се разпространява според условията на Open Content License.

    За IP Router ще ви е необходим Linux-box (стар 386 върши идеална работа) с kernel 2.x, който е компилиран със следните възможности:
CONFIG_NET=y
CONFIG_FIREWALL=y
CONFIG_IP_FIREWALL=y
CONFIG_IP_ALWAYS_DEFRAG=y
CONFIG_IP_TRANSPARENT_PROXY=y
CONFIG_IP_MASQUERADE=y
CONFIG_IP_MASQUERADE_ICMP=y
    Забележка : Това се отнася до 2.2.x и 2.3.x kernel-и. За по-старите може да има несъществени разлики.
    Ще трябва също така да настроите протоколите за интерфейсите, които ще ползвате - поддръжка на PPP, SLIP или какъвто друг dial-up протокол използвате, PLIP, ако ще правите мрежа по паралелен кабел под Linux, LAN-card поддръжка.     Трябва да присвоите на станциите зад router-а отделни IP адреси, най-добре в "Class C Private Network Range", т.е. от 192.168.0.0 до 192.168.255.255. IP адреса се задава в /etc/hosts под Linux и в "Control Panel->Network->TCP/IP Protocol" под Windows 9x.
    Прекомпилирайте kernel-а и модулите, след което изпробвайте дали мрежата работи на локално ниво - има ли връзка между станциите - с нещо от сорта:
router:~# ping 192.168.0.10
PING 192.168.0.10 (192.168.0.10): 56 data bytes
64 bytes from 192.168.0.10: icmp_seq=0 ttl=64 time=0.8 ms
...
    На Windows-станциите също е необходимо да зададете IP-то на router-а като Gateway (пак в "TCP/IP Protocol Settings") сложете му примерно 192.168.0.1 (не използвайте .0 и .255 - това са адреси я по-специално предназначение, които ще доведат до грешки при работата). Така настроените "private" IP адреси ще бъдат вътрешната страна на мрежата. Тези адреси реално ще се използват само от локалната мрежа, за вътрешна адресация. IP пакетите минаващи през Linux-машината с връзка към I'net ще бъдат с "маскирано" IP - това на същата машина, но в Internet. Трябва да направите разлика - единият адрес е адреса в "маскраната" мрежа, другаият адрес е адреса във външната мрежа, т.е. на I'net  интерфейса - най-вероятно PPP връзка. За да направите справка на кой интерфейс какво IP отговаря (под Linux) напишете:
router:~# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Bcast:127.255.255.255  Mask:255.0.0.0
          UP BROADCAST LOOPBACK RUNNING  MTU:3584  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 coll:0

ppp0      Link encap:Point-Point Protocol
          inet addr:195.132.53.185  P-t-P:195.132.53.100 Mask:255.255.255.0
          UP POINTOPOINT RUNNING  MTU:552  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0
          TX packets:0 errors:0 dropped:0 overruns:0

eth0      Link encap:10Mbps Ethernet  HWaddr FC:FC:C8:00:00:01
          inet addr:192.168.0.1  P-t-P:192.168.0.10  Mask:255.255.255.0
          UP POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0
          TX packets:0 errors:0 dropped:0 overruns:0
          Interrupt:7 Base address:0x378

    Това са примерни IP адреси, естествено. Тук връзката е демонстрирана с Ethernet-интерфейс "eth0", в който машината "router" има IP адрес 192.168.0.1, а другата (Point-to-Point) - 192.168.0.2. При PPP-интерфейса машината "router" има адрес 195.138.53.185. 195.138.52.100 е адресът на отсрещната страна, т.е. dial-up server-а.
    Routing-таблицата показва на къде ще се изпращат IP пакетите, отговарящи на съответните маски. "default route" трябва да бъде интерфейса към I'net. Пътищата се задват с "route". За PLIP-интерфейс трябва да добавите път към станцията от "router"-а, а пътят от станцията към "router"-а трябва да е "default", като неин единствен интерфейс към МРЕЖАТА. Примери:
router:~# route add 192.168.0.2 eth0router:~# route add default gw 195.132.53.100
    Забележка : Последното би трябвало вече да е добавено, ако сте пуснали pppd с опция "defaultroute". Това е полезно, защото не винаги знаете какъв IP адрес ще ви бъде присвоен от dial-up-a.
station1:~# route add 192.168.0.1
station1:~# route add default gw 192.168.0.1
    Друга забележка : Можете да избегнете IP адресите, като използвате имената на съответните машини, както са зададени в /etc/hosts.
    За станциите работещи под Windows, както вече споменах, просто сложете за Gateway 192.168.0.1.
    За тези с ядро 2.2.x: Ако дистрибуцията ви по подразбиране забранява "route"-ирането на IPv4 (обикновенна инсталация на RedHat например) трябва да направите следното:
echo 1 > /proc/sys/net/ipv4/ip_forward
    Сега трябва да накараме рутера да: (1) пренасочва IP пакетите, които пристигат от "вътрешните" интерфейси (Ethernet, PLIP, SLIP, дори PPP) към неговия "default route", който е навън към Мрежата, и обратно - да връща пакетите навътре от Мрежата към останалите локални машини. (2) (и основно :)) слага собствения си IP адрес като източник на изпратените пакети и да връща отговорите, на съответните "скрити" станции.
    Ако правилно е компилиран kernel-а и са настоени routing-таблиците, точка (1) вече е изпълнена. Неприятното обаче е, че само за точка (1) са ви необходими още N на брой валидни IP адреса обособени за всяка от N-те станции, които искате да свържете към Internet. И, като всички хубави неща, тук идва "IP Masquerading", и това не е идеално - например външни IP-та в общия случай не могат да направят връзка към IP на "скрит" компютър (това е Firewall в края на краищата), което е даста полезно, ако ще пускате в Мрежата тъпи секретарки ...
    За второто трябва да се настрои "IP Firewall"-а. Под Linux това става с програмата ipfwadm за ядра 2.0.x и 2.1.0-2.1.103 (включително) или с ipchains за 2.1 ядра след 2.1.104 (включително), 2.2.x и 2.3.x. Дадени са примери и за двете програми.
    Първо трябва да подсигурим рутера де не се използва от други хостове. Това се прави, като се задава "default policy" за "IP Forwarding" на "deny", иначе някой би могъл да се скрие зад нашето Internet IP и ...

    За ipfwadm:

router:~# /sbin/ipfwadm -F -p deny
    За ipchains:
router:~# /sbin/ipchains -P forward DENY
    След това се задава правило за "Forwarding" (Ако го оставите така, всички пакетите ще бъдат "denied" - забранени :)) само от определени IP адреси. Примерно 192.168.0.*.

    За ipfwadm:

router:~# /sbin/ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0 -W eth0
    За ipchains:
router:~# /sbin/ipchains -I forward -s 192.168.0.0/24 -i eth0 -j MASQ
    Тъй като не използваме конкретно IP, а сме обхванали цяла подмрежа, опцията "-W" е необходима, за да сме сигурни, че пакетът идва точно от локалната мрежа, а не някъде отвън. Но в този случай, когато имаме само 2 PC-та, може би по-добрият вариант е да се зададе само един IP за източник:

    За ipfwadm:

router:~# /sbin/ipfwadm -F -a m -S 192.168.0.10 -D 0.0.0.0/0 -W eth0
    За ipchains:
router:~# /sbin/ipchains -I forward -s 192.168.0.10 -i eth0 -j MASQ
    Обърнете внимание, че, въпреки че адресът е само един, пак задаваме име на интерфейс. Това е необходимо, за да нямате проблеми при "IP Spoofing" атаки.

    За ipfwadm:

router:~# /sbin/ipfwadm -F -l
IP firewall forward rules, default policy: deny
type  prot source               destination          ports
acc/m all  192.168.0.10         0.0.0.0              n/a
    За ipchains:
router:~# /sbin/ipchains -L forward
Chain forward (policy DENY):
target     prot opt     source                destination           ports
MASQ       all  ------  192.168.0.10          anywhere              n/a
    Тук съществува едно единствено правило - само за IP 192.168.0.10.
    Вече не ви остава нищо друго, освен да изпробвате дали връзката е осъществена - пуснете "ping" до някой Internet хост, най-добре по IP адрес, защото може да нямате коректно зададен DNS server (/etc/resolv.conf за Linux и TCP/IP Protocol Settings за Windows 95) ... ENJOY!
    За повече информация:
linux/Documentation/networking/ip_masq/* - документацията на kernel-а;
ipfwadm(8), ipchains(8), ipfw(4), route(8), ifconfig(8) - Man-страниците на гореспоменатите програми.

Kay
back