Lưu lượng đầu ra trên các giao diện khác nhau dựa trên cổng đích


23

Câu hỏi của tôi về cơ bản giống như Chỉ cho phép lưu lượng truy cập bên ngoài nhất định trên các giao diện nhất định .

Tôi có hai giao diện eth1(10.0.0.2) và wlan0(192.168.0.2). Tuyến đường mặc định của tôi là cho eth1. Giả sử tôi muốn tất cả lưu lượng https đi qua wlan0. Bây giờ nếu tôi sử dụng giải pháp được đề xuất trong câu hỏi khác, lưu lượng https sẽ đi qua wlan0, nhưng vẫn sẽ có địa chỉ nguồn là eth1(10.0.0.2). Vì địa chỉ này không thể định tuyến cho wlan0cổng, câu trả lời sẽ không bao giờ quay trở lại. Cách dễ dàng là chỉ cần đặt bind-addr đúng cách trong ứng dụng, nhưng trong trường hợp này nó không được áp dụng.

Tôi nghĩ rằng tôi cần phải viết lại src-addr:

# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

Bây giờ tcpdump thấy các gói gửi đi tốt và các gói đang đến 192.168.0.2, tuy nhiên chúng có thể không bao giờ kết thúc trong ứng dụng, bởi vì tất cả những gì tôi từng thấy, là ứng dụng đang gửi lại gói SYN, mặc dù SYN- ACK đã được nhận.

Vì vậy, tôi nghĩ, có lẽ tôi cũng cần phải viết lại địa chỉ đến:

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

nhưng điều đó cũng không hiệu quả. Vì vậy, tôi bị mắc kẹt ở đây. Bất kỳ đề xuất?

Câu trả lời:


24

Bạn đang ở gần.

Lý do thực tế mà ứng dụng không nhìn thấy lưu lượng truy cập trở lại là do bảo vệ giả mạo IP được tích hợp trong kernel. Tức là, lưu lượng truy cập trở lại không khớp với bảng định tuyến và do đó bị loại bỏ. Bạn có thể khắc phục điều này bằng cách tắt bảo vệ giả mạo như thế này:

sudo sysctl net.ipv4.conf.wlan0.rp_filter=0

Nhưng tôi sẽ không đề nghị nó. Cách thích hợp hơn là tạo một thể hiện định tuyến thay thế.

  1. Dấu là cần thiết. Giữ nó
  2. Nguồn NAT cũng cần thiết.
  3. DNAT cuối cùng là không cần thiết, vì vậy bạn có thể loại bỏ nó.

Hãy chắc chắn rằng bạn đã iproutecài đặt gói. Nếu bạn có iplệnh thì bạn đã đặt (trông giống như bạn làm, nhưng nếu không nhận được lệnh đó trước).

Chỉnh sửa /etc/iproute2/rt_tablesvà thêm bảng mới bằng cách nối thêm dòng sau:

200 wlan-route

Sau đó, bạn cần định cấu hình bảng định tuyến mới được đặt tên wlan-routevới một cổng mặc định và tạo quy tắc để gửi lưu lượng truy cập đến bảng đó một cách có điều kiện. Tôi sẽ giả sử cổng mặc định của bạn là 192.168.0.1. Đương nhiên, điều này cần phải phù hợp với mạng thực tế của bạn, và không chỉ là giả định của tôi.

ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route

Kịch bản chú thích cuối cùng của bạn sẽ trông như thế này:

# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

Cảm ơn đã dành thời gian để xem xét điều này. Tuy nhiên, đây đã là những gì tôi đang sử dụng, (như được mô tả trong câu hỏi khác) vì vậy tôi có tuyến đường bổ sung được thiết lập, nhưng nó vẫn giống nhau. Các SYN-ACK quay trở lại 192.168.0.2 nhưng dường như không bao giờ tiếp cận được ứng dụng.
rumpel

Quay lại và đọc câu trả lời của tôi một lần nữa. Tôi đã giải quyết điều đó.
bahamat

Phần về bảo vệ giả mạo? Không thay đổi ngay cả sau khi thử. Xin lỗi, đọc đi đọc lại vài lần, nhưng vẫn chưa nhận được thứ tôi đang thiếu.
rumpel

Bạn cần thêm một srctùy chọn cho các ip routelệnh để chỉ định địa chỉ nguồn chính xác.
David Schwartz

@DavidSchwartz: POSTROUTING SNATsẽ chăm sóc điều đó.
bahamat

8

giải pháp của bahamat là chính xác; tuy nhiên, xin lưu ý rằng cách duy nhất để tôi thực hiện công việc này là vô hiệu hóa rp_filter cho mọi giao diện trong hệ thống, không chỉ hai (eth1 và wlan0 trong trường hợp này) liên quan đến NATing.

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush

(xem ghi chú QUAN TRỌNG ở cuối trang này: Cách định tuyến nâng cao - liên kết được đăng ở đó không còn tồn tại nữa, nhưng tôi đã tìm thấy nó qua máy quay ngược lại)


Cảm ơn câu trả lời này, tôi cũng chỉ có thể làm cho giải pháp bahamats hoạt động khi xem xét câu trả lời của bạn.
Dynalon

đối với tôi trên một hộp Ubuntu 12.04 LTS khá chuẩn, ngoài ra để vô hiệu hóa rp_filter và xóa bộ đệm tuyến đường, tôi cũng phải loại bỏ tên giao diện khỏi các đối số iptables. không có đủ thời gian để điều tra lý do tại sao.
Costin Gușă

0

Một gợi ý: bạn nên luôn luôn sử dụng --sportthay vì --dporttrong chuỗi đầu ra.

NAT thay đổi dportvà điều đó sẽ làm cho quy tắc của bạn không thể thay đổi .


2
Có cái gì tôi không nhận được? Dport, như trong cổng đích, không thể thay đổi. Đó là cổng của dịch vụ mà phiên đang cố gắng tiếp cận, ví dụ: http, ssh, smtp. Hoặc bạn có thể thao và dport nhầm lẫn, hoặc tôi đang thiếu một cái gì đó rõ ràng. : P
Ai đó

0

Tôi nghĩ dưới đây là cần thiết:

ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
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.