Эта статья в wikiInternet Connection Sharing (ICS) in Ubuntu. Или как дать интернет второму компу.
На написание этой заметки меня подвигли многочисленные темы новичков, то и дело возникающих с подобным вопросом. В ней будет рассмотрена настройка сервера и необходимых служб, для простейшей реализации ICS в Ubuntu Linux.
Рассмотрим простой пример, когда второму комьютеру необходимо предоставить ресурсы интернета.
ВНИМАНИЕ! Все дальнейшие действия будут выполняться из под суперпользователя, при помощи консоли, поэтому нужно быть внимательным при выполнении тех или иных команд.Итак, у нас есть компьютер с двумя сетевыми картами под управлением Ubuntu Linux - СЕРВЕР.
I. Настройка сетевых интерфейсов.
Так как данная тема весьма обширна и явно не уместится в этом how-to, мы рассмотрим только настройку интерфейса, который будет отдавать интернет на второй компьютер (КЛИЕНТ). Посмотреть доступные интерфейсы можно командой
ifconfig -a. Условимся, что
eth0 - сконфигурирован и получает интернет от провайдера
eth1 - отдаёт интернет КЛИЕНТУ.
Что необходимо сделать:
1. Сделать автозагрузку правил iptables, с помощью скрипта iptables-restore. Другой вариант, так называемый "Lazy Mode" описан
тут.
2. Настроить интерфейс получающий интернет.
3. Настроить интерфейс отдающий интернет.
Для наглядности, мы будем использовать пример с
gedit, но в системах без графического интерфейса, следует использовать CLI-редакторы, например
vi,
vim,
nano или
mc.
Открываем терминал: Приложения - Стандартные - Терминал.
sudo -s
cp /etc/network/interfaces /etc/network/interfaces.bak
gedit /etc/network/interfaces
/etc/network/interfacesauto lo
iface lo inet loopback
post-up iptables-restore </etc/iptables.conf
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet static
address 192.168.0.1
netmask 255.255.255.0
Сохраняем, закрываем, перезапускаем сетевой интерфейс, смотрящий в локальную сеть КЛИЕНТА.
ifdown eth1
ifup eth1
Настройка интерфейса закончена.
II. Настройка правил iptables и параметров ядра.
Эта тема также требует отдельного рассмотрения, поэтому нам нужно только самое необходимое.
Что необходимо сделать:
1. Разрешить пакетам бегать между интерфейсами. Это команда выполняется однажды, дальше, при необходимости, изменяются только правила iptables.
2. Разрешить
NAT домашней сети, скофигурировав правила iptables.
3. Дефрагментировать tcp-пакеты, если размер
MTU разный на интерфейсах.
4. Сохранить правила iptables с помощью скрипта iptables-save.
Открываем терминал: Приложения - Стандартные - Терминал.
sudo -s
echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf; sysctl -p
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE
iptables -t mangle -A FORWARD -p tcp -m tcp --tcp-flags RST,SYN SYN -j TCPMSS --clamp-mss-to-pmtu
iptables-save >/etc/iptables.conf
Настройка таблиц iptables и параметров ядра завершена.
Впринципе на этом можно было бы и закончить, если бы не одно НО! КЛИЕНТ, не сможет автоматически получить IP адрес и IP сервера DNS от СЕРВЕРА. Любителям ручных настроек, на КЛИЕНТЕ указать:
IP адрес: 192.168.0.2
Маску подсети: 255.255.255.0
Шлюз: 192.168.0.1
DNS: DNS-провайдера
и следующий пункт можно не читать
III. Настройка DNS и DHCP-сервера.
Если Вы используете в качестве DHCP - dhcp3-server (DHCP 3.0 или DHCP 4.0), а в качестве DNS-сервера - BIND9, обратитесь к руководствам этих приложений для их конфигурирования.Тут будет рассмотрена настройка DNS-прокси и DHCP-сервера, на примере
dnsmasq, который используется в большинстве домашних маршрутизаторах.
Открываем терминал: Приложения - Стандартные - Терминал.
sudo -s
apt-get install dnsmasq
cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
gedit /etc/dnsmasq.conf
/etc/dnsmasq.conf# Укажем интерфейс, который будет слушать dnsmasq
interface=eth1
# Укажем адрес, на котором будет находиться dnsmasq
listen-address=192.168.0.1
# Укажем dnsmaq слушать только интерфейсы
bind-interfaces
# Укажем локальный домен, для нашей домашней сети, это не обязятельно
domain=linux.lan
# Укажем DHCP-серверу диапазон выдаваемых адресов, длинную маску и время их аренды
dhcp-range=192.168.0.2,192.168.0.254,255.255.255.0,24h
# Укажем DHCP-серверу маршрут по умолчанию (default route) выдаваемом клиентам,
# в нашем случае это адрес интерфейса eth1
dhcp-option=3,192.168.0.1
# По идее можно указать адреса DNS, выдаваемых DHCP-сервером принудительно,
# если что-то не устраивает в dnsmasq, хотя Клиент и так по умолчанию
# получает адрес DNS=IP-eth1
# dhcp-option=6,ip-dns1,ip-dns2,ip-dnsN
Сохраняем. Перезапускаем dnsmasq
service dnsmasq restart
Настройка ISC на Ubuntu завершена. На всякий случай можно перезагрузить СЕРВЕР, что бы убедиться в работоспособности этой схемы после перезагрузки, связанной с обновлением ядра и другими причинами.
Полезные ссылки:
Руководство по iptablesРуководство sysctlРуководство interfacesРуководство dnsmasqТаблица соответствия масок подсетейIP-калькуляторОбжим витой пары в RJ-45Внимательно проверьте конфигурацию еще раз, ошибки в конфигурационных файлах - частая причина неработоспособности конструкции. Если Вы не можете найти и исправить ошибки самостоятельно, напишите в эту тему. Для того, что бы быстрее найти проблему, желательно приложить к сообщению выводы следующих команд.
с сервера
sudo iptables-save
sudo iptables -t nat -nvL
cat /etc/network/interfaces
cat /etc/dnsmasq.conf
ifconfig -a
route -n
cat /proc/sys/net/ipv4/ip_forward
arp -n -i eth1
с клиента под управлением Linux
ifconfig -a
route -n
ping -c3 192.168.0.1
tracepath ya.ru
tracepath 8.8.8.8
с клиента под управлением Windows
ipconfig /all
route print
ping 192.168.0.1
tracert ya.ru
tracert 8.8.8.8