Не удается правильно настроить шлюз в Ubuntu 16.04
Я пытаюсь сделать шлюз с помощью Ubuntu 16.04, мой сервер имеет следующие nics:
enp4s0 Link encap:Ethernet HWaddr 00:15:c5:f6:c0:36
inet addr:192.168.0.101 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::215:c5ff:fef6:c036/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5118 errors:0 dropped:0 overruns:0 frame:0
TX packets:3065 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7474529 (7.4 MB) TX bytes:254689 (254.6 KB)
Interrupt:16
enp6s0 Link encap:Ethernet HWaddr 00:08:54:31:8f:79
inet addr:172.24.3.19 Bcast:172.24.3.255 Mask:255.255.252.0
inet6 addr: fe80::208:54ff:fe31:8f79/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7573 errors:0 dropped:334 overruns:0 frame:0
TX packets:2756 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:756664 (756.6 KB) TX bytes:881724 (881.7 KB)
enp4s0 - это WAN, подключенный к Интернету. enp6s0 - это ЛВС.
Я настроил их как есть /etc/network/interfaces
:
allow-hotplug enp4s0
iface enp4s0 inet dhcp
allow-hotplug enp6s0
iface enp6s0 inet static
address 172.24.3.19
netmask 255.255.252.0
gateway 172.24.0.1
dns-nameservers 172.24.3.1
enp4s0 получил ip следующим образом, извлеченный из /var/lib/dhcp/dhclient.enp4s0.leases
:
lease {
interface "enp4s0";
fixed-address 192.168.0.101;
option subnet-mask 255.255.255.0;
option routers 192.168.0.1;
option dhcp-lease-time 7200;
option dhcp-message-type 5;
option domain-name-servers 192.168.0.1,8.8.8.8;
option dhcp-server-identifier 192.168.0.1;
renew 5 2018/06/08 16:03:17;
rebind 5 2018/06/08 16:59:19;
expire 5 2018/06/08 17:14:19;
}
Следуя Nairabytes.net, я применил некоторые правила iptables следующим образом:
iptables -t nat -A POSTROUTING -o enp4s0 -j MASQUERADE
iptables -A FORWARD -i enp4s0 -o enp6s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i enp6s0 -o enp4s0 -j ACCEPT
Таким образом, правила iptables стали следующими:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Но я не могу понять, почему только одна из двух карт работает правильно. Хотя этот сервер может общаться с локальной сетью по enp6s0, он не может подключиться к Интернету.
Поэтому я применяю этот маршрут к нему:
sudo /sbin/route add -net 0.0.0.0 gw 192.168.0.1 enp4s0
И дело идет вспять! Теперь сервер может подключаться к Интернету, но становится недоступным для локальной сети.
Что я делаю неправильно?
1 ответ
sudo /sbin/route add -net 0.0.0.0 gw 192.168.0.1 enp4s0
Это устанавливает маршрут для всего на 192.168.0.1.
Возможно, вы захотите добавить шлюз по умолчанию, что означает, что все, что не соответствует более конкретным маршрутам, идет сюда. Это можно сделать с помощью следующей команды:
sudo ip route add default via 192.168.0.1 dev enp4s0
Кроме того, вам потребуется маршрут для 172.24.0.0/16 на другой сетевой карте:
sudo ip route add -net 172.24.0.0/16 via 172.24.3.1 dev enp6s0
Это добавит маршрут к вашей локальной сети 172.240.0 / 16, что позволит вам связаться с этой сетью. Поскольку это более конкретный маршрут, он выбирается по умолчанию для пакетов, идущих на 172.24.0.0.