Я использую CentOS 6.4 с OpenVZ на своем ноутбуке. Чтобы обеспечить доступ в Интернет для виртуальных машин, я должен применить на ноутбуке следующее правило:
iptables -t nat -A POSTROUTING -j SNAT --to-source <LAPTOP_IP>
Работает нормально.
Тем не менее, мне приходится работать в разных местах - в офисе, дома, в офисе партнера и т. Д. IP моего ноутбука в этих местах отличается, поэтому мне приходится менять приведенное выше правило каждый раз, когда я меняю место.
Я создал обходной путь, который в основном определяет IP и применяет правило:
#!/bin/bash
IP=$(ifconfig | awk -F':' '/inet addr/&&!/127.0.0.1/{split($2,_," ");print _[1]}')
iptables -t nat -A POSTROUTING -j SNAT --to-source $IP
Обходной путь выше работает. Мне осталось только выполнить это вручную. Возможно, я мог бы заставить его запускаться всякий раз, когда мой ноутбук получает IP-адрес от DHCP - как я могу это сделать?
Кроме того, мне просто интересно, есть ли в первую очередь элегантный способ сделать это - iptables? Может быть, есть синтаксис, позволяющий указать в правиле "текущий IP-адрес оборудования"?
Использовать -j MASQUERADE
(взято из Документы CentOS):
Чтобы разрешить узлам LAN с частными IP-адресами взаимодействовать с внешними общедоступными сетями, настройте брандмауэр для маскировки IP, который маскирует запросы от узлов LAN IP-адресом внешнего устройства брандмауэра (в данном случае
eth0
):[root@myServer ~ ] # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Это правило использует таблицу соответствия пакетов NAT (
-t nat
) и указывает встроенныйPOSTROUTING
цепочка для NAT (-A POSTROUTING
) на внешнем сетевом устройстве брандмауэра (-o eth0
).
POSTROUTING
позволяет изменять пакеты, когда они покидают внешнее устройство брандмауэра.В
-j MASQUERADE
target указывается для маскировки частного IP-адреса узла внешним IP-адресом межсетевого экрана / шлюза.
Он был предназначен для аплинков, у которых нет статических IP-адресов.