
У меня нет маршрутизатора, поэтому я превратил свою систему CentOS 6.4 Linux в маршрутизатор, перенаправляя трафик публичной сети в мою локальную сеть. У него есть две сетевые карты, одна для публичного IP-адреса (eth1), а другая для частного IP-адреса (eth2).
У меня есть сервер, подключенный к моей локальной сети, скажем, по адресу 192.168.1.2
.
Маршрутизатор
- eth1:
x.x.x.x
, публичный IP-адрес - eth2:
192.168.1.1
, внутренний адрес маршрутизатора
Когда кто-то из внешней сети запускает ssh на публичном IP-адресе, он должен быть перенаправлен на сервер:
ssh x.x.x.x
или используяШпатлевка
Я отключил брандмауэр SELinux и iptables на сервере. Я попробовал некоторые модификации iptables на маршрутизаторе Linux-системы, но запрос SSH по-прежнему не перенаправляется:
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 --dport 22 -j DNAT --to-destination 192.168.1.2:22
Я также хочу перенаправить весь трафик HTTP (80) на мой внутренний сервер, используя iptables с того же маршрутизатора Linux-системы.
решение1
Прежде всего убедитесь, что в ядре включена пересылка пакетов.
# echo 1 > /proc/sys/net/ipv4/ip_forward
Вы также можете сделать его постоянным, добавив следующую строку/etc/sysctl.conf
net.ipv4.ip_forward = 1
Вам нужно сделать это на Linux Machine, действующей как маршрутизатор. Вы можете попробовать следующее правило на маршрутизаторе.
iptables -t nat -A PREROUTING -i eth1 -d x.x.x.x -p tcp --dport 22 -j DNAT --to-destination 192.168.1.2:22
Также сообщите нам вывод правил NAT с маршрутизатора.
iptables -t nat -L -n -v
решение2
На основе этого удивительногоDigitalOceanРуководство пользователя о том, как перенаправлять порты, я решил переписать его здесь.
Я потратил много часов на изучение того, как это работает. Я новичок в Linux, и начинать не всегда легко. Вот пример моих серверов и переадресации портов:
Сервер брандмауэра (2 сетевые карты) — сведения о сети:
- Публичный IP-адрес:хх.хх.хх.хх
- Частный IP-адрес:гг.гг.гг.гг
- Публичный интерфейс:eth0
- Частный интерфейс:eth1
Внутренний(например, ssh, web) сервер (1 сетевая карта) - сетевые данные:
- Частный IP-адрес:зз.зз.зз.зз
- Частный интерфейс:eth0
Решение:
Включить пересылку пакетов в ядре:
echo 1 > /proc/sys/net/ipv4/ip_forward
Определите переменные:
# Admin IP address (e.g. public home ip)
ADMIN="aa.aa.aa.aa"
# IP addresses of servers (e.g. in cloud):
FW_eth0_ip="xx.xx.xx.xx"
FW_eth1_ip="yy.yy.yy.yy"
WEB_eth0_ip="zz.zz.zz.zz"
# Services:
SSH="22"
HTTP="80"
Переадресация портов Iptables (с -m conntrack):
iptables -t nat -A PREROUTING -i eth0 -s $ADMIN -d $FW_eth0_ip -p tcp --dport $SSH -j DNAT --to-destination $WEB_eth0_ip
iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport $SSH -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport $SSH -d $WEB_eth0_ip -j SNAT --to-source $FW_eth1_ip
Несколько заметок:
- "..-s $ADMIN -d $FW_eth0_ip.." (1-я строка) - добавлено только из соображений безопасности - это означает, что только IP-адрес АДМИНИСТРАТОРА может получить доступ к SSH (если не нужен, можно удалить)
- -m conntrackтакой же как-m состояние
- Я рекомендую изменить порт SSH по умолчанию на другой порт, например 1xxxx (в /etc/ssh/sshd_config)
- проверятьСписок номеров портов TCP и UDP
- Я использую порт 15xx1 для доступа по SSH на сервере брандмауэра, а порт 15xxx2 — внутренний
Терминал:
# access firewall server
$ ssh [email protected] -p 15xx1
# access internal server
$ ssh [email protected] -p 15xx2
Более подробно об используемых правилах подробно описано в указанном руководстве.
На этом у меня все, надеюсь, это вам поможет.
решение3
Хотя этот вопрос касается iptables, если у вас также запущен FirewallD, вот как получить доступ к HTTP внутренней сети.
Сначала разрешите http-трафик на вашем внутреннем сервере FirewallD:
# firewall-cmd --permanent --add-service=http
Затем перенаправьте http-трафик с внешнего IP-адреса на порт 80 внутреннего IP-адреса:
# firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=10.0.0.11
То же самое можно сделать и для службы SSH.
решение4
Прежде всего, включите маршрутизацию в шлюзе Linux:
echo 1 > /proc/sys/net/ipv4/ip_forward
Затем добавьте следующие правила с вашим сетевым интерфейсом (например, eth1) и желаемыми портами:
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.2
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 22 -j DNAT --to 192.168.1.2
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Проверьте свои правила с помощью iptables -L -v
, столбцы pkts и bytes покажут вам, какие правила сопоставляются.