Сетевые маршруты в CentOS
Введение | |
Показать существующие маршруты | |
Добавить временный маршрут | |
Добавить постоянный маршрут | |
Настроить роутер | |
NAT | |
Похожие статьи |
Введение
В этой статье вы сможете на простом примере изучить работу с сетевыми маршрутами.
Сперва вы научитесь настраивать клиентский хост [andrei@client1 ~]$, ему достаточно иметь один сетевой интерфейс.
У клиента может вообще не быть интерфейса, смотрящего во внешний интернет. Всю работу с внешним
миром он будет вести через второй хост - роутер (#1) [andrei@router ~]$.
Клиент и роутер должны быть в одной подсети, чтобы клиент смог найти роутер. Во внешний интернет роутер (#1) выходит через
роутер (#2)
В этом примере:
IP клиента во внутренней (Host-only) сети VirtualBox - 192.168.56.186/24
IP роутера (#1) во внутренней (Host-only) сети VirtualBox - 192.168.56.181/24
IP роутера (#1) в домашней (Bridged Adapter) сети - 10.1.54.217/21
IP роутера (#2) в домашней сети 10.1.55.254
Совет
Если вы недостаточно уверенно оперируете терминами сеть, подсеть, маска сети - советую сперва изучить статью
«Компьютерные сети»
Если вы работаете с
VirtualBox
чтобы повторить этот пример клиенту можете оставить только Host-only Adapter а роутеру оставьте два - Host-only и Bridged Adapter
Показать существующие маршруты
Список интерфейсов клиента можно изучить командой
ip a s
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.56.186 netmask 255.255.255.0 broadcast 192.168.56.255 inet6 fe80::7a4:b74c:942a:bbdf prefixlen 64 scopeid 0x20<link> ether 08:00:27:1c:cd:94 txqueuelen 1000 (Ethernet) RX packets 1004 bytes 129137 (126.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 20276 bytes 1273399 (1.2 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 13030 bytes 1146784 (1.0 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 13030 bytes 1146784 (1.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:34:a8:f3 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Чтобы увидеть маршруты выполните
ip route show
Или просто
ip r
192.168.56.0/24 dev enp0s3 proto kernel scope link src 192.168.56.186 metric 100 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
Можно использовать команду route
route
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.56.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s8 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
Или netstat
netstat -r
Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s8 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
netstat -rn
Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s8 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
Добавить маршрут временно
Создать маршрут по умолчанию - то есть маршрут, который будет применятся для всех сетей, не имеющих специально созданного вами маршрута.
sudo ip route add default via 192.168.56.181
ip r
default via 192.168.56.181 dev enp0s3 192.168.56.0/24 dev enp0s3 proto kernel scope link src 192.168.56.186 metric 100 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
Создан маршрут по умолчанию. Он проходит через хост c IP адресом 192.168.56.181.
Чтобы маршрут заработал нужно настроить этот хост как роутер.
Созданный маршрут удалится после перезагрузки компьютера. Чтобы этого не случилось, нужно сохранить настройки.
Добавить маршрут на постоянной основе
Чтобы сохранить маршрут после перезагрузки, его нужно добавить в конфигурационный файл
cat /etc/resolv.conf
# Generated by NetworkManager search hel.fi.ssh.com nameserver 10.10.10.1 nameserver 10.1.0.2
cd /etc/sysconfig/network-scripts
ls | grep ifcfg
ifcfg-enp0s3 ifcfg-enp0s8 ifcfg-lo
Отредактируйте тот интерфейс, через который планируете работать
sudo vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="dhcp" DEFROUTE="yes" GATEWAY="192.168.56.181" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="enp0s3" UUID="2301b149-07d1-4432-b4b0-0abce0791d7c" DEVICE="enp0s3" ONBOOT="yes"
Настройка роутера
У роутера обычно несколько активных сетевых интерфейса. В данном примере enp0s8 слушает в ту же сеть, что и клиент а enp0s3 слушает на другой роутер, который слушает внешний интернет.
На роутере тоже можно изучить существующие маршруты.
ip r s
default via 10.1.55.254 dev enp0s10 proto dhcp metric 101 10.1.48.0/21 dev enp0s10 proto kernel scope link src 10.1.54.217 metric 101 192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.181 metric 100
Как вы можете увидеть - по умолчанию мой роутер использует 10.1.55.254/21 - это другой роутер, который слушает внешний интернет.
Выполните
cat /proc/sys/net/ipv4/ip_forward
0
Если у вас там 0, значит маршрутизация выключена.
Чтобы включить маршрутизацию добавьте net.ipv4.ip_forward=1 в конец sysctl.conf
sudo vi /etc/sysctl.conf
# sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/. # # Vendors settings live in /usr/lib/sysctl.d/. # To override a whole file, create a new file with the same in # /etc/sysctl.d/ and put new settings there. To override # only specific settings, add a file with a lexically later # name in /etc/sysctl.d/ and put new settings there. # # For more information, see sysctl.conf(5) and sysctl.d(5). net.ipv4.ip_forward=1
Проверить результат
sudo sysctl -p
net.ipv4.ip_forward = 1
!cat
cat /proc/sys/net/ipv4/ip_forward
1
Роутер работает, но клиенту этого недостаточно, так как отправив запрос через роутер можно не дождаться ответа - хосты куда отправлен запрос могут не иметь представления о внутренней сети и отвечать так, как будто общаются просто с роутером.
С клиента можно получить пинг от роутера (#1)
ping 10.1.54.217
PING 10.1.54.217 (10.1.54.217) 56(84) bytes of data.
64 bytes from 10.1.54.217: icmp_seq=1 ttl=64 time=0.760 ms
Но пинг до роутера (#2) не получится
[andrei@client1 ~]$ ping 10.1.55.254
Чтобы это исправить нужно с помощью iptables настроить NAT MASQUARADE
РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет
Конец рекламы хостинга Beget, который я всем рекомендую.
NAT
Пример настройки
[andrei@router ~]$ systemctl stop firewalld
[andrei@router ~]$ sudo iptables -L
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
[andrei@router ~]$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination
К адаптеру, который смотрит во внешний интернет нужно добавить правило. В моём случае это Bridged адаптер enp0s10
sudo iptables -t nat -A POSTROUTING -o enp0s10 -j MASQUERADE
sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- anywhere anywhere
Теперь пинг до роутера (#2) сработает
[andrei@client1 ~]$ ping 10.1.55.254
PING 10.1.55.254 (10.1.55.254) 56(84) bytes of data.
64 bytes from 10.1.55.254: icmp_seq=1 ttl=63 time=1.77 ms
Точно также можно использовать
NatNetwork
адаптер.
Допустим, в VirtualBox есть сеть nn2 и хост 192.168.15.4
Добавить роутеру (#1) адаптер NatNetwork и подключим его к nn2.
В данном примере это оказался адаптер enp0s9
ip a
…
4: enp0s9:
sudo iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE
sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- anywhere anywhere MASQUERADE all -- anywhere anywhere
Теперь с клиента можно увидеть этот хост из другой NAT сети
[andrei@client1 ~]$ ping 192.168.15.4
PING 192.168.15.4 (192.168.15.4) 56(84) bytes of data. 64 bytes from 192.168.15.4: icmp_seq=1 ttl=63 time=2.22 ms
РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе
Конец рекламы от Яндекса. Если в блоке пусто считайте это рекламой моей телеги