Я хочу перенаправить порт A на порт B и ВНЕШНИЙ блокировать порт B.
А = 9922
В = 22
(Да, это ssh, и НЕТ, я не могу изменить его в конфигурации.)
У меня есть три интерфейса:
У меня есть такие правила:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
240 17755 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT tcp -- tun0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9922
0 0 ACCEPT tcp -- * * 127.0.0.0/8 0.0.0.0/0 tcp dpt:22
4 240 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 32 packets, 3854 bytes)
pkts bytes target prot opt in out source destination
И это для маршрутизации:
Chain PREROUTING (policy ACCEPT 1 packets, 60 bytes)
pkts bytes target prot opt in out source destination
4 240 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9922 redir ports 22
Chain INPUT (policy ACCEPT 1 packets, 60 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1 packets, 68 bytes)
pkts bytes target prot opt in out source destination
0 0 REDIRECT tcp -- * lo 0.0.0.0/0 0.0.0.0/0 tcp dpt:9922 redir ports 22
Chain POSTROUTING (policy ACCEPT 1 packets, 68 bytes)
pkts bytes target prot opt in out source destination
Это не работает.
Пока порты маршрутизации перенаправляются на localhost? Я проверял это с моим коллегой-админом (я новичок), и он тоже не мог этого узнать. Похоже, он был заблокирован где-то в beetwen после маршрутизации. Но где и почему? Не имеют ни малейшего представления о.
И да, я погуглил и попробовал все найденные мной правила.
Возможно, просто возможно, стоит упомянуть, что я использую iptables, но изначально система поставлялась с firewalld (fedora 19). Я отключил их и включил iptables.
Когда трафик достигает таблицы filter (по умолчанию), он уже был изменен таблицей nat, поэтому у вас нет информации об исходном пункте назначения (порт 9922).
Что вы можете сделать, так это отметить трафик, входящий на 9922, а затем использовать его, чтобы (запретить) его разрешить. (br0 - внешний интерфейс в этом примере)
iptables -t nat -A PREROUTING -i br0 -p tcp --dport 9922 -j MARK --set-mark 1
iptables -t nat -A PREROUTING -i br0 -p tcp --dport 9922 -j REDIRECT --to-port 22
iptables -A INPUT -i br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i br0 -p tcp --dport 22 -m conntrack --ctstate NEW -m mark --mark 1 -j ACCEPT
iptables -A INPUT -i br0 -p tcp --dport 22 -m conntrack --ctstate NEW -j DROP
редактировать
Кажется, есть другой способ добиться того же. В конце концов, Conntrack имеет доступ к исходным портам. Это делает маркировку ненужной.
iptables -t nat -A PREROUTING -i br0 -p tcp --dport 9922 -j REDIRECT --to-port 22
iptables -A INPUT -i br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i br0 -p tcp --dport 22 -m conntrack --ctstate NEW --ctorigdstport 9922 -j ACCEPT
iptables -A INPUT -i br0 -p tcp --dport 22 -m conntrack --ctstate NEW -j DROP