Avatar billede andreas Nybegynder
09. januar 2008 - 19:17 Der er 11 kommentarer og
1 løsning

Iptables nat med vpn

Maskine 1 (Firewall)
- 1 nic, eth0, internet, ip: 83.94.141.157
- 1 nic, vmnet1, nic til lan, ip: 172.16.0.2

Maskine 2 (VPN)
- 1 nic, ip static, sat til 172.16.1.5/255.255.0.0 med GW: 172.16.0.2


Maskine 1 og to kan kommunikere sammen.


Nu kunne jeg godt tænke mig et iptables script, som kan masq, nat osv mellem maskinerne.

Mit problem er, at når jeg forbinder med windows xp vpn klienten til vpn serveren, som jeg VED virker, på maskine to, hænger den når den kontrollere brugernavn og kodeord. Jeg har læst mig til, at det er GRE protokollen som den kan være galt med. Er der nogen som kan se fejl i mit script nedenfor, eventuelt forbedre det, eller lave et, som matcher mit setup ?

Mit nuværende script er som følgende:

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
set -ex

IPT=/sbin/iptables                        # PATH  Path to iptables
WANIFACE=eth1                              # WAN interface designation (to internet)
LANIFACE=eth2                              # LAN interface designation (to hub/switch)
VMIFACE=vmnet1                            # VMware interface designation (to vmware network)
LAN=172.16.0.0/16                          # IP RANGE/SUBNET of your LAN

# Find network settings and assign to variables
WANIP=`ifconfig ${WANIFACE} | grep inet | cut -d : -f 2 | cut -d \  -f 1`
WANMASK=`ifconfig ${WANIFACE} | grep Mask | cut -d : -f 4`
WANBCAST=`ifconfig ${WANIFACE} | grep inet | cut -d : -f 3 | cut -d \  -f 1`
LANIP=`ifconfig ${LANIFACE} | grep inet | cut -d : -f 2 | cut -d \  -f 1`
LANMASK=`ifconfig ${LANIFACE} | grep Mask | cut -d : -f 4`
LANBCAST=`ifconfig ${LANIFACE} | grep inet | cut -d : -f 3 | cut -d \  -f 1`
VMIP=`ifconfig ${VMIFACE} | grep inet | cut -d : -f 2 | cut -d \  -f 1`

firewall_down() {

        # Flush Built-in Rules
        ${IPT} -F INPUT
        ${IPT} -F OUTPUT
        ${IPT} -F FORWARD

        # Delete all user-defined chains
        ${IPT} -F
        ${IPT} -X

        # Flush Rules/Delete User Chains in Mangle Table, if any
        ${IPT} -t mangle -F
        ${IPT} -t nat -F
        ${IPT} -t mangle -X
        ${IPT} -t nat -X

        echo 1 > /proc/sys/net/ipv4/ip_forward
        echo 1 > /proc/sys/net/ipv4/ip_dynaddr

        # Set policies in the filter table
        ${IPT} -P INPUT ACCEPT
        ${IPT} -P OUTPUT ACCEPT
        ${IPT} -P FORWARD ACCEPT
}

firewall_up() {

        # Do not allow incoming!
        ${IPT} -P INPUT DROP

        # set log level to 1 so only panic messages are printed to the console(s)
        dmesg -n 1

        # Allow all output from lan, vmware and wan
        ${IPT} -A OUTPUT -o ${WANIFACE} -j ACCEPT
        ${IPT} -A OUTPUT -o ${LANIFACE} -j ACCEPT
        ${IPT} -A OUTPUT -o ${VMIFACE} -j ACCEPT

        # Masqurade LAN
        ${IPT} -t nat -A POSTROUTING -s ${LAN} -d ! ${LAN} -o ${WANIFACE} -j MASQUERADE
        ${IPT} -A INPUT -i ${LANIFACE} -s ${LAN} -j ACCEPT
        ${IPT} -A INPUT -i ${LANIFACE} -s 0.0.0.0 -d 255.255.255.255 -j ACCEPT
        ${IPT} -A FORWARD -i ${LANIFACE} -s ${LAN} -j ACCEPT

        # Masqurade VMWare
        ${IPT} -A INPUT -i ${VMIFACE} -s ${LAN} -j ACCEPT
        ${IPT} -A INPUT -i ${VMIFACE} -s 0.0.0.0 -d 255.255.255.255 -j ACCEPT
        ${IPT} -A FORWARD -i ${VMIFACE} -s ${LAN} -j ACCEPT

        # Allow local full traffic
        ${IPT} -A OUTPUT -o lo -j ACCEPT
        ${IPT} -A INPUT -i lo -j ACCEPT
        ${IPT} -A OUTPUT -o ${VMIFACE} -j ACCEPT

        # Allow all existing connections
        ${IPT} -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        ${IPT} -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
        ${IPT} -I OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

        # FTP
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 21 -j DNAT --to 172.16.1.4:21

        # FTP ACTIVE MODE PORT
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 20 -j DNAT --to 172.16.1.4:20

        # SSH
        ${IPT} -A INPUT -p tcp -i ${WANIFACE} --dport 22 -m recent --set --name ssh --rsource
        ${IPT} -A INPUT -p tcp -i ${WANIFACE} --dport 22 -m recent ! --rcheck --seconds 60 --hitcount 4 --name ssh --rsource -j ACCEPT

        # SMTP
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 25 -j DNAT --to 172.16.1.1:25

        # GRE
        ${IPT} -t nat -A PREROUTING -p gre -i ${WANIFACE} -j DNAT --to 172.16.1.5

        # HTTP
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 80 -j DNAT --to 172.16.1.2:80

        # POP3
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 110 -j DNAT --to 172.16.1.1:110

        # AUTH
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 113 -j DNAT --to 172.16.1.1:113

        # IMAP
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 110 -j DNAT --to 172.16.1.1:143

        # HTTP SSL
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 443 -j DNAT --to 172.16.1.2:443

        # DELTA COPY RAW
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 873 -j DNAT --to 172.16.1.5:873

        # IMAP SSL
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 993 -j DNAT --to 172.16.1.1:993

        # VMWare Server Console
        ${IPT} -A INPUT -p tcp -i ${WANIFACE} --dport 902 -j ACCEPT

        # PPTP VPN
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 1723 -j DNAT --to 172.16.1.5:1723

        # REMOTE DESKTOP
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 3389 -j DNAT --to 172.16.1.5:3389

        # ASSP
        ${IPT} -t nat -A PREROUTING -p tcp -i ${WANIFACE} --dport 55555 -j DNAT --to 172.16.1.1:55555
}

case "$1" in
start)
        echo -n "Starting firewall: ";
        firewall_down
        sleep 1;
        firewall_up
        echo "DONE";
        ;;
stop)
        echo -n "Stopping firewall: ";
        firewall_down
        echo "DONE";
        ;;
reload | restart)
        echo -n "Stopping firewall: ";
        firewall_down;
        echo "DONE";
        sleep 1;
        echo -n "Starting firewall: ";
        firewall_up;
        echo "DONE";
        ;;
*)
        echo;
        echo -e "  <<  firwall  >>  ";
        echo;
        echo "USAGE: /etc/init.d/firewall [option]";
        echo;
        echo "START          Brings up the firewall and sets policies";
        echo "STOP            Brings down the firewall completely";
        echo "RELOAD|RESTART  Brings the firewall down and then up again";
        echo;
esac

exit 0
Avatar billede strych9 Praktikant
09. januar 2008 - 20:43 #1
Til pptp skal du sommetider have en anden port end 1723 åbnet også. Feks IKE vil kræve port 500 (vist nok) åbnet.
Har ikke umiddelbart svaret. Jeg vil foreslå at du smider en sniffer på windows maskinen så du kan se helt nøjagtigt hvad der foregår.
Avatar billede andreas Nybegynder
09. januar 2008 - 21:49 #2
Der er åbnet for GRE protokollen. PPTP bruger kun port 1723 tcp, og GRE (protokol 47).

De er begge forwarded til windows maskinen.

Jeg læste lige, at man skal ha patch-o-matic installeret for at den kan håndtere mere end én bruger af gangen. Det kan være problemet. Jeg har lige prøvet at indlæse "modprobe xt_conntrack".

Jeg kunne godt tænke min kommentarer til scriptet. Mangler der noget vigtigt, rent firewall mæssigt osv.
Avatar billede strych9 Praktikant
09. januar 2008 - 22:12 #3
Hvis du bruger -m state så skal du jo have conntrack modulet med. Hvis det altså ikke er compilet ind i din kerne. Men det kan du ikke altid forlade dig på, så det plejer at være god stil at lave en modprobe i starten af scriptet.

Det issue du omtaler er vist fra 2005, med 2.6 kernen dengang: http://www.clarkconnect.com/developer/bugs/view.php?id=298

Men de mener i hvert fald at du skal have indlæst ip_nat_pptp
Avatar billede strych9 Praktikant
09. januar 2008 - 22:25 #4
hmm gider du at poste output af iptables -L -n engang?
Avatar billede langbein Nybegynder
13. januar 2008 - 17:34 #5
Må det være pptp VPN ? .. Tror at pptp gjennom en Linux gateway kan være komplisert. På den annen side så mener jeg å huske at OpenVPN kjørte gjennom Linux gatewayen uten noe problem som helst.

Det kommer jo an på bruken, men aller enklest og hurtigst synes jeg personlig det er å bruke ssh tunneling ved hjelp av sshd og putty. (nei det er vel ikke VPN men det er da en kryptert forbindelse som kan settes opp hurtig og enkelt og som kan brukes til det aller meste.
Avatar billede andreas Nybegynder
14. januar 2008 - 19:35 #6
Ha, jeg fandt ud af det.

${IPT} -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

skiftet til

${IPT} -I FORWARD -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

gjorde åbenbart tricket. Samt modprob'ede alle moduler for at være sikker.
Avatar billede langbein Nybegynder
15. januar 2008 - 19:11 #7
Det vil vel si at FORWARD settes helt åpen, dvs likt med "${IPT} -P FORWARD ACCEPT".

Når jeg ser på scriptet over en gang til så ser jeg jo at alle prerouting statements skulle vært fulgt ad med en tilsvarende åpning i FORWARD firewall chain.

Men hvis det ikke er individuelle åpninger for hver port, eller alle porter settes åpen, slik som du viser over, da skulle vel heller ikke de øvrige server funksjoner fungere ?

"Sette åpen alle porter" er vel ellers en sannhet med modifikasjoner ved at nat mekanismen gir en form for firewalling uansett. (Men når man setter alle porter åpen i forward chain så blir også dette den eneste beskyttelse (!!??))
Avatar billede langbein Nybegynder
15. januar 2008 - 19:18 #8
En annen måte å gjøre det på er å først lage en prerouting port for port og så la denne prerouting være etterfulgt av en filtering rule som åpner for hver port.

For returtrafikken:

Dette er en statefull inspection funksjon:
${IPT} -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Dette er ikke en statefull inspection funksjon men en åpning for all trafikk vil jeg mene:
${IPT} -I FORWARD -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

(Established og related gir åpning for den trafikk som er generert fra innsiden, altså statefull inspection. New gir på den annen side gjennomgang for all ny trafikk, enten den er generert innenfra eller utenfra, altså full åpning.)

Tror i alle fall det er slik.

(Men scanner man fra utsiden så leser man vel fortsatt "stealth" pga nat mekanismen).
Avatar billede strych9 Praktikant
15. januar 2008 - 20:41 #9
Hvis jeg husker ret, så går pakker som forwardes også igennem input chain. Dvs en forwarding pakke går igennem input -> forward -> output, og der har han jo sat:
${IPT} -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Men jeg er faktisk ikke helt sikker. Han bør nok slå det op.
Avatar billede strych9 Praktikant
15. januar 2008 - 20:53 #10
Faktisk er den god nok: http://iptables-tutorial.frozentux.net/images/tables_traverse.jpg

Men jeg kan ikke se nogen:
${IPT} -P PREROUTING DROP

Jeg synes nu alligevel, ligesom langbein, at du skal prøve at finde ud af hvad der går galt frem for at åbne alt i forward chain. Du kan jo gå tilbage til det gamle setup, men så sætte et LOG target der inden den går videre til default policy for table. Så skulle du få logget hvad der bliver blokeret.
Avatar billede langbein Nybegynder
16. januar 2008 - 00:02 #11
<sitat>
Hvis jeg husker ret, så går pakker som forwardes også igennem input chain. Dvs en forwarding pakke går igennem input -> forward -> output, og der har han jo sat:
${IPT} -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Men jeg er faktisk ikke helt sikker. Han bør nok slå det op.
<sluttsitat>

Dette medfører ikke riktighet. Det var dette som var den store endringen fra firewall til 2.2.x kjernen og til 2.4.x og også 2.6.x kjernen. Datastrømmen til input chain og forward chain ble skilt ad slik at de to datastrømmene paserer hver sine helt uavhengige firewall rule set.

Figuren er noenlunde riktig (men forenkjlet) og den viser dette:
http://iptables-tutorial.frozentux.net/images/tables_traverse.jpg
(Venstre input filter, høyre forward filter.)

<sitat>
Men jeg kan ikke se nogen:
${IPT} -P PREROUTING DROP
<sluttsitat>

Preroting er ikke en del av filtering ruleset, og det går heller ikke ann å sette en policy for prerouting. Policy kan bare settes for FORWARD chain.

Ikke for å være kranglete men .. :-)
Avatar billede andreas Nybegynder
18. april 2008 - 12:55 #12
Det var ikke firewall'en der var problemet, men opsætningen af vpn serveren :\

Jeg beklager
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester