Δημοσιεύτηκε: 12 Οκτ 2008, 23:00
από dimisKJ
Update: Δοκιμασμενος οδηγος σε 8.04 και 8.10

Μετα απο τριβη ενος μηνα με το ubuntu ξεκινησα να ετοιμασω ενα σχετικα δυσκολο εγχειρημα για αρχαριο οπως εγω. Ηθελα να κανω Internet Connection Sharing μεσα απο ενα Ad-Hoc ασυρματο δικτυο. Αρχικα, για καποιες μερες διαβασα τους ακολουθους οδηγους απο το ubuntu.com (Οδηγος #1, Οδηγος #2, Οδηγος #3) και αφου σχηματισα μια καλη εικονα του τι γινεται, στην συνεχεια ξεκινησα τους πειραματισμους. Μετα απο καποιες μερες τελικα το συστημα δουλεψε και εφοσον δεν υπηρχε κατι σχετικο στο forum, σκεφτηκα να χρησιμοποιησω τις σημειωσεις μου γραφοντας τον ακολουθο οδηγο. Για τον οδηγο απαιτουνται καποιες βασικες γνωσεις δικτυωσης υπολογιστων.

Μεσα απο τους πειραματισμους διαπιστωσα οτι οι static ΙΡs δεν ηταν ιδιαιτερα βολικες, ολες οι συνδεσεις εγιναν μεσα απο DHCP.

Φάση 1η

Ξεκινω με τις ρυθμισεις του κεντρικου υπολογιστη ο οποιος ειναι συνδεδεμενος με τον adsl router.

Αρχικα αλλαζουμε το αρχειο με τα network interfaces...

Κώδικας: Επιλογή όλων
sudo gedit /etc/network/interfaces


Και αντιγραφουμε επακριβως την παρακατω δομη. Σε αυτα επιλεγουμε οτι στην eth1 που ειναι η wireless καρτα μας (θα μπορουσε να λεγονταν και wlan0) να ετοιμασει ad-hoc δικτυο, στο καναλι τεσσερα, με ονομα 'my_lan' και κωδικο 1234567890. Ονομα δικτυου και κωδικο δινουμε κατι απολυτως της επιλογης μας. Τελος βαζω και την gateway, που ειναι η IP του router (η gateway ισως να ειναι περιττη, παντως δεν δημιουργει καποιο προβλημα).

Κώδικας: Επιλογή όλων
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet dhcp
   wireless-mode ad-hoc
   wireless-channel 4
   wireless-essid 'my_wlan'
   wireless-key 1234567890
   gateway 192.168.2.1


Στην συνεχεια πρεπει να ρυθμισουμε τα iptables δινοντας τους κανονες που θα επιτρεψουν στα δεδoμενα να περασουν το firewall του Ubuntu.

Κανονας 1 : επιτρεπει την διελευση των forwarded packets (αρχικοποιηση)
Κώδικας: Επιλογή όλων
sudo iptables -A FORWARD -i eth0 -o eth1 -s 192.168.2.0/24 -m state --state NEW -j ACCEPT

Να δωθει προσοχη στο παραπανω ωστε η IP που θα δωσουμε να σχετιζεται με την IP του router μας. Εδω η τιμη ειναι 192.168.2.0/24, γιατι ο router εχει 192.168.2.1... Αν ηταν 192.168.0.1 θα διναμε 192.168.0.0/24

Κανονας 2 : επιτρεπει την προωθηση των established connection packets (και αυτων που σχετιζονται με την αρχικοποιηση).
Κώδικας: Επιλογή όλων
sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


Κανονας 3 : δημιουργια του ΝΑΤ
Κώδικας: Επιλογή όλων
sudo iptables -A POSTROUTING -t nat -j MASQUERADE


Τελος, πρεπει να γινει ενοργοποιηση του IP Forwarding για την ρυθμιση του gateway μεταξυ των 2 interfaces (eth0 και eth1)
Κώδικας: Επιλογή όλων
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"


Φάση 2η

Μετα ρυθμιζουμε τις συσκευες που θελουμε να συνδεσουμε και που δεν εχουν συνδεση ιντερνετ και υποθετουμε οτι τρεχουν επισης Ubuntu. Γενικα ο NetworkManager δεν ειναι πολυ συνεργασιμος, οποτε αν θελουμε τον σταματαμε, γιατι μας ειναι αχρηστος

Κώδικας: Επιλογή όλων
sudo /etc/dbus-1/event.d/25NetworkManager stop


Ανοιγουμε το αρχειο με τα network interfaces...
Κώδικας: Επιλογή όλων
sudo gedit /etc/network/interfaces


Και αντιγραφουμε τα παρακατω. (Η δηλωση της gateway ισως παλι να ειναι περιττη, παντως δεν δημιουργει καποιο προβλημα).
Κώδικας: Επιλογή όλων
auto lo
iface lo inet loopback

auto eth1
iface eth1 inet dhcp
   wireless-mode ad-hoc
   wireless-channel 4
   wireless-essid 'my_wlan'
   wireless-key 1234567890
   gateway 192.168.2.1


Σε περιπτωση που δεν τρεχουν Ubuntu και τρεχουν κατι αλλο (π.χ. MACOSX το iPhone) το μονο που χρειαστηκε ηταν να δηλωσω τον DNS Server του ISP. Τα υπολοιπα τα βρηκε μονο του.

Φάση 3η

Επιστρεφουμε στον βασικο υπολογιστη που ειναι συνδεδεμενος με το ιντερνετ για να εγκαταστησουμε το dnsmasq απο το synaptic, το οποιο ειναι ενας DNS forwarder.
Για να τον ρυθμισουμε πρεπει να σταματησουμε την λειτουργια του.
Κώδικας: Επιλογή όλων
sudo /etc/init.d/dnsmasq stop


Ανοιγουμε το configuration αρχειο
Κώδικας: Επιλογή όλων
sudo gedit /etc/dnsmasq.conf


Και δινουμε το interace των συσκευων που συνδεονται στον κεντρικο υπολογιστη και θα μοιραστουν την ιντερνετ συνδεση του. Επισης πρεπει να δωσουμε και το ευρος των IP διευθυνσεων που επιθυμουμε να λαβουν. Για παραδειγμα αν θελουμε να δωσουμε ΙΡ μεσα στο 169.254.100.ΧΧΧ, μπορουμε να δωσουμε το ακολουθο ευρος τιμων...
Κώδικας: Επιλογή όλων
interface=eth1
dhcp-range=169.254.100.50,169.254.100.200


Η παραπανω ρυθμιση του dnsmasq εχει πολλες δυνατοτητες, οπως π.χ. να δηλωθει η MAC address της καρτας, αλλα ξεφευγει απο τις απαιτησεις του παροντος tutorial.
Αφου τελειωσουμε ανοιγουμε παλι το dnsmasq
Κώδικας: Επιλογή όλων
sudo /etc/init.d/dnsmasq start


Τελευταιο σταδιο της διαδικασιας ειναι η δηλωση των DNS Servers του ISP μας. Ανοιγουμε το configuration αρχειο του dhclient
Κώδικας: Επιλογή όλων
sudo gedit /etc/dhcp3/dhclient.conf


Kαι ψαχνουμε για το "prepend domain-name-servers"... Για οσους εχουν ΟΤΕΝΕΤ ή conn-x πρεπει να βαλουν
Κώδικας: Επιλογή όλων
prepend domain-name-servers 195.170.0.1,195.170.2.2;

Οι υπολοιποι τους DNS Servers των providers τους.

Για να φορτωθουν οι νεες ρυθμισεις τρεχουμε και στους 2 υπολογιστες του ad-hoc δικτυου
Κώδικας: Επιλογή όλων
sudo /etc/init.d/networking restart


Αυτο ηταν! Τελος! Λογικα, ολα πρεπει να δουλευουν...

Αν ολα πανε κατ'ευχη και λειτουργουν οπως επιθυμουμε, θα πρεπει να σωσουμε τους κανονες των iptables, γιατι μετα απο καθε reboot θα χανονται.
Για να σωζουμε τους κανονες των iptables εκτελουμε
Κώδικας: Επιλογή όλων
sudo sh -c "iptables-save > /etc/iptables.rules"


Τελος, πηγαινουμε στο αρχειο με τα network interfaces του βασικου υπολογιστη και αλλαζουμε το κομματι που αφορα το eth0...
Κώδικας: Επιλογή όλων
sudo gedit /etc/network/interfaces


και το αλλαζουμε σε
Κώδικας: Επιλογή όλων
auto eth0
iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.rules

ωστε καθε φορα που ανοιγει ο υπολογιστης να φορτωνει τους κανονες μας.

Το αν και ποιοι κανονες υπαρχουν στο iptables φαινεται μεσα απο
Κώδικας: Επιλογή όλων
sudo iptables -L -n


Μπραβο σε οσουν ειχαν την υπομονη και το διαβασαν ως το τελος! :)