iptables еквівалентні для mac os x


55

Я хочу переслати запити від 192.168.99.100:80до 127.0.0.1:8000. Ось як я це робив би в Linux, використовуючи iptables:

iptables -t nat -A OUTPUT -p tcp --dport 80 -d 192.168.99.100 -j DNAT --to-destination 127.0.0.1:8000

Як зробити те ж саме в MacOS X? Я випробував комбінацію ipfwкоманд без особливого успіху:

ipfw add fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(Успіх для мене - вказівка ​​браузера http://192.168.99.100і отримання відповіді від сервера розробки, на якому я працюю localhost:8000)


Ми говоримо про клієнта OSX або сервера?
Скотт Пак

1
Це сніговий леопард.
nafe

Чи є якась причина, що ви не можете просто налаштувати веб-сервер і слухати на 192.168.99.100:80?
Зоредаче

1
@Zoredache Прослуховування порту 80 потребує sudo, а деякі веб-сервери не скидають привілеїв досить швидко, щоб безпечно запускати їх із судо.
Навін

Відповіді:


33

Так я дізнався , що є спосіб зробити це. Я не впевнений, чи це найкращий спосіб, але він працює! У вашій улюбленій оболонці:

sudo ifconfig lo0 10.0.0.1 alias
sudo ipfw add fwd 127.0.0.1,9090 tcp from me to 10.0.0.1 dst-port 80

(Псевдонім, lo0здається, відсутня частина)

Якщо ви хочете, щоб (підроблений) домен вказав на цей новий псевдонім, переконайтеся, що / etc / hosts містить рядок:

10.0.0.1 www.your-domain.com

4
ipfw не працюватиме на Yosemite (MAC) і, здається, щось застаріло
Vadorequest

25

Мені вдалося це зробити за допомогою команд ifconfigі pfctlна Mac 10.10.2. При наступному підході я успішно картографування 127.0.0.1:3000до mydomain.comлокально на моїй машині.

У свій командний рядок введіть дві наступні команди, щоб переадресувати з'єднання 127.0.0.1:3000на 10.0.0.1:

sudo ifconfig lo0 10.0.0.1 alias
echo "rdr pass on lo0 inet proto tcp from any to 10.0.0.1 port 80 -> 127.0.0.1 port 3000" | sudo pfctl -ef -

Потім відредагуйте свій файл /etc/hostsабо /private/etc/hostsфайл і додайте наступний рядок, щоб відобразити ваш домен 10.0.0.1.

10.0.0.1 mydomain.com

Після збереження файлу хостів промийте локальний DNS:

sudo discoveryutil udnsflushcaches

Тепер відкрийте mydomain.comу браузері, і ви побачите сервер, розміщений на вашому порту localhost (тобто 127.0.0.1:3000). В основному цей процес відображає <ip>:<port>нове, <ip>щоб потім можна було зіставити хост із цією IP-адресою.


1
Тільки тад хакі, але роботу виконує. Гарне шоу.
Joey Carson

6
Дякую. Як би ви скасували псевдонім та переадресацію?
Карлос Нуньєс

1
Привіт sudo discoveryutil udnsflushcachesдає мені, command not foundале він все ще відповідає запису правильно. Але як я можу зіставити другий порт? Я намагався зробити кроки 1 + 2 з id: 10.0.0.2та іншим портом, але це завжди займає лише останнє з'єднання. Так що якщо я останній 10.0.0.1& port 3000він вперед 3000, якщо я останній 10.0.0.2і порту 4000його вперед 4000. В моїй /private/etc/hostsмові я написав обидві записи із різним ідентифікатором.
Andi Giga

Працює, але мені потрібно це знову, коли я перезавантажую OSX .... Будь-яка річ, щоб зберегти це назавжди?
Каспер

1
Будь ласка, оновіть:sudo dscacheutil -flushcache
Northtree

5

Нещодавно мені теж довелося зробити подібне, і в пошуках натрапив на цю відповідь. На жаль, відповідь Nafe використовує, ipfwяка зараз застаріла і недоступна в OSX; а відповідь Кевіна Лірі насправді трохи шахрайська. Тому я повинен був зробити щось краще (чистіше) і вирішив поділитися тут для нащадків. Ця відповідь багато в чому ґрунтується на підході, згаданому в цій суті .

Як зазначає ОП, вказівник браузера на 192.168.99.100 повинен отримати відповідь від сервера в localhost: 8000. Додавання псевдоніму ifconfigнасправді не є необхідним, pfctlодне достатньо: щоб досягти цього, pf.confфайл /etc/pf.confпотрібно змінювати.

Спочатку ми створюємо (з Судо) новим якірним файлом (назвемо його redirection) по адресою: /etc/pf.anchors/redirection. В основному це звичайний текстовий файл і містить наступний рядок (так само , як у відповідь Кевін Лірі): rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000. Після створення нового файлу прив’язки до нього потрібно посилатися у pf.confфайлі. Відкрийте pf.confфайл з sudo та додайте rdr-anchor "redirection"після останнього рядка rdr-anchor (який є rdr-anchor "com.apple/*") та додайте load anchor "redirection" from "/etc/pf.anchors/redirection"в кінці.

Зрештою, так має виглядати файл pf.conf:

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr-anchor "redirection"  #added for redirection/port forwarding
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "pow" from "/etc/pf.anchors/redirection"  #added for redirection/port forwarding

І це майже все. Просто перезапустіть pfctl, видавши, sudo pfctl -dщоб спочатку його відключити, а потім sudo pfctl -fe /etc/pf.confзнову запустити.

Тепер, якщо вам потрібно це зробити автоматично після кожного перезавантаження, потрібно виконати ще одну крихітну роботу: демонстрація запуску для pfctlпотреб має бути оновлена ​​(посилальна суть зазначає, що pf увімкнено автоматично під час завантаження, однак, схоже, це не буде випадок від перегляду коду). Відкрийте (з судо) System/Library/LaunchDaemons/com.apple.pfctl.plistі шукайте це:

<array>
          <string>pfctl</string>
          <string>-f</string>
          <string>/etc/pf.conf</string>
</array>

і додайте рядок, <string>-e</string>щоб в кінцевому рахунку зробити так:

<array>
         <string>pfctl</string>
         <string>-e</string>
         <string>-f</string>
         <string>/etc/pf.conf</string>
</array>

Це повинно це робити.

Caveat : Apple більше не дозволяє змінювати файли демон-версії просто так (ні з судо, ні з chmod, ні з чим іншим). Тільки шлях повозитися з системою захисту від цілісності налаштувань: завантажитися в режимі відновлення і запуску терміналу. Перевірте статус SIP за допомогою csrutil status, він, як правило, повинен бути включений. Відключіть його csrutil disableта перезавантажте в звичайному режимі, а потім внесіть зміни до файлу плістів, як обговорювалося вище. Після завершення поверніться до режиму відновлення та повторно увімкніть захист (він діє з поважних причин), видавши csrutil enable.

Пояснення: Ви можете перевірити, видавши ifconfigкоманду, яка 127.0.0.1вже є (за замовчуванням) псевдонімом localhost lo0 - цей факт використовується, щоб уникнути необхідності додавати додатковий псевдонім для localhost і просто використовувати адресу за замовчуванням у pf.confфайлі.

ОНОВЛЕННЯ: На жаль, здається, що завантаження файлу при запуску не працює. Я все ще намагаюся отримати допомогу, щоб її сортувати. До цього часу біг sudo pfctl -f /etc/pf.confпісля запуску робить трюк.


Дякую за це, це працювало для мене в OS X Sierra. Дуже важливо, хоча файл перенаправлення закінчується новим рядком.
кадріан

Не здається безпечним перезаписати системні файли типу System/Library/LaunchDaemons/com.apple.pfctl.plist; це, ймовірно, не переживе оновлення ОС?
Том

4

Це добре працювало для мене:


1

Починаючи з 10.5, OS X оснащується новим, орієнтованим на додатки, брандмауером замість ipfw. Але ipfw все одно встановлений. Якщо у вас виникли проблеми з його синтаксисом, перегляньте графічні фронти, як WaterRoofабо Flying Buttress.

HTH, PEra


1

Порядок правил важливий, переконайтеся, що перед вашими правилами дозволу немає "заперечувати всім" або щось подібне.


Дякую за пораду, але я не думаю, що у мене є саме ця проблема (ipfw список показує лише моє правило і 65535 allow ip from any to any).
nafe

1

Здається, у вашій команді відсутній номер правила; спробуйте:

ipfw add 100 fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(якщо ви не запущено як root, вам доведеться приєднати його до sudo). Ще одна річ, щоб перевірити, що брандмауер увімкнено:

sysctl net.inet.ip.fw.enable

Якщо він повертається зі значенням 0 (вимкнено), увімкніть його за допомогою:

sysctl -w sysctl net.inet.ip.fw.enable=1

... а потім домовіться його відновити під час перезавантаження комп'ютера. "Правильний" спосіб зробити це, ймовірно, створити запущений елемент ( Lingon робить це досить просто). Або просто скористайтеся одним із згаданих інструментів GUI, який PEra згадує, і дозвольте йому подбати про деталі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.