iptables tương đương với mac os x


55

Tôi muốn chuyển tiếp yêu cầu từ 192.168.99.100:80đến 127.0.0.1:8000. Đây là cách tôi làm trong linux bằng cách sử dụng iptables:

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

Làm cách nào để thực hiện điều tương tự trong MacOS X? Tôi đã thử kết hợp các ipfwlệnh mà không có nhiều thành công:

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

(Thành công đối với tôi là trỏ trình duyệt vào http://192.168.99.100và nhận phản hồi từ máy chủ phát triển mà tôi đang chạy localhost:8000)


Chúng ta đang nói OSX Client hay Server?
Scott Pack

1
Đó là báo tuyết.
an toàn

Có một số lý do bạn không thể chỉ định cấu hình máy chủ web của mình để nghe trên 192.168.99.100:80?
Zoredache

1
@Zoredache Nghe trên cổng 80 cần sudo và một số máy chủ web không bỏ đặc quyền đủ nhanh để chạy chúng với sudo một cách an toàn.
Navin

Câu trả lời:


33

Vì vậy, tôi tìm ra một cách để làm điều này. Tôi không chắc đó là cách ưa thích nhưng nó hoạt động! Tại vỏ yêu thích của bạn:

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

(Bí danh lo0dường như là phần còn thiếu)

Nếu bạn muốn một tên miền (giả) để trỏ đến bí danh mới này thì hãy đảm bảo / etc / hosts chứa dòng:

10.0.0.1 www.your-domain.com

4
ipfw sẽ không hoạt động trên Yosemite (MAC) và có vẻ không được chấp nhận
Vadorequest

25

Tôi đã có thể làm việc này bằng cách sử dụng các lệnh ifconfigpfctltrên Mac 10.10.2. Với phương pháp sau đây tôi đang lập bản đồ thành công 127.0.0.1:3000đến mydomain.comcục bộ trên máy tính của tôi.

Trong dòng lệnh của bạn, nhập hai lệnh sau để chuyển tiếp kết nối 127.0.0.1:3000tới 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 -

Sau đó chỉnh sửa /etc/hostshoặc /private/etc/hoststệp của bạn và thêm dòng sau để ánh xạ tên miền của bạn 10.0.0.1.

10.0.0.1 mydomain.com

Sau khi bạn lưu tệp máy chủ, hãy xóa DNS cục bộ của bạn:

sudo discoveryutil udnsflushcaches

Bây giờ hãy mở mydomain.comtrong một trình duyệt và bạn sẽ thấy máy chủ được lưu trữ trên cổng localhost của bạn (tức là 127.0.0.1:3000). Về cơ bản quá trình này ánh xạ <ip>:<port>tới một cái mới <ip>để sau đó bạn có thể ánh xạ một máy chủ IP đó.


1
Chỉ là một chút hacky, nhưng hoàn thành công việc. Chương trinh hay.
Joey Carson

6
Cảm ơn bạn. Làm thế nào bạn sẽ hoàn tác bí danh và chuyển tiếp?
Carlos Nuñez

1
Hi sudo discoveryutil udnsflushcachescho tôi command not foundnhưng nó vẫn phù hợp với mục chính xác. Nhưng làm thế nào tôi có thể lập bản đồ một cổng thứ hai? Tôi đã thử thực hiện các bước 1 + 2 với id: 10.0.0.2và một cổng khác, nhưng nó luôn chỉ mất kết nối cuối cùng. Vì vậy, nếu tôi làm cuối cùng 10.0.0.1port 3000chuyển tiếp 3000, nếu tôi làm cuối cùng 10.0.0.24000chuyển tiếp nó 4000. Trong tôi /private/etc/hostsđã viết cả hai mục với id (theo) khác nhau.
Andi Giga

Hoạt động, nhưng tôi cần phải làm lại khi tôi khởi động lại OSX .... Có điều gì để lưu cái này vĩnh viễn không?
Kasper

1
Vui lòng cập nhật vớisudo dscacheutil -flushcache
Northtree

5

Tôi cũng đã phải làm một điều tương tự gần đây, và trong khi tìm kiếm câu trả lời này. Thật không may, câu trả lời về việc sử dụng Nafe ipfwhiện không được chấp nhận và không có sẵn trong OSX; và câu trả lời của Kevin Leary thực sự là một chút hackish. Vì vậy, tôi đã phải làm một cái gì đó tốt hơn (sạch hơn) và quyết định chia sẻ nó ở đây cho hậu thế. Câu trả lời này phần lớn dựa trên cách tiếp cận được đề cập tại ý chính này .

Như OP đề cập, việc chỉ một trình duyệt ở 192.168.99.100 sẽ nhận được phản hồi từ máy chủ tại localhost: 8000. Thêm một bí danh ifconfiglà không thực sự cần thiết, pfctlmột mình là đủ: để đạt được điều này, pf.conftập tin /etc/pf.confcần phải được sửa đổi.

Đầu tiên chúng ta tạo (với sudo) một tệp neo mới (hãy gọi nó redirection) tại : /etc/pf.anchors/redirection. Đây về cơ bản là một tệp văn bản thông thường và chứa dòng sau (giống như trong câu trả lời của Kevin Leary) : rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000. Khi tệp neo mới đã được tạo, nó cần được tham chiếu trong pf.conftệp. Mở pf.conftệp bằng sudo và thêm rdr-anchor "redirection"vào sau dòng neor cuối cùng (đó là rdr-anchor "com.apple/*") và thêm load anchor "redirection" from "/etc/pf.anchors/redirection"vào cuối.

Cuối cùng, đây là tệp pf.conf trông như thế nào:

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

Và đó gần như là nó. Chỉ cần khởi động lại pfctlbằng cách phát hành sudo pfctl -dđể vô hiệu hóa nó trước và sau đó sudo pfctl -fe /etc/pf.confbắt đầu lại.

Bây giờ, nếu bạn cần điều này tự động xảy ra sau mỗi lần khởi động lại, một công việc nhỏ khác cần phải được thực hiện: trình nền khởi chạy cho pfctlnhu cầu cần được cập nhật (ý chính tham chiếu đề cập rằng pf được bật tự động khi khởi động, tuy nhiên điều này dường như không phải là trường hợp từ việc nhìn vào mã). Mở (với sudo) System/Library/LaunchDaemons/com.apple.pfctl.plistvà tìm kiếm điều này:

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

và thêm dòng <string>-e</string>để cuối cùng làm cho nó như thế này:

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

Nên làm vậy.

Hãy cẩn thận : Apple không còn cho phép thay đổi các tệp quỷ khởi chạy giống như vậy (không phải với sudo, cũng không phải chmod, cũng không phải bất cứ thứ gì khác). Cách duy nhất là sửa lại cài đặt Bảo vệ toàn vẹn hệ thống : khởi động vào chế độ khôi phục và khởi chạy thiết bị đầu cuối. Kiểm tra trạng thái SIP với csrutil status, nó thường sẽ được kích hoạt. Vô hiệu hóa nó với csrutil disablevà khởi động lại trong chế độ bình thường và sau đó thực hiện các thay đổi cho tệp plist như đã thảo luận ở trên. Sau khi hoàn tất, hãy quay lại chế độ khôi phục và bật lại bảo vệ (vì lý do chính đáng) bằng cách ban hành csrutil enable.

Giải thích: Người ta có thể kiểm tra bằng cách phát ifconfiglệnh đã 127.0.0.1là bí danh (mặc định) cho localhost lo0 - thực tế này đang được sử dụng để tránh phải thêm một bí danh bổ sung cho localhost và chỉ cần sử dụng địa chỉ mặc định trong pf.conftệp.

CẬP NHẬT: Thật không may, có vẻ như việc tải tệp khi khởi động không hoạt động. Tôi vẫn đang cố gắng để được giúp đỡ để sắp xếp nó. Cho đến lúc đó, chạy sudo pfctl -f /etc/pf.confsau khi khởi động không có mẹo.


Cảm ơn vì điều này, điều này đã làm việc cho tôi trong OS X Sierra. Điều rất quan trọng mặc dù tệp chuyển hướng kết thúc bằng một dòng mới.
kadrian

Dường như không an toàn để ghi đè lên các tệp hệ thống như System/Library/LaunchDaemons/com.apple.pfctl.plist; điều này có lẽ sẽ không tồn tại trong một bản cập nhật hệ điều hành?
Tom


1

Từ ngày 10.5 trở đi, OS X đi kèm với một tường lửa mới, hướng đến ứng dụng thay vì ipfw. Nhưng ipfw vẫn được cài đặt. Nếu bạn gặp rắc rối với cú pháp của nó, hãy xem các giao diện đồ họa như WaterRoofhoặc Flying Buttress.

HTH, PEra


1

thứ tự các quy tắc là quan trọng, hãy chắc chắn rằng không có "từ chối tất cả" trước các quy tắc cho phép của bạn, hoặc một cái gì đó tương tự.


Cảm ơn vì lời khuyên nhưng tôi không nghĩ rằng tôi có vấn đề cụ thể đó (danh sách ipfw chỉ hiển thị quy tắc của tôi và 65535 allow ip from any to any).
an toàn

1

Lệnh của bạn dường như thiếu một số quy tắc; thử:

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

(nếu bạn không chạy bằng root, bạn sẽ phải thêm tiền tố vào sudo). Một điều cần kiểm tra là tường lửa được kích hoạt:

sysctl net.inet.ip.fw.enable

Nếu nó trở lại với giá trị 0 (tắt), hãy bật nó bằng:

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

... Và sau đó sắp xếp để nó hoạt động trở lại khi máy tính khởi động lại. Cách "thích hợp" để làm điều này có lẽ là tạo ra một vật phẩm khởi động ( Lingon làm cho việc này khá dễ dàng). Hoặc chỉ sử dụng một trong các công cụ GUI mà PEra đã đề cập và để nó xử lý các chi tiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.