- Internet sharing
- Requirements
- Configuration
- Static IP address
- Enable packet forwarding
- Enable NAT
- With iptables
- With nftables
- With firewalld
- Assigning IP addresses to the client PC(s)
- Manually adding an IP
- Troubleshooting
- Clients cannot access the internet or cannot connect
- See also
- Как включить IP Forwarding в Linux
- Как включить/выключить IP Forwarding в Linux
- Проверяем включен или нет IP Forwarding в данный момент
- Временно включаем/отключаем IP Forwarding
- Постоянно включаем/отключаем IP Forwarding в системе
Internet sharing
This article explains how to share the internet connection from one machine to other(s).
Requirements
The machine acting as server should have an additional network device. That network device requires a functional data link layer to the machine(s) that are going to receive internet access:
- To be able to share internet to several machines a switch can provide the data link layer connection.
- A wireless device can share access to several machines as well, see Software access point first for this case.
- If you are sharing to only one machine, a crossover cable is sufficient. In case one of the two computers’ ethernet cards has MDI-X capability, a crossover cable is not necessary and a regular ethernet cable can be used. Executing ethtool interface | grep MDI as root helps to figure it.
Configuration
This section assumes that the network device connected to the client computer(s) is named net0 and the network device connected to the internet as internet0 .
All configuration is done on the server computer, except for the final step of #Assigning IP addresses to the client PC(s).
Static IP address
On the server computer, assign a static IPv4 address to the interface connected to the other machines. The first 3 bytes of this address cannot be exactly the same as those of another interface, unless both interfaces have netmasks strictly greater than /24.
# ip link set up dev net0 # ip addr add 192.168.123.100/24 dev net0 # arbitrary address
To have your static IP assigned at boot, you can use a network manager.
Enable packet forwarding
Check the current packet forwarding settings:
You will note that options exist for controlling forwarding per default, per interface, as well as separate options for IPv4/IPv6 per interface.
Enter this command to temporarily enable packet forwarding at runtime:
# sysctl net.ipv4.ip_forward=1
Tip: To enable packet forwarding selectively for a specific interface, use sysctl net.ipv4.conf.interface_name.forwarding=1 instead.
Warning: If the system uses systemd-networkd to control the network interfaces, a per-interface setting for IPv4 is not possible, i.e. systemd logic propagates any configured forwarding into a global (for all interfaces) setting for IPv4. The advised work-around is to use a firewall to forbid forwarding again on selective interfaces. See the systemd.network(5) manual page for more information. The IPForward=kernel semantics introduced in a previous systemd release 220/221 to honor kernel settings does not apply anymore.[1] [2]
Edit /etc/sysctl.d/30-ipforward.conf to make the previous change persistent after a reboot for all interfaces:
/etc/sysctl.d/30-ipforward.conf
net.ipv4.ip_forward=1 net.ipv6.conf.default.forwarding=1 net.ipv6.conf.all.forwarding=1
Afterwards it is advisable to double-check forwarding is enabled as required after a reboot.
Enable NAT
With iptables
Install the iptables package. Use iptables to enable 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
Note: Of course, this also works with a mobile broadband connection (usually called ppp0 on routing PC).
Use -I DOCKER-USER instead of -A FORWARD if you installed docker. [3]
# 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
If connected via PPPoE, clamp mss to pmtu in order to prevent fragmentation:
# iptables -t mangle -A FORWARD -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Read the iptables article for more information (especially saving the rule and applying it automatically on boot). There is also an excellent guide on iptables Simple stateful firewall.
With nftables
Install the nftables package. To enable NAT with nftables, you will have to create the postrouting chain in a new/existing table:
# nft add table inet nat # nft add chain inet nat postrouting '< type nat hook postrouting priority 100 ; >'
After that, you have to masquerade the net0 addresses for internet0 :
# nft add rule inet nat postrouting oifname internet0 masquerade
You may want to add some more firewall restrictions on the forwarding (assuming the filter table already exists, like configured in nftables#Server):
# 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
You can find more information on NAT in nftables in the nftables Wiki. If you want to make these changes permanent, follow the instructions on nftables
With firewalld
Install the firewalld package. firewalld is a firewall daemon which relies on nftables or iptables. First change the firewalld zones of network interfaces:
# firewall-cmd --zone=external --change-interface=internet0 --permanent # firewall-cmd --zone=internal --change-interface=net0 --permanent
Then add a new policy to let traffic flow between the internal and external zone:
# 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
Tip: You can use stricter policy rules than bare ACCEPT as illustrated in the Firewall Rules section of the firewalld concept page[4]
For example, to allow only nodes in 192.168.2.0/24 to access the internet, do:
firewall-cmd —permanent —policy int2ext —add-rich-rule=’rule family=ipv4 source address=192.168.2.0/24 accept’ Do not forget to reload rules afterwards:
Assigning IP addresses to the client PC(s)
If you are planning to regularly have several machines using the internet shared by this machine, then is a good idea to install a DHCP server, such as dhcpd or dnsmasq. Then configure a DHCP client (e.g. dhcpcd) on every client PC.
This article or section needs language, wiki syntax or style improvements. See Help:Style for reference.
Reason: This is not an iptables guide. Expanding the chain with iptables -I might skip other important rules; if you need to script an ON/OFF switch for this, use custom chain with a jump placed carefully in the INPUT chain. (Discuss in Talk:Internet sharing)
Incoming connections to UDP port 67 has to be allowed for DHCP server. It also necessary to allow incoming connections to UDP/TCP port 53 for DNS requests.
# 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
# firewall-cmd --zone=internal --permanent --add-service dns # firewall-cmd --zone=internal --permanent --add-service dhcp # firewall-cmd --zone=internal --permanent --add-service dhcpv6
If you are not planning to use this setup regularly, you can manually add an IP to each client instead.
Manually adding an IP
Instead of using DHCP, a static IP address and a default route via 192.168.123.100 can also be configured manually. There are many tools available to configure the network accordingly. One prominent example of such a tool is ip(8) , see Network configuration#Network management. Alternatively, one can use a .network file, see Systemd-networkd#Wired adapter using a static IP to setup a static IP.
Configure a DNS server for each client, see Domain name resolution for details.
That is it. The client PC should now have Internet.
Troubleshooting
If you are able to connect the two PCs but cannot send data (for example, if the client PC makes a DHCP request to the server PC, the server PC receives the request and offers an IP to the client, but the client does not accept it, timing out instead), check that you do not have other iptables rules interfering.
Clients cannot access the internet or cannot connect
Symptoms might also include: Clients get host is down when pinging host, gets no route to host when pinging devices outside the LAN (that should be forwarded by NAT), DHCP offers not crossing a bridge, .
It is known that docker may cause these problems. Simply disabling docker.service and docker.socket solves this problem.
See also
Как включить IP Forwarding в Linux
Хотите превратить ваш компьютер в маршрутизатор или интернет-шлюз? Первым делом, вы должны включить пересылку IP-пакетов (IP Forwarding).
Если вы хотите превратить ваш компьютер в маршрутизатор или интернет-шлюз (а может быть даже и в VPN-сервер!), вам необходимо включить IP forwarding, который позволит перенаправлять IP-пакеты с одного сетевого интерфейса на другой.
По умолчанию, в большинстве дистрибутивов Linux, IP forwarding отключен.
Перед тем, как его включать, необходимо убедиться в его текущем состоянии — включен он или выключен?.
Откроем Терминал и выполним в командной строке следующую команду:
sudo cat /proc/sys/net/ipv4/ip_forward
Если результатом ее выполнения явилась цифра 1, появившаяся на экране, это означает, что IP forwarding у вас включен и вам ничего предпринимать не нужно.
Если на экране появилась цифра 0, то это означает, что IP forwarding отключен в вашей системе. Приступим к его включению.
Включение IP forwarding.
Для того, чтобы включить пересылку IP-пакетов (IP forwarding) необходимо перейти в режим суперпользователя root (выполнив в консоли команду sudo bash и введя верный пароль). Далее необходимо выполнить любую из представленных ниже команд:
sudo sysctl -w net.ipv4.ip_forward=1 или echo 1 > /proc/sys/net/ipv4/ip_forward
После выполнения одной из этих команд, IP forwarding в вашей системе будет включен и IP-пакеты будут пересылаться с одного сетевого интерфейса на другой.
Для того, чтобы после запуска системы, IP forwarding включался автоматически, откройте в своем любимом текстовом редакторе файл /etc/sysctl.conf, отыщите там строку, начинающуюся с net.ipv4.ip_forward и придайте ей вид:
Выйдите из редактора с сохранением файла, затем выполните в командной строке команду: sudo sysctl -p /etc/sysctl.conf (это позволит применить сделанные нами изменения без перезапуска системы).
Все! При включенном IP forwarding, IP-пакеты должны у вас активно «бегать», а пользователи радоваться появившемуся у них Интернету.
Как включить/выключить IP Forwarding в Linux
Почти во всех распространенных дистрибутивах IP Forwarding выключен по-умолчанию и это имеет смысл, так как далеко не каждый его использует. Но в том случае, если вы планируете поднять собственный маршрутизатор на ОС Linux, настроить VPN сервер и так далее, вам необходимо включить форвардинг пакетов (маршрутизацию транзитных IP-пакетов, т.е. тех пакетов, которые не предназначены именно для вашего компьютера) в вашей ОС. В данной мини-инструкции я расскажу как это можно сделать:
Проверяем включен или нет IP Forwarding в данный момент
Для проверки в каком состоянии в данный момент находится форвардинг пакетов (включен или выключен), мы должны сделать запрос к ядру через команду sysctl. Делается это так:
Временно включаем/отключаем IP Forwarding
Чтобы включить форвардинг пакетов «на лету» и не перезагружать систему, нам достаточно выполнить следующую команду:
sudo sysctl -w net.ipv4.ip_forward=1
Чтобы выключить форвардинг пакетов «на лету» и не перезагружать систему, нам достаточно выполнить следующую команду:
sudo sysctl -w net.ipv4.ip_forward=0
Постоянно включаем/отключаем IP Forwarding в системе
В том случае, если нам необходимо перманентно включить или отключить форвардинг пакетов в системе, нам необходимо внести правки в конфигурационный файл /etc/sysctl.conf Для перманентного включения IP Forwarding, в конец данного файла добавляем следующую строчку:
Для перманентного отключения IP Forwarding, в конец данного файла добавляем следующую строчку:
Если в конфигурационном файле /etc/sysctl.conf уже есть настройка net.ipv4.ip_forward и она не закомментирована, то можно в ней выставить нужное значение и добавлять в конец файла эту настройку еще раз — нет необходимости
Далее, чтобы применить новую настройку, которую мы добавили, нам необходимо выполнить следующую команду:
Все, теперь в зависимости от значения в /etc/sysctl.conf, после перезагрузки ОС, форвардинг пакетов будет либо включен (net.ipv4.ip_forward = 1), либо выключен (net.ipv4.ip_forward = 0).