31. juli 2002 - 00:07Der er
55 kommentarer og 1 løsning
iptables Question
Jeg har sat op en linux som bl.a deler forbindelsen til 2 andre maskiner, dette kører via iptables, meen så kommer problemet at jeg har ikke fast ip nummer på eth0. den styres via dhcp fra min isp. og når man fek.s laver en PREROUTING bruger man jo sit ip nummer, og her kommer så spørgsmålet...! kan man lave disse ting UDEN at taste sit ip nummer på en eller anden måde ?? det er lidt kedeligt at skulle omskrive scriptet hver gang man skifter ip og hvordan ville sådan en gryde se ud???
# # Configuration-stuff # LANIF=eth1 # The interface connected to your LAN WANIF=eth0 # The interface connected to the Internet WANIP= # The IP of your WANIF if it's static otherwise # leave blank
# # Define the programs # IPTABLES="/sbin/iptables" SYSCTL="/sbin/sysctl"
# # Flush all current chains in "filter" (default) and "nat" tables # $IPTABLES --flush $IPTABLES --table nat --flush
# # Delete all user-defined chains in "filter" (default) and "nat" tables # $IPTABLES --delete-chain $IPTABLES --table nat --delete-chain
# # Setup masquerading and forwarding # if [ "x$WANIP" = "x" ] then $IPTABLES --table nat --append POSTROUTING --out-interface $WANIF -j MASQUERADE $IPTABLES --append FORWARD --in-interface $LANIF -j ACCEPT else $IPTABLES --table nat --append POSTROUTING --out-interface $WANIF -j SNAT --to-source $WANIP $IPTABLES --append FORWARD --in-interface $LANIF -j ACCEPT fi
$SYSCTL -w net.ipv4.ip_forward=1
og ville så gerne have noget alla denne ind iptables -t nat -A PREROUTING -i eth0 -p tcp -d ip nummer --dport 6112 -j DNAT --to-destination 192.168.1.1
meen så kommer problemet..! jeg kan jo ikke være 100% sikker på ip nummeret da det vil skifte hvis serveren bliver helt slukket, går ned, eller hvis nettet får et brug
hmm umidelbart virker det med /26 i røven af det, meen må simpelthend i seng nu. Skal sku tidligt op i morgern meen skriver lige resultatet op i morgen
Det virker. Pak det ind sådan: $WANIF=$($IFCONFIG $WANIF | grep "inet addr" | sed -e 's/.*inet addr://' -e 's/ .*//')
Men det er stadig noget klyt, fordi scriptet så skal køres hver gang man skifter IP.. I praksis er det måske ikke noget problem, det er bare ikke særligt pænt, synes jeg.
Overhovedet ikke. '/26' har at gøre med subnettet, hvilket ikke er det, vi ønsker.
Der er som sådan ikke noget galt med dit forslag. Ikke i stor stil, i hvert fald. :-) Et par bemærkninger: 1. Hvis shellen understøtter det, så er $() lettere at læse en ``. De er også nemmere at neste. 2. (grep ".*inet") er fjollet. (grep inet) giver nøjagtigt samme resultat og kommandoen udføres hurtigere og kræver mindre RAM. 3. Når nu man allerede ved, hvilket interface, der er eksternt, så kan man da ligeså godt benytte sig af det. 4. Hvis man bytter de to interfaces, så kræver din løsning at man retter noget på nogle meget lidt intuitive steder (dine head og tail-kommandoer). 5. Ikke alle har ip-kommandoen og den ligger ikke nødvendigvis altid lige der. 6. grep og sed bør heller ikke refereres sådan (jeg har lavet samme fejl, jeg ved det). Istedet bør der i starten defineres: GREP=/bin/grep SED=/bin/sed og derefter bør de kaldes som $GREP og $SED. Dette er der flere grunde til: 6a. Hvis PATH ikke sat defineret, så scriptet bliver kaldt, så virker det alligevel. 6b. Hvis programmerne bliver flyttet, så skal der kun rettes eet sted. 7. Hvis du alligevel starter awk op, så kan den jo også alt det, som du bruger head, tail og grep til..
Til gengæld har jeg også lavet en brøler af format:
Følgende er skrupforkert: $WANIF=$($IFCONFIG $WANIF | grep "inet addr" | sed -e 's/.*inet addr://' -e 's/ .*//')
okey så lige et sidste spm jeg får slet ikke nogen resultater ud om PREROUTINGEN såå hvor i scriptet skal de så sættes ?? altså prerouting af portene. først ?? sidst ?? midten ?? whatever
hmm ved nermere kigning passer overstående ikke helt i får lige den fulde fejl meddelelse starting iptablessetup: /etc/rc3.d/S11iptablessetup: eth0: command not found. /bin/sed: cant read -e: no such file or directory /bin/sed: cant read s/ .*// no such file or directory og min setup ser p.t sådan her ud
#!/bin/bash
# # Configuration-stuff # GREP=/bin/grep SED=/bin/sed LANIF=eth1 # The interface connected to your LAN WANIF=eth0 # The interface connected to the Internet WANIP=$($IFCONFIG $WANIF | $GREP "inet addr" | $SED -e 's/.*inet addr://' \ -e 's/ .*//') # The IP of your WANIF if it's static otherwise # leave blank
# # Define the programs # IPTABLES="/sbin/iptables" SYSCTL="/sbin/sysctl"
# # Flush all current chains in "filter" (default) and "nat" tables # $IPTABLES --flush $IPTABLES --table nat --flush
# # Delete all user-defined chains in "filter" (default) and "nat" tables # $IPTABLES --delete-chain $IPTABLES --table nat --delete-chain
ok, men det er svært at hjælpe hvis vi ikke kender fejlen - tidliger i denne tråd var det pludselig ikke længere et spørgsmål om en $ip, men om preroute..
Desuden føler jeg mig sikker på at mit script virker selvom der er subnet (/26) inkluderet - så brug det istedet :)
nå men har fjernet dette nu $($IFCONFIG $WANIF | $GREP "inet addr" | $SED -e 's/.*inet addr://' \ -e 's/ .*//') og tilføjet 213.112.95.163 og vupti no problemos, det virkede som det skulle. såå fejlen ligger i dette $($IFCONFIG $WANIF | $GREP "inet addr" | $SED -e 's/.*inet addr://' \ -e 's/ .*//') meen det kan være mig der har kommet til at sætte et forkert tegn (kan jeg dog ikke lige finde) eller det kan være konsulenten der har kommet til det, sååå lader ham lige forsvare den inden da
nixx det har hele tiden været et spørgsmål om prerouting, da det var det jeg skulle bruge mit ip nummer til. ellers har jeg jo ikke noget at bruge det til herinde væl ??
"nixx det har hele tiden været et spørgsmål om prerouting, da det var det jeg skulle bruge mit ip nummer til"
Problemet var at da du oprettede dette ? skrev du problemet var det med ip adressen, senere skrev du:
"jeg får slet ikke nogen resultater ud om PREROUTINGEN såå hvor i scriptet skal de så sættes ?? altså prerouting af portene. først ?? sidst ?? midten ?? whatever"
Hvilken er en helt anden problematik
Før man kan hjælpe er man nød til at vide hvad det er der ikke virker.. er sikker på Linux konsulent vil give mig ret i dette :-)
grunden til jeg skrev følgende "jeg får slet ikke nogen resultater ud om PREROUTINGEN såå hvor i scriptet skal de så sættes ?? altså prerouting af portene. først ?? sidst ?? midten ?? whatever" var at det undrede mig at intet kom frem og skulle jo være sikker på om det var mig der fejlede der eller om det var det der var sat ind for at finde ip nummeret såmendt ikke andet. og til den med subnet vil jeg sige ja / nej til har dog ikke testet den med porten 6112 men med 4661, 4662 og 4665 og det virkede sådan nogen lunde, men resultatet var lidt sløvt og det er derfor jeg følger op på konsulentens eks ellers havede jeg bare smidt dit op og lukket spm
ok.. så fjerner vi subnet... i nedenstående eksempel: Iøvrigt så kan det godt være at ".*" tager 0.08 cpu sekunder mere end LK´s forslag - men det er vel ligemeget når det er så sjældent man får ny ip/booter!
Dette var da en meget interressant problemstilling !!!
Testet loesningen her fra Bulgaria paa en server som staar hjemme. Det viste seg imidlertid at den "wan adresse" som ble detektet var adressen ut fra Cisco asdl router og til LAN. Denne var 10.0.0.2
Forsoekte saa aa loese problemet paa en helt annen maate. Forandret PREROUTING setningen slik:
Det ser faktisk ut til aa fungere saa langt jeg kan faa testet her i fra.
I all enkelhet - ta vekk hele kriteriet om ip adresse og behold kriteriet for --dport saa er ogsaa problemet loes ved hjelp av en enkelt DNAT setning (tror jeg). Er det noen som tar brydderiet med aa teste ut dette ? (Kommer inn paa serveren hjemme men ikke LAN bak, saa jeg faar ikke satt opp noen server funsjoner bak linux for testing.) Ut fra statuslisting "iptables -t nat -L" saa ser det til aa fungere.
Fejlen ligger i \'en. Grunden til, jeg havde den i mit oprindelig spørgsmål var, at jeg også havde et linieskift.. Eksempel: Hvis man skriver: echo Dette \ er \ en \ prøve
Får man resultatet: Dette er en prøve
Dette sker fordi, hvis en linie ender med \, så er kommandoen ikke færdig endnu, men fortsætter på næste linie. Jamen, hvorfor hulen vil man dog det? Tjo, det er simpelthen fordi det er nemmere at læse. Det, der helt nøjagtigt går galt for dig er, at der står "$SED \ -e " osv. I dette tilfælde betyder \ at det efterfølgende mellemrum skal betragtes som et regulært tegn og ikke som en argumentadskiller.. Med andre ord bliver " -e" andet argument til sed, hvilket jo ikke starter med "-" men med " " og derfor tror sed, at det er et filnavn.. Fjern \ og så er du kørende..
Dank> Der er INGEN grund OVERHOVEDET til at skrive: grep ".*addr" i stedet for grep "addr"
Forskellen er totalt den samme: Den sidste leder efter "addr" og udskriver de linier, hvor det indgår. Den første leder efter "addr" og _enten_noget_eller_ikke_noget_ derfør og udskriver de linier, der passer dertil... Det er jo nonsens..
Vedroerende mitt efteranmeldte forslag om aa skippe hele ip adressen: Det reiser jo et lite folosofisk spoersmaal som jeg i utgangspunktet ikke hadde tenkt 100 % gjennom.
Dersom serveren i prinsipp staar paa et nettverk med 100 ip adresser, vil man saa kunne risikere at den prerouter samtlige 100 ip adresser til den samme server bak firewall ??
Ser man paa teorien rundt iptables alene saa kan det jo nesten se ut slik. Tror allikevell ikke at dette vil skje. Ikke den beste beskrivelsen for prerouting (det er faktisk ikke tegnet inn) men allikevell noe: http://www.digitaltoad.net/docs/iptables-HOWTO-5.html
Grunn: Detektingen av korrekt ip adresse skjer paa et tidligere trinn i informasjonskjeden slik at ingen ip pakker vil naa fram til firewall mekanismen med mindre det dreier seg om den eller en av de ip adressene som nettverkskortet er konfigurert for. Naar ip pakkene naar fram til firewall mekanismen for filtrering saa vil de allerede vaere sjekket for rett ip addresse i forhold til den konfigurering som gjelder for nettverkskortet (tror jeg !)
Indate, dank eller linuxkonsulenten er det noen som gidder aa teste dette ?? (ellers saa maa jeg jo vente helt til jeg er hjemme paa svaret) !!
Altsaa: En annen loesning som ogsaa vil fungere er aa droppe hele angivelsen av eller detektingen av den eksterne ip adressen, hele den setningen gaar bort og saa bare preroute paa basis av kortangivelse og portnummer som seleksjonskriterium og saa preroute til intern ip paa basis av dette, med andre ord kun:
Metoden med aa detekte ip adressen og saa preroute paa basis av dette er jo ellers uansett "den safe og korrekte" og mit alternativ eventuelt et slags "shortcut" eller "tjuvtriks", i forhold til dette (hvis det fungerer).
Synes ellers begge de to maatene for autodetektig av ekstern ip adresse ser baade veldig interresante og nyttige ut.
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.