Có thể mô phỏng không có quyền truy cập bên ngoài từ một máy Linux khi phát triển không?


7

Đôi khi tôi tải một ứng dụng lên một máy chủ không có quyền truy cập internet bên ngoài.

Tôi muốn tạo cùng một môi trường trong máy của mình để thử nghiệm một số tính năng trong ứng dụng và tránh các lỗi (như đọc rss từ nguồn bên ngoài).

Tôi đã nghĩ về việc chỉ rút cáp ethernet của mình để mô phỏng, nhưng điều này có vẻ cổ xưa và tôi không biết liệu tôi có đưa ra các ngoại lệ tương tự (đặc biệt trong Python) khi thực hiện việc này so với các giới hạn ở máy chủ không.

Vậy, làm cách nào để mô phỏng "không có quyền truy cập bên ngoài" trong máy phát triển của tôi? Liệu "hủy kích hoạt" giao diện ethernet của tôi và kích hoạt lại sau (với lệnh "không rắc rối") có hoạt động giống như máy chủ không có quyền truy cập bên ngoài không?

Tôi đang sử dụng Ubuntu 10.04. Cảm ơn!

Câu trả lời:


8

Xóa các tuyến mặc định sẽ làm điều này. Bạn có thể hiển thị bảng định tuyến với /sbin/routevà xóa mặc định bằng:

sudo /sbin/route del default

Điều đó sẽ khiến hệ thống của bạn được kết nối với mạng cục bộ, nhưng không biết nơi nào sẽ gửi các gói được định sẵn cho mục đích xa hơn. Điều này có thể mô phỏng chính xác tình huống "không có truy cập bên ngoài".

Bạn có thể đặt nó trở lại route add(ghi nhớ cổng của bạn là gì) hoặc chỉ cần khởi động lại mạng. Tôi vừa thử trên một hệ thống với NetworkManager và hạ gục mặc định hoạt động tốt và tôi có thể khôi phục nó chỉ bằng cách nhấp vào biểu tượng bảng điều khiển và chọn lại mạng cục bộ. Có khả năng NM có thể tự làm điều này trong các sự kiện khác, vì vậy hãy cẩn thận với điều đó.

Một cách tiếp cận khác là sử dụng một iptablesquy tắc để chặn lưu lượng ra bên ngoài. Nhưng tôi nghĩ cách tiếp cận định tuyến có lẽ tốt hơn.


5

Bạn đã viết

Vậy, làm cách nào để mô phỏng "không có quyền truy cập bên ngoài" trong máy phát triển của tôi?

Làm cách nào để "hủy kích hoạt" giao diện ethernet của tôi và kích hoạt lại sau mà không gặp rắc rối?

Đây là hai câu hỏi hay một câu hỏi? Tôi không chắc ý của bạn là gì simulate "no external access". Tuy nhiên, để hủy kích hoạt giao diện ethernet, bạn chỉ cần làm

#ifdown eth0
#ifup eth0

hoặc bất cứ thiết bị internet nào của bạn. Điều này sẽ mang giao diện ethernet của bạn xuống và tương ứng.


Đơn giản, an toàn, chắc chắn để làm việc. Chỉ cần nhớ rằng bạn có thể phải chạy lại ứng dụng khách DHCP của mình (đối với máy tính để bàn, điều này có thể là tự động hoặc bạn có thể phải nhấp vào applet của trình quản lý mạng và chọn "Kết nối").
phunehehe

2

Bạn có thể chạy mã của mình trong một máy ảo (Chế độ người dùng Linux, VServer, OpenVZ, VirtualBox, VMWare, KVM, trộm) mà bạn chỉ cung cấp với giao diện mạng chỉ dành cho máy chủ (nghĩa là không định tuyến từ VM đến bất kỳ nơi nào ngoài máy chủ ).

Nếu bạn chạy ứng dụng như một người dùng chuyên dụng appuser, bạn có thể hạn chế quyền truy cập mạng của người dùng đó. Đảm bảo bạn có iptables(Ubuntu: iptables Cài đặt iptables http://bit.ly/software-small ) và iproute2 ( iplệnh) (Ubuntu: iproute Cài đặt iproute http://bit.ly/software-small , iproute-doc Cài đặt iproute -doc http://bit.ly/software-small ) đã cài đặt. Sau đó, bạn có thể sử dụng iptablesđể đánh dấu giao thông đi từ tiến trình đang chạy như appuser, và ip ruleip routethiết lập một bảng định tuyến thay thế cho người dùng đó.

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
iptables -t mangle -A OUTPUT -m owner --uid-owner appuser -j MARK --set-mark 1

(Lưu ý: chưa được kiểm tra. Xem thêm các ví dụ xáo trộn gói IP của Linux .)


1

Đây là những gì container dành cho ( https://linuxcontainers.org/ ) chúng hơi giống với chroot, nhưng hạt mịn hơn, và có kiểm soát mạng, và những thứ khác nữa.

Thật không may, tôi không biết làm thế nào để sử dụng chúng. (Việc đào tạo của tôi chỉ diễn ra khi biết họ tồn tại và đại khái là những gì họ làm.)

docker là một ứng dụng quản lý các container, bạn không muốn làm thủ công.

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.