Вот проблема, которую я пытаюсь решить. Есть сервер («удаленная система»), к которому я могу подключиться по ssh с моего локального компьютера, но эта удаленная система не имеет подключения к Интернету. Я хочу предоставить удаленной системе доступ к Интернету через мой локальный компьютер с помощью VPN на основе ssh. Как мне этого добиться? Я попробовал следующее, и это, кажется, частично работает. Под «частично работает» я подразумеваю то, что пакеты соединения (пакеты синхронизации) отправляются на мой локальный компьютер, но не устанавливают соединение с Интернетом. Я использую tcpdump для захвата пакетов на локальном компьютере. Локальный компьютер и удаленная система работают под управлением Centos 7.
Установка- Примечание: команды ниже выполняются по порядку. Команды user@remote выполняются на удаленном сервере, а команды user@local выполняются на локальном компьютере.
[пользователь@удаленный ~]$ ip адрес показать 1: lo: mtu 65536 qdisc noqueue state НЕИЗВЕСТНО ссылка/обратная связь 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 область действия хоста lo действительный_lft навсегда предпочтительный_lft навсегда inet6 ::1/128 область действия хоста действительный_lft навсегда предпочтительный_lft навсегда 2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 ссылка/эфир AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 область действия глобальная динамическая eth0 действительный_lft 1785сек предпочтительный_lft 1785сек inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 область действия глобальная noprefixroute динамический действительный_lft 2591987 сек предпочтительный_lft 604787 сек inet6 ABCD::III:JJJJ:KKKK:LLLL/64 область действия ссылка действительный_lft навсегда предпочтительный_lft навсегда
[пользователь@локальный ~]$ ip адрес показать 1: lo: mtu 65536 qdisc noqueue state НЕИЗВЕСТНО ссылка/обратная связь 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 область действия хоста lo действительный_lft навсегда предпочтительный_lft навсегда inet6 ::1/128 область действия хоста действительный_lft навсегда предпочтительный_lft навсегда 2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 ссылка/эфир AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 область действия глобальная динамическая eth0 действительный_lft 1785сек предпочтительный_lft 1785сек inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 область действия глобальная noprefixroute динамический действительный_lft 2591987 сек предпочтительный_lft 604787 сек inet6 ABCD::III:JJJJ:KKKK:LLLL/64 область действия ссылка действительный_lft навсегда предпочтительный_lft навсегда
Создайте интерфейс tun0 наудаленныйсистема.
[пользователь@удаленный ~]$ sudo ip tuntap add tun0 режим tun [пользователь@удаленный ~]$ ip адрес показать 1: lo: mtu 65536 qdisc noqueue state НЕИЗВЕСТНО ссылка/обратная связь 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 область действия хоста lo действительный_lft навсегда предпочтительный_lft навсегда inet6 ::1/128 область действия хоста действительный_lft навсегда предпочтительный_lft навсегда 2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 ссылка/эфир AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 область действия глобальная динамическая eth0 действительный_lft 1785сек предпочтительный_lft 1785сек inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 область действия глобальная noprefixroute динамический действительный_lft 2591987 сек предпочтительный_lft 604787 сек inet6 ABCD::III:JJJJ:KKKK:LLLL/64 область действия ссылка действительный_lft навсегда предпочтительный_lft навсегда 3: tun0: mtu 1500 qdisc noop state DOWN qlen 500 ссылка/нет
Создайте интерфейс tun0 наместныйсистема.
[пользователь@локальный ~]$ sudo ip tuntap add tun0 режим tun [пользователь@локальный ~]$ ip адрес показать 1: lo: mtu 65536 qdisc noqueue state НЕИЗВЕСТНО ссылка/обратная связь 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 область действия хоста lo действительный_lft навсегда предпочтительный_lft навсегда inet6 ::1/128 область действия хоста действительный_lft навсегда предпочтительный_lft навсегда 2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 ссылка/эфир AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 область действия глобальная динамическая eth0 действительный_lft 1785сек предпочтительный_lft 1785сек inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 область действия глобальная noprefixroute динамический действительный_lft 2591987 сек предпочтительный_lft 604787 сек inet6 ABCD::III:JJJJ:KKKK:LLLL/64 область действия ссылка действительный_lft навсегда предпочтительный_lft навсегда 3: tun0: mtu 1500 qdisc noop state DOWN qlen 500 ссылка/нет
Назначьте IP-адрес tun0 и поднимите его:
[пользователь@локальный ~]$ sudo ip addr add 10.0.2.1/30 dev tun0 [пользователь@локальный ~]$ sudo ip link set dev tun0 up [пользователь@локальный ~]$ ip addr show tun0 3: tun0: mtu 1500 qdisc pfifo_fast state DOWN qlen 500 ссылка/нет inet 10.0.2.1/30 область действия глобальная tun0 действительный_lft навсегда предпочтительный_lft навсегда
[пользователь@удаленный ~]$ sudo ip addr add 10.0.2.2/30 dev tun0 [пользователь@удаленный ~]$ sudo ip link set dev tun0 up [пользователь@удаленный ~]$ ip addr show tun0 3: tun0: mtu 1500 qdisc pfifo_fast state DOWN qlen 500 ссылка/нет inet 10.0.2.2/30 область действия глобальная tun0 действительный_lft навсегда предпочтительный_lft навсегда
Измените sshd_config на удаленной и локальной системах, чтобы включить туннелирование:
[пользователь@удаленный ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config PermitTunnel точка-точка
[пользователь@локальный ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config PermitTunnel точка-точка
Создайте ssh-туннель:
[пользователь@локальный ~]$ sudo ssh -f -w0:0 root@удаленный true Пароль root@remote: [пользователь@локальный ~]$ ps aux | grep root@удаленный root 1851 0.0 0.0 76112 1348 ? Ss 23:12 0:00 ssh -f -w0:0 root@remote true
Проверьте ping на обоих серверах, используя новые IP-адреса:
[пользователь@локальный ~]$ ping 10.0.2.2 -c 2 PING 10.0.2.2 (10.0.2.2) 56(84) байт данных. 64 байта из 10.0.2.2: icmp_seq=1 ttl=64 время=1,68 мс 64 байта из 10.0.2.2: icmp_seq=2 ttl=64 время=0,861 мс --- 10.0.2.2 статистика пинга --- 2 пакета передано, 2 получено, 0% потерь пакетов, время 1002 мс rtt мин/средн/макс/мдев = 0,861/1,274/1,688/0,415 мс
[пользователь@удаленный ~]$ ping 10.0.2.1 -c 2 PING 10.0.2.1 (10.0.2.1) 56(84) байт данных. 64 байта из 10.0.2.1: icmp_seq=1 ttl=64 время=0,589 мс 64 байта из 10.0.2.1: icmp_seq=2 ttl=64 время=0,889 мс --- 10.0.2.1 статистика пинга --- 2 пакета передано, 2 получено, 0% потерь пакетов, время 1000 мс rtt мин/средн/макс/мдев = 0,589/0,739/0,889/0,150 мс
[пользователь@удаленный ~]$ маршрут Таблица маршрутизации IP ядра Шлюз назначения Genmask Флаги Метрическая ссылка Использование Iface шлюз по умолчанию 0.0.0.0 UG 100 0 0 eth0 10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0 AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 [пользователь@удаленный ~]$ ip route show по умолчанию через AAA.BBB.CCC.1 dev eth0 proto статическая метрика 100 10.0.2.0/30 dev tun0 proto ядро область ссылка src 10.0.2.2 AAA.BBB.CCC.0/24 dev eth0 proto ядро область ссылка src AAA.BBB.CCC.31 метрика 100
Получить IP-адреса Google:
[пользователь@локальный ~]$ nslookup google.com Сервер: сервер Адрес: сервер#53 Неавторитетный ответ: Имя: google.com Адрес: 173.194.219.101 Имя: google.com Адрес: 173.194.219.100 Имя: google.com Адрес: 173.194.219.113 Имя: google.com Адрес: 173.194.219.102 Имя: google.com Адрес: 173.194.219.139 Имя: google.com Адрес: 173.194.219.138
ВАЖНЫЙ: Я запустил команду выше в другое время и получил другой результат. Не думайте, что ваш ответ будет таким же, как мой для nslookup выше.
Поскольку все IP-адреса Google начинаются с 173.194.219, давайте направим все эти IP-адреса через локальный компьютер.
[пользователь@удаленный ~]$ sudo ip route add 173.194.219.0/24 dev tun0 [пользователь@удаленный ~]$ маршрут Таблица маршрутизации IP ядра Шлюз назначения Genmask Флаги Метрическая ссылка Использование Iface шлюз по умолчанию 0.0.0.0 UG 100 0 0 eth0 10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0 AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 173.194.219.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0 [пользователь@удаленный ~]$ ip route show по умолчанию через AAA.BBB.CCC.1 dev eth0 proto статическая метрика 100 10.0.2.0/30 dev tun0 proto ядро область ссылка src 10.0.2.2 AAA.BBB.CCC.0/24 dev eth0 proto ядро область ссылка src AAA.BBB.CCC.31 метрика 100 173.194.219.0/24 dev tun0 область действия ссылка
Включить ip_forwarding:
[пользователь@локальный ~]$ grep ip_forward /etc/sysctl.conf net.ipv4.ip_forward = 1 [user@local ~]$ sudo перезапуск сети сервиса Перезапуск сети (через systemctl): [ OK ]
Настройте захват пакетов на локальном компьютере с помощью tcpdump:
[пользователь@локальный ~]$ sudo tcpdump -nn -vv 'порт не 22' -i любой tcpdump: прослушивание любого, тип соединения LINUX_SLL (Linux cooking), размер захвата 65535 байт
Попробуйте подключиться к Google с удаленного сервера.
[пользователь@удаленный ~]$ openssl s_client -connect google.com:443 сокет: нет маршрута к хосту подключиться:errno=113
Как только команда openssl запускается на удаленном сервере, tcpdump захватывает несколько пакетов:
10.0.2.2.52768 > 173.194.219.102.443: Флаги [S], cksum 0x8702 (верно), seq 994650730, win 29200, параметры [mss 1460,sackOK,TS val 7701438 ecr 0,nop,wscale 7], длина 0 00:49:33.247753 IP (tos 0x0, ttl 64, id 46037, смещение 0, флаги [DF], proto TCP (6), длина 60) 10.0.2.2.48774 > 173.194.219.100.443: Флаги [S], cksum 0x47a7 (верно), seq 2218733674, win 29200, параметры [mss 1460,sackOK,TS val 7701439 ecr 0,nop,wscale 7], длина 0 00:49:33.247883 IP (tos 0xc0, ttl 64, id 9538, смещение 0, флаги [нет], proto ICMP (1), длина 88) 10.0.2.1 > 10.0.2.2: хост ICMP 173.194.219.100 недоступен - администратору запрещено, длина 68 IP (tos 0x0, ttl 63, id 46037, смещение 0, флаги [DF], proto TCP (6), длина 60) 10.0.2.2.48774 > 173.194.219.100.443: Флаги [S], cksum 0x47a7 (верно), seq 2218733674, win 29200, параметры [mss 1460,sackOK,TS val 7701439 ecr 0,nop,wscale 7], длина 0 00:49:33.253068 IP (tos 0x0, ttl 64, id 26282, смещение 0, флаги [DF], proto TCP (6), длина 60) 10.0.2.2.51312 > 173.194.219.101.443: Флаги [S], cksum 0x6ff8 (верно), seq 2634016105, win 29200, параметры [mss 1460,sackOK,TS val 7701443 ecr 0,nop,wscale 7], длина 0 00:49:33.254771 IP (tos 0xc0, ttl 64, id 9539, смещение 0, флаги [нет], proto ICMP (1), длина 88) 10.0.2.1 > 10.0.2.2: хост ICMP 173.194.219.101 недоступен - администратор запрещен, длина 68 IP (tos 0x0, ttl 63, id 26282, смещение 0, флаги [DF], proto TCP (6), длина 60) 10.0.2.2.51312 > 173.194.219.101.443: Флаги [S], cksum 0x6ff8 (верно), seq 2634016105, win 29200, параметры [mss 1460,sackOK,TS val 7701443 ecr 0,nop,wscale 7], длина 0 00:49:33.258805 IP (tos 0x0, ttl 64, id 9293, смещение 0, флаги [DF], proto TCP (6), длина 60) 10.0.2.2.33686 > 173.194.219.139.443: Флаги [S], cksum 0x542b (верно), seq 995927943, win 29200, параметры [mss 1460,sackOK,TS val 7701450 ecr 0,nop,wscale 7], длина 0 00:49:33.258845 IP (tos 0xc0, ttl 64, id 9540, смещение 0, флаги [нет], proto ICMP (1), длина 88) 10.0.2.1 > 10.0.2.2: хост ICMP 173.194.219.139 недоступен - администратору запрещено, длина 68 IP (tos 0x0, ttl 63, id 9293, смещение 0, флаги [DF], proto TCP (6), длина 60) 10.0.2.2.33686 > 173.194.219.139.443: Флаги [S], cksum 0x542b (верно), seq 995927943, win 29200, параметры [mss 1460,sackOK,TS val 7701450 ecr 0,nop,wscale 7], длина 0 ^С 13 пакетов захвачено 13 пакетов получено фильтром 0 пакетов отброшено ядром
Пакеты, захваченные с помощью tcpdump, предполагают, что делается попытка установить соединение (отправляются пакеты синхронизации), но ничего не получено. Также есть сообщение, 10.0.2.1 > 10.0.2.2: ICMP host 173.194.219.139 unreachable - admin prohibited, length 68
которое, похоже, предполагает проблему.
Есть ли предложения, как обойти эту проблему? Есть ли правила iptable, которые нужно добавить? Есть ли проблемы с брандмауэром (firewall-d?).
Примечание №1
Вывод iptables-save:
[пользователь@локальный ~]$ sudo iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j МАСКАРАД -o eth0 [пользователь@локальный ~]$ sudo iptables-save # Сгенерировано iptables-save v1.4.21 в субботу, 15 апреля 01:40:57 2017 г. *нат :ПРЕДВАРИТЕЛЬНЫЙ ПЕРЕХОД ПРИНЯТ [35:8926] :ВХОД ПРИНЯТ [1:84] :ВЫХОД ПРИНЯТ [6:439] :ПОСТРАСПИСАНИЕ ПРИНЯТЬ [6:439] :OUTPUT_direct - [0:0] :ЗОНЫ_ПОСТРАСПОЛОЖЕНИЯ - [0:0] :POSTROUTING_ZONES_SOURCE - [0:0] :POSTROUTING_direct - [0:0] :POST_public - [0:0] :POST_public_allow - [0:0] :POST_public_deny - [0:0] :POST_public_log - [0:0] :ЗОНЫ_ПРЕДВАРИТЕЛЬНОГО_ВЫХОДА - [0:0] :PREROUTING_ZONES_SOURCE - [0:0] :PREROUTING_direct - [0:0] :PRE_public - [0:0] :PRE_public_allow - [0:0] :PRE_public_deny - [0:0] :PRE_public_log - [0:0] -A ПРЕДВАРИТЕЛЬНАЯ ПЕРЕДАЧА -j ПРЕДВАРИТЕЛЬНАЯ ПЕРЕДАЧА_ПРЯМАЯ -A ПРЕДВАРИТЕЛЬНАЯ_ПЕРЕДАЧА -j PREROUTING_ZONES_SOURCE -A ПРЕДВАРИТЕЛЬНАЯ_ПЕРЕДАЧА -j ПРЕДВАРИТЕЛЬНЫЕ_ЗОНЫ_ПЕРЕДАЧИ -A ВЫХОД -j ВЫХОД_прямой -A POSTROUTING -j POSTROUTING_direct -A POSTROUTING -j POSTROUTING_ZONES_SOURCE -A POSTROUTING -j POSTROUTING_ZONES -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.0/30 -j МАСКАРАД -A ЗОНЫ_ПОСТА_ВЫБОРА -o eth0 -g POST_public -A ЗОНЫ_ПОСТА_РАСПОЛОЖЕНИЯ -g POST_public -A POST_public -j POST_public_log -A POST_public -j POST_public_deny -A POST_public -j POST_public_allow -A ПРЕДВАРИТЕЛЬНЫЕ_ЗОНЫ_ВЫХОДА -i eth0 -g ПРЕДВАРИТЕЛЬНЫЕ_ОБЩЕСТВЕННЫЕ -A ПРЕДВАРИТЕЛЬНЫЕ_ЗОНЫ_ВЫХОДА -g ПРЕДВАРИТЕЛЬНЫЕ_ОБЩЕСТВЕННЫЕ -A PRE_public -j PRE_public_log -A PRE_public -j PRE_public_deny -A PRE_public -j PRE_public_allow СОВЕРШИТЬ # Завершено в субботу, 15 апреля 01:40:57 2017 г. # Сгенерировано iptables-save v1.4.21 в субботу, 15 апреля 01:40:57 2017 г. *калечить :ПРЕДВАРИТЕЛЬНЫЙ ПЕРЕХОД ПРИНЯТ [169:18687] :ВВОД ПРИНЯТ [144:11583] :ПЕРЕДАТЬ ПРИНЯТЬ [0:0] :ВЫХОД ПРИНЯТ [80:8149] :ПОСТРАСПИСАНИЕ ПРИНЯТО [80:8149] :FORWARD_direct - [0:0] :INPUT_direct - [0:0] :OUTPUT_direct - [0:0] :POSTROUTING_direct - [0:0] :ЗОНЫ_ПРЕДВАРИТЕЛЬНОГО_ВЫХОДА - [0:0] :PREROUTING_ZONES_SOURCE - [0:0] :PREROUTING_direct - [0:0] :PRE_public - [0:0] :PRE_public_allow - [0:0] :PRE_public_deny - [0:0] :PRE_public_log - [0:0] -A ПРЕДВАРИТЕЛЬНАЯ ПЕРЕДАЧА -j ПРЕДВАРИТЕЛЬНАЯ ПЕРЕДАЧА_ПРЯМАЯ -A ПРЕДВАРИТЕЛЬНАЯ_ПЕРЕДАЧА -j PREROUTING_ZONES_SOURCE -A ПРЕДВАРИТЕЛЬНАЯ_ПЕРЕДАЧА -j ПРЕДВАРИТЕЛЬНЫЕ_ЗОНЫ_ПЕРЕДАЧИ -A ВХОД -j ВХОД_прямой -A ПЕРЕСЫЛКА -j ПЕРЕСЫЛКА_прямая -A ВЫХОД -j ВЫХОД_прямой -A POSTROUTING -j POSTROUTING_direct -A ПРЕДВАРИТЕЛЬНЫЕ_ЗОНЫ_ВЫХОДА -i eth0 -g ПРЕДВАРИТЕЛЬНЫЕ_ОБЩЕСТВЕННЫЕ -A ПРЕДВАРИТЕЛЬНЫЕ_ЗОНЫ_ВЫХОДА -g ПРЕДВАРИТЕЛЬНЫЕ_ОБЩЕСТВЕННЫЕ -A PRE_public -j PRE_public_log -A PRE_public -j PRE_public_deny -A PRE_public -j PRE_public_allow СОВЕРШИТЬ # Завершено в субботу, 15 апреля 01:40:57 2017 г. # Сгенерировано iptables-save v1.4.21 в субботу, 15 апреля 01:40:57 2017 г. *безопасность :ВВОД ПРИНЯТ [2197:163931] :ПЕРЕДАТЬ ПРИНЯТЬ [0:0] :ВЫХОД ПРИНЯТ [1229:185742] :FORWARD_direct - [0:0] :INPUT_direct - [0:0] :OUTPUT_direct - [0:0] -A ВХОД -j ВХОД_прямой -A ПЕРЕСЫЛКА -j ПЕРЕСЫЛКА_прямая -A ВЫХОД -j ВЫХОД_прямой СОВЕРШИТЬ # Завершено в субботу, 15 апреля 01:40:57 2017 г. # Сгенерировано iptables-save v1.4.21 в субботу, 15 апреля 01:40:57 2017 г. *сырой :ПРЕДВАРИТЕЛЬНЫЙ ПЕРЕХОД ПРИНЯТ [2362:184437] :ВЫХОД ПРИНЯТ [1229:185742] :OUTPUT_direct - [0:0] :PREROUTING_direct - [0:0] -A ПРЕДВАРИТЕЛЬНАЯ ПЕРЕДАЧА -j ПРЕДВАРИТЕЛЬНАЯ ПЕРЕДАЧА_ПРЯМАЯ -A ВЫХОД -j ВЫХОД_прямой СОВЕРШИТЬ # Завершено в субботу, 15 апреля 01:40:57 2017 г. # Сгенерировано iptables-save v1.4.21 в субботу, 15 апреля 01:40:57 2017 г. *фильтр :ВВОД ПРИНЯТ [0:0] :ПЕРЕДАТЬ ПРИНЯТЬ [0:0] :ВЫХОД ПРИНЯТ [80:8149] :FORWARD_IN_ZONES - [0:0] :FORWARD_IN_ZONES_SOURCE - [0:0] :FORWARD_OUT_ZONES - [0:0] :FORWARD_OUT_ZONES_SOURCE - [0:0] :FORWARD_direct - [0:0] :FWDI_public - [0:0] :FWDI_public_allow - [0:0] :FWDI_public_deny - [0:0] :FWDI_public_log - [0:0] :FWDO_public - [0:0] :FWDO_public_allow - [0:0] :FWDO_public_deny - [0:0] :FWDO_public_log - [0:0] :ЗОНЫ_ВХОДА - [0:0] :INPUT_ZONES_SOURCE - [0:0] :INPUT_direct - [0:0] :IN_public - [0:0] :IN_public_allow - [0:0] :IN_public_deny - [0:0] :IN_public_log - [0:0] :OUTPUT_direct - [0:0] -A ВХОД -m conntrack --ctstate СВЯЗАННЫЕ,УСТАНОВЛЕННЫЕ -j ПРИНЯТЬ -A ВХОД -i lo -j ПРИНЯТЬ -A ВХОД -j ВХОД_прямой -A ВХОД -j ИСТОЧНИК_ЗОН_ВХОДА -A ВХОД -j ЗОНЫ_ВХОДА -A ВХОД -m conntrack --ctstate НЕВЕРНЫЙ -j ОТКАЗ -A ВХОД -j ОТКЛОНИТЬ --reject-with icmp-host-prohibited -A ПЕРЕСЫЛКА -m conntrack --ctstate СВЯЗАННЫЕ,УСТАНОВЛЕННЫЕ -j ПРИНЯТЬ -A ПЕРЕСЛАТЬ -i lo -j ПРИНЯТЬ -A ПЕРЕСЫЛКА -j ПЕРЕСЫЛКА_прямая -A ПЕРЕСЫЛКА -j ПЕРЕСЫЛКА_В_ЗОНАХ_ИСТОЧНИК -A ВПЕРЕД -j ВПЕРЕД_В_ЗОНЫ -A ПЕРЕСЫЛКА -j ПЕРЕСЫЛКА_ВНЕ_ЗОН_ИСТОЧНИК -A ВПЕРЕД -j ВНЕШНИЕ_ЗОНЫ_ПЕРЕД -A ПЕРЕСЫЛКА -m conntrack --ctstate НЕВЕРНЫЙ -j ОТБРОС -A ПЕРЕСЫЛКА -j ОТКЛОНИТЬ --reject-with icmp-host-prohibited -A ВЫХОД -j ВЫХОД_прямой -A ПЕРЕНАПРАВЛЕНИЕ_В_ЗОНЫ -i eth0 -g FWDI_public -A ПЕРЕНАПРАВИТЬ_В_ЗОНЫ -g FWDI_public -A FORWARD_OUT_ZONES -o eth0 -g FWDO_public -A FORWARD_OUT_ZONES -g FWDO_public -A FWDI_public -j FWDI_public_log -A FWDI_public -j FWDI_public_deny -A FWDI_public -j FWDI_public_allow -A FWDI_public -p icmp -j ПРИНЯТЬ -A FWDO_public -j FWDO_public_log -A FWDO_public -j FWDO_public_deny -A FWDO_public -j FWDO_public_allow -A ВХОДНЫЕ_ЗОНЫ -i eth0 -g IN_public -A ЗОНЫ_ВХОДА -g ВХОД_публичный -A IN_public -j IN_public_log -A IN_public -j IN_public_deny -A IN_public -j IN_public_allow -A IN_public -p icmp -j ПРИНЯТЬ -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate НОВЫЙ -j ПРИНЯТЬ СОВЕРШИТЬ # Завершено в субботу, 15 апреля 01:40:57 2017 г.
Заметка 2:
Я настроил веб-сервер Apache на отдельном хосте, к которому имеет доступ только локальный сервер. Я запустил tcpdump на веб-сервере, прослушивающем порт 80. При запуске
telnet webserver 80
я захватываю следующие пакеты. Это ожидаемое поведение, поскольку установлено TCP-соединение (S, S-Ack, Ack).
[пользователь@вебсервер ~]$ sudo tcpdump -nn -vv 'порт не 22, а 80' -i eth0 tcpdump: прослушивание на eth0, тип соединения EN10MB (Ethernet), размер захвата 65535 байт 07:17:30.411474 IP (tos 0x10, ttl 64, id 34376, смещение 0, флаги [DF], proto TCP (6), длина 60) local.server.46710 > web.server.80: Флаги [S], cksum 0x8412 (неверно -> 0x6d96), seq 3018586542, win 29200, параметры [mss 1460,sackOK,TS val 3047398 ecr 0,nop,wscale 7], длина 0 07:17:30.411557 IP (tos 0x0, ttl 64, id 0, смещение 0, флаги [DF], proto TCP (6), длина 60) web.server.80 > local.server.46710: Флаги [S.], cksum 0x8412 (неверно -> 0x9114), seq 2651711943, ack 3018586543, win 28960, параметры [mss 1460,sackOK,TS val 37704524 ecr 3047398,nop,wscale 7], длина 0 07:17:30.411725 IP (tos 0x10, ttl 64, id 34377, смещение 0, флаги [DF], proto TCP (6), длина 52) local.server.46710 > web.server.80: Флаги [.], cksum 0x840a (неверно -> 0x301c), seq 1, ack 1, win 229, параметры [nop,nop,TS val 3047398 ecr 37704524], длина 0
Когда я пытаюсь подключиться к веб-серверу с удаленного сервера через локальный сервер, tcpdump на веб-сервере не захватывает никаких пакетов (даже начальный Sync), но локальный сервер захватывает пакет Sync, отправляемый на веб-сервер (см. ниже). Это заставляет меня думать, что что-то мешает отправке пакетов на веб-сервер — возможно, неправильная конфигурация или брандмауэр.
[user@local ~]$ sudo tcpdump -nn -vv 'порт не 22 и не 80' -i любой tcpdump: прослушивание любого, тип соединения LINUX_SLL (Linux cooking), размер захвата 65535 байт 02:24:09.135842 IP (tos 0x10, ttl 64, id 38062, смещение 0, флаги [DF], proto TCP (6), длина 60) 10.0.2.2.50558 > web.server.80: Флаги [S], cksum 0x668d (верно), seq 69756226, win 29200, параметры [mss 1460,sackOK,TS val 4780524 ecr 0,nop,wscale 7], длина 0
ВАЖНЫЙ:пакеты не маршрутизируются через eth0, а вместо этого делается попытка отправить пакеты на веб-сервер через tun0 (что не удается). Я могу подтвердить это, запустив tcpdump на интерфейсе tun0:
[user@local ~]$ sudo tcpdump -nn -vv 'порт не 22, а 80' -i tun0 tcpdump: прослушивание tun0, тип соединения RAW (Raw IP), размер захвата 65535 байт 02:28:10.295972 IP (tos 0x10, ttl 64, id 46976, смещение 0, флаги [DF], proto TCP (6), длина 60) 10.0.2.2.50560 > webserver.80: Флаги [S], cksum 0xd560 (верно), seq 605366388, win 29200, параметры [mss 1460,sackOK,TS val 5021684 ecr 0,nop,wscale 7], длина 0
Заметка 3:
Я отключил firewalld на локальном компьютере, и пакеты синхронизации были получены веб-сервером.
[пользователь@локальный ~]$ sudo systemctl остановить firewalld
[пользователь@вебсервер ~]$ sudo tcpdump -nn -vv 'порт не 22, а 80' -i eth0 tcpdump: прослушивание на eth0, тип соединения EN10MB (Ethernet), размер захвата 65535 байт 08:25:17.390912 IP (tos 0x10, ttl 63, id 61767, смещение 0, флаги [DF], proto TCP (6), длина 60) 10.0.2.2.50580 > web.server.80: Флаги [S], cksum 0x30dc (верно), seq 2601927549, win 29200, параметры [mss 1460,sackOK,TS val 7123514 ecr 0,nop,wscale 7], длина 0 08:25:17.391003 IP (tos 0x0, ttl 64, id 0, смещение 0, флаги [DF], proto TCP (6), длина 60) web.server.80 > 10.0.2.2.50580: Флаги [S.], cksum 0x4e23 (неверно -> 0xa316), seq 959115533, ack 2601927550, win 28960, параметры [mss 1460,sackOK,TS val 41771503 ecr 7123514,nop,wscale 7], длина 0 08:25:17.391192 IP (tos 0x0, ttl 128, id 60032, смещение 0, флаги [нет], proto TCP (6), длина 40) 10.0.2.2.50580 > web.server.80: Флаги [R], cksum 0x7339 (верно), seq 2601927550, win 8192, длина 0 08:25:18.393794 IP (tos 0x10, ttl 63, id 61768, смещение 0, флаги [DF], proto TCP (6), длина 60) 10.0.2.2.50580 > web.server.80: Флаги [S], cksum 0x2cf1 (верно), seq 2601927549, win 29200, параметры [mss 1460,sackOK,TS val 7124517 ecr 0,nop,wscale 7], длина 0 08:25:18.393898 IP (tos 0x0, ttl 64, id 0, смещение 0, флаги [DF], proto TCP (6), длина 60) web.server.80 > 10.0.2.2.50580: Флаги [S.], cksum 0x4e23 (неверно -> 0x7e71), seq 974785773, ack 2601927550, win 28960, параметры [mss 1460,sackOK,TS val 41772506 ecr 7124517,nop,wscale 7], длина 0 08:25:18.394003 IP (tos 0x0, ttl 128, id 60033, смещение 0, флаги [нет], proto TCP (6), длина 40) 10.0.2.2.50580 > web.server.80: Флаги [R], cksum 0x566a (верно), seq 2601927550, win 8192, длина 0
Теперь ясно, что исходный IP должен быть обновлен, чтобы соответствовать IP-адресу локального сервера, прежде чем пакет будет отправлен на веб-сервер. Как предположил @xin, NAT должен быть настроен на локальном сервере.
Примечание №4:
Как только я пытаюсь подключиться к веб-серверу, я вижу, что количество пакетов для правила 9 увеличивается на 1 (как показано ниже).
[пользователь@локальный ~]$ sudo iptables -nvL --line-numbers .......... Цепочка FORWARD (политика ACCEPT 0 пакетов, 0 байт) число пакетов байт цель защита выбор вход выход источник назначение 1 0 0 ПРИНЯТЬ все -- * * 0.0.0.0/0 0.0.0.0/0 ctstate СВЯЗАННЫЕ, УСТАНОВЛЕНЫ 2 0 0 ПРИНЯТЬ все -- lo * 0.0.0.0/0 0.0.0.0/0 3 1 60 FORWARD_direct все -- * * 0.0.0.0/0 0.0.0.0/0 4 1 60 FORWARD_IN_ZONES_SOURCE все -- * * 0.0.0.0/0 0.0.0.0/0 5 1 60 FORWARD_IN_ZONES все -- * * 0.0.0.0/0 0.0.0.0/0 6 1 60 FORWARD_OUT_ZONES_SOURCE все -- * * 0.0.0.0/0 0.0.0.0/0 7 1 60 ЗОНЫ_ПЕРЕДАЧИ_ИЗ_НАЗАД все -- * * 0.0.0.0/0 0.0.0.0/0 8 0 0 ОТБРОСИТЬ все -- * * 0.0.0.0/0 0.0.0.0/0 ctstate НЕВЕРНО 9 1 60 ОТКЛОНИТЬ все -- * * 0.0.0.0/0 0.0.0.0/0 отклонить-с-icmp-хост-запрещено .......... [пользователь@локальный ~]$ sudo iptables -D ПЕРЕНАПРАВИТЬ 9
После удаления правила 9 из цепочки FORWARD (выше, как предложил @xin) я могу подключиться к веб-серверу.
[пользователь@локальный ~]$ sudo iptables -nvL --line-numbers .......... Цепочка FORWARD (политика ACCEPT 1 пакет, 60 байт) число пакетов байт цель защита выбор вход выход источник назначение 1 12 5857 ПРИНЯТЬ все -- * * 0.0.0.0/0 0.0.0.0/0 ctstate СВЯЗАННЫЕ, УСТАНОВЛЕНЫ 2 0 0 ПРИНЯТЬ все -- lo * 0.0.0.0/0 0.0.0.0/0 3 2 120 FORWARD_direct все -- * * 0.0.0.0/0 0.0.0.0/0 4 2 120 FORWARD_IN_ZONES_SOURCE все -- * * 0.0.0.0/0 0.0.0.0/0 5 2 120 FORWARD_IN_ZONES все -- * * 0.0.0.0/0 0.0.0.0/0 6 2 120 FORWARD_OUT_ZONES_SOURCE все -- * * 0.0.0.0/0 0.0.0.0/0 7 2 120 ЗОНЫ_ПЕРЕДАЧИ_ИЗ_НАЗАД все -- * * 0.0.0.0/0 0.0.0.0/0 8 0 0 ОТБРОСИТЬ все -- * * 0.0.0.0/0 0.0.0.0/0 ctstate НЕВЕРНО ..........
решение1
Исходный адрес пакетов следует заменить на один из адресов локальной машины, чтобы ответы могли быть получены локальной машиной, в противном случае нет (веской) причины отправлять эти пакеты на следующие маршрутизаторы, ответ в любом случае не может быть перехвачен. iptables MASQUERADE
и SNAT
полезны для изменения исходного адреса этих пакетов:
[user@local ~]$ iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j MASQUERADE -o eth0