Internet sharing (Русский)

Эта статья описывает, как раздать подключение к интернету от одного компьютера одному или нескольким другим компьютерам.

Состояние перевода: На этой странице представлен перевод статьи Internet sharing. Дата последней синхронизации: 11 декабря 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Системные требования

Компьютер, выполняющий роль сервера, должен иметь дополнительное сетевое устройство. На нём должно работать соединение канального уровня с компьютером, который будет получать интернет:

  • Чтобы иметь возможность поделиться интернетом с несколькими компьютерами, можно использовать коммутатор.
  • Можно раздавать интернет через беспроводную сеть; подробности в статье Программная точка доступа.
  • Если доступ предоставляется только одному компьютеру, достаточно перекрёстного кабеля. Если одна из сетевых карт поддерживает MDI-X, перекрёстный кабель не нужен и можно использовать обычный Ethernet-кабель. Чтобы разобраться в этом, можно выполнить команду от имени root.

Настройка

В этом разделе предполагается, что сетевой интерфейс, подсоединяемый к клиентскому компьютеру (компьютерам), называется net0, а сетевой интерфейс, подключенный к интернету называется internet0.

Вся настройка выполняется на компьютере, выполняющем роль сервера, за исключением последнего шага в разделе #Назначение ip адресов клиентским компьютерам.

Статический IP адрес

Назначьте статический IPv4 адрес интерфейсу, подключенному к другим компьютерам. Первые 3 байта этого адреса не могут быть такими же как у другого интерфейса.

# ip link set up dev net0
# ip addr add 192.168.123.100/24 dev net0 # произвольный адрес

Чтобы статический ip был назначен при загрузке, можно использовать какой-нибудь сетевой менеджер.

Разрешите пересылку пакетов

Проверьте текущие настройки перенаправления пакетов:

# sysctl -a | grep forward

Вы заметите, что эта опция существует для управления переадресацией по умолчанию, на интерфейсе, а также отдельные опции для IPv4/IPv6 на интерфейсе.

Введите следующую команду для временного разрешения пересылки пакетов во время выполнения:

# sysctl net.ipv4.ip_forward=1
Совет: Чтобы включить пересылку пакетов только на определённом интерфейсе, можно вместо этой команды использовать sysctl net.ipv4.conf.интерфейс.forwarding=1.

Чтобы разрешение на пересылку для всех интерфейсов осталось после перезагрузки, отредактируйте /etc/sysctl.d/30-ipforward.conf:

После этого рекомендуется дважды проверить, что после перезагрузки пересылка работает как положено.

С помощью iptables

Установите пакет . Используйте iptables, чтобы включить NAT:

# iptables -t nat -A POSTROUTING -o internet0 -j MASQUERADE
# iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i net0 -o internet0 -j ACCEPT

Используйте вместо , если у вас установлен docker.

# iptables -t nat -A POSTROUTING -o internet0 -j MASQUERADE
# iptables -I DOCKER-USER 1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# iptables -I DOCKER-USER 2 -i net0 -o internet0 -j ACCEPT

При подключении через PPPoE уменьшите mss до pmtu, чтобы предотвратить фрагментацию:

# iptables -t mangle -A FORWARD -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Прочтите статью iptables (Русский) для дополнительной информации (в особенности о сохранении правил и их автоматическом применении при загрузке). Также есть отличная инструкция по iptables Simple stateful firewall (Русский).

С помощью nftables

Установите пакет . Для включения NAT с помощью nftables создайте цепочку в новой/существующей таблице:

# nft add table inet nat
# nft add chain inet nat postrouting '{ type nat hook postrouting priority 100 ; }'

После этого включите маскарадинг адресов из интерфейса для интерфейса internet0:

# nft add rule inet nat postrouting oifname internet0 masquerade

Возможно, вы захотите добавить ещё несколько ограничений межсетевого экрана на пересылку (при условии, что таблица фильтров уже существует и настроена как описано в разделе nftables (Русский)#Сервер):

# nft add chain inet filter forward '{ type filter hook forward priority 0; policy drop; }'
# nft add rule inet filter forward ct state related,established accept
# nft add rule inet filter forward iifname net0 oifname internet0 accept

Дополнительную информацию о NAT в nftables можно найти в nftables Wiki. Чтобы сделать изменения постоянными, следуйте инструкциям в статье nftables (Русский).

С помощью firewalld

Установите пакет . firewalld — это демон межсетевого экрана, который полагается на nftables и iptables. Сначала измените зоны сетевых интерфейсов firewalld:

# firewall-cmd --zone=external --change-interface=internet0 --permanent
# firewall-cmd --zone=internal --change-interface=net0 --permanent

Затем добавьте новую политику для пропуска трафика между внутренней и внешней зоной:

# firewall-cmd --permanent --new-policy int2ext
# firewall-cmd --permanent --policy int2ext --add-ingress-zone internal
# firewall-cmd --permanent --policy int2ext --add-egress-zone external
# firewall-cmd --permanent --policy int2ext --set-target ACCEPT
# firewall-cmd --reload

Назначение ip адресов клиентским компьютерам

Если вы планируете регулярно подключать какие-то компьютеры для использования интернета через ваш компьютер, хорошей идеей будет установка dhcp сервера. В качестве DHCP-сервера можно использовать, например, dhcpd (Русский) или dnsmasq. Затем установите DHCP-клиент (например, dhcpcd) на каждый клиентский компьютер.

На стороне сервера должен быть разрешён приём пакетов на UDP-порт 67. Также нужно разрешить входящие соединения с UDP/TCP портом 53 для DNS запросов. Пример для iptables:

# iptables -I INPUT -p udp --dport 67 -i net0 -j ACCEPT
# iptables -I INPUT -p udp --dport 53 -s 192.168.123.0/24 -j ACCEPT
# iptables -I INPUT -p tcp --dport 53 -s 192.168.123.0/24 -j ACCEPT

Если вы не планируете такое подключение на регулярной основе, вы можете задать ip адреса каждому клиенту вручную.

Назначение ip адресов вручную

Вместо использования DHCP можно вручную задать статический IP-адрес и маршрут по умолчанию через . Существует множество инструментов для соответствующей настройки сети. Одним из ярких примеров такого инструмента является ip(8), смотрите раздел Настройка сети#Управление сетевым подключением. Или можно использовать файл , смотрите раздел systemd-networkd (Русский)#Проводной интерфейс со статическим IP-адресом для настройки статического IP.

Укажите DNS сервер на каждом клиентском компьютере. Смотрите resolv.conf для дополнительной информации.

Теперь клиентский компьютер должен иметь доступ в Internet.

Решение проблем

Если вы можете подключить два компьютера, но не можете пересылать данные (например, если клиентский делает DHCP запрос к раздающему компьютеру, раздающий компьютер получает запрос и предлагает IP клиенту, но клиент не принимает его, а вместо этого происходит тайм аут), проверьте, что вы не имеете других интерферирующих правил iptables.

Клиенты не могут получить доступ к интернету или не могут подключиться

Симптомы могут быть такие: клиенты получают сообщение , когда пингуют хост, получают , когда пингуют устройства вне локальной сети (которые должны быть перенаправлены через NAT), DHCP-запросы не проходят через мост, ...

Известно, что такие проблемы может вызывать Docker. Простое отключение юнитов и решает проблему.

docker github issue.

Смотрите также

gollark: But the extensions can really only be implemented on an acausal logic processor.
gollark: Turi + extensions can do thatm
gollark: Halting problem & all.
gollark: Impossible.
gollark: <@236831708354314240>```f x = unsafeCoerce```
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.