У меня есть маршрутизатор, на котором установлена система Linux.
Я хочу, чтобы мой маршрутизатор поддерживал NAT-прикрепление
Есть ли такая функция в ядре Linux? Если да, то как ее активировать? Есть ли патч, чтобы применить ее к моему ядру для поддержки привязки?
Объяснение шпильки из Википедии:
Let us consider a private network with the following:
Gateway address: 192.168.0.1
Host 1: 192.168.0.5
Host 2: 192.168.0.7
The gateway has an external IP : 192.0.2.1
Host 1 runs a P2P application P1 on its port 12345 which is externally mapped to 4444.
Host 2 runs a P2P application P2 on its port 12345 which is externally mapped to 5555.
If the NAT device supports hairpinning, then P1 application can connect to the P2 application using the external endpoint 192.0.2.1:5555.
If not, the communication will not work.
решение1
Это то, что iptables
прекрасно работает с «новым» ядром (все, что после2.4, то есть старше 10 лет).
Хитрость заключается в том, чтобы выполнить «обратный NAT»: сопоставить IP-адрес любого хоста из вашей локальной сети, который обращается к двум серверам, преобразованным через NAT, с публичным IP-адресом вашего шлюза.
Что-то вроде следующего (этотолькочто правила NAT, без брандмауэра):
iptables -t nat -A PREROUTING -p tcp -m tcp -s 192.168.0.0/24 -d 192.168.0.5 --dport 4444 -j DNAT --to-destination :12345
iptables -t nat -A POSTROUTING -o eth1 -p tcp -m tcp -s 192.168.0.0/24 --dport 12345 -j SNAT --to-source 192.10.2.1
iptables -t nat -A PREROUTING -p tcp -m tcp -s 192.168.0.0/24 -d 192.168.0.7 --dport 5555 -j DNAT --to-destination :12345
iptables -t nat -A POSTROUTING -o eth1 -p tcp -m tcp -s 192.168.0.0/24 --dport 12345 -j SNAT --to-source 192.10.2.1
iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.0.1 --dport 4444 -j DNAT --to-destination 192.168.0.5:12345
iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.0.1 --dport 5555 -j DNAT --to-destination 192.168.0.7:12345
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.0.1
Если вы не знакомы с тайным искусством написания правил брандмауэра, я предлагаю использовать графический интерфейс, напримерfwbuilder.