Truy cập máy chủ web DNAT từ bên trong mạng LAN


12

Tôi có một mạng nhỏ với bộ định tuyến, duy trì kết nối với Internet, máy chủ và một số máy trạm trong mạng cục bộ.

Bản đồ mạng

Máy chủ có nghĩa là được truy cập từ Internet và có một số mục DNAT được đặt trong iptables của bộ định tuyến, như sau:

-A PREROUTING -i ppp0 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10

Các gói bên ngoài đến bộ định tuyến thông qua ppp0giao diện và các gói bên trong đi từ br-lanđó, thực sự bao gồm bộ chuyển đổi và bộ điều hợp WLAN. Vấn đề là, trong khi truy cập bên ngoài hoạt động tốt, cố gắng truy cập máy chủ từ bên trong mạng LAN bởi một IP bên ngoài được phân giải DNS (được gán cho ppp0) không thành công.

Giải pháp duy nhất tôi có thể phát minh là thêm các mục tĩnh vào bộ định tuyến /etc/hoststrỏ đến IP bên trong, nhưng vì không có ký tự đại diện (và tôi có ít nhất ba tên miền cấp cao nhất được gán cho hệ thống đó, không tính hàng chục tên miền phụ), đó là khá giòn và dễ thất bại. Bạn có thể đề nghị một cái gì đó tốt hơn?

Tôi chỉ tìm thấy câu hỏi này , không hữu ích lắm.

Nếu điều đó có liên quan, bộ định tuyến sẽ chạy OpenWRT 10.03 Kamikaze với dnsmasq.


Phiên bản nào của OpenWRT?
Corey S.

@Corey 10.03 Ổn định, nhưng điều đó không liên quan gì đến bản thân openwrt, phải không?
Whitequark

Câu trả lời:


3

Tôi ngạc nhiên rằng sau gần 8 năm, không ai giải thích được cách làm điều này đúng cách bằng cách sử dụng hệ thống cấu hình UCI được sử dụng theo mặc định trong OpenWRT.

Câu trả lời của Steven Thứ hai là chính xác, nhưng nó đang sử dụng iptablescác lệnh trực tiếp, đây là lớp thấp hơn hệ thống cấu hình UCI và tốt nhất là hầu hết người dùng OpenWRT không bị ảnh hưởng nếu có thể.

Cách chính xác để truy cập các máy chủ nội bộ thông qua các tổ hợp IP / cổng công cộng của họ từ một máy chủ nội bộ khác trong UCI là bằng cách bật tùy chọn cấu hình reflectiontheo từng mục tiêu DNAT cụ thể trong tệp /etc/config/firewall. Hành vi này được ghi lại ở đây .

Ví dụ:

config redirect option target 'DNAT' option src 'wan' option dest 'lan' option proto 'tcp' option src_dport '44322' option dest_ip '192.168.5.22' option dest_port '443' option name 'apache HTTPS server' option reflection '1'

Lưu ý: Theo tài liệu OpenWRT được chỉ định, reflectionđược bật theo mặc định. Trong thử nghiệm của tôi, đây không phải là trường hợp.


15

Tôi đã xóa câu trả lời ban đầu của mình, vì tôi không hoàn toàn tin tưởng rằng đó là chính xác. Tôi đã có một thời gian để thiết lập một mạng ảo ảo nhỏ để mô phỏng mạng đang được đề cập đến. Đây là tập hợp các quy tắc tường lửa hoạt động cho tôi (chỉ ở iptables-saveđịnh dạng, chỉ cho natbảng):

-A PREROUTING -d 89.179.245.232/32 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10
-A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.2.0/24 -d 192.168.2.10/32 -p tcp -m multiport --dports 22,25,80,443 -j MASQUERADE

Nguyên POSTROUTINGtắc đầu tiên là cách chia sẻ kết nối internet đơn giản với mạng LAN. Tôi để nó ở đó cho đầy đủ.

Các PREROUTINGquy tắc và lần thứ hai POSTROUTINGquy tắc cùng nhau thành lập NAT thích hợp, để kết nối đến máy chủ thông qua địa chỉ IP bên ngoài có thể xảy ra, cho dù các kết nối có nguồn gốc từ bên ngoài hoặc từ bên trong mạng LAN. Khi các máy khách trên mạng LAN kết nối với máy chủ thông qua địa chỉ IP bên ngoài, máy chủ sẽ thấy các kết nối đến từ địa chỉ IP bên trong của bộ định tuyến (192.168.2.1).

Thật thú vị, hóa ra có một vài biến thể của quy tắc ĐIỂM thứ hai cũng hoạt động. Nếu mục tiêu được thay đổi thành -j SNAT --to-source 192.168.2.1, hiệu ứng (không đáng ngạc nhiên) giống như MASQUERADE: máy chủ thấy các kết nối từ các máy khách LAN cục bộ có nguồn gốc từ địa chỉ IP bên trong của bộ định tuyến . Mặt khác, nếu mục tiêu được thay đổi thành -j SNAT --to-source 89.179.245.232, thì NAT vẫn hoạt động, nhưng lần này máy chủ sẽ thấy các kết nối từ các máy khách LAN cục bộ có nguồn gốc từ địa chỉ IP bên ngoài của bộ định tuyến (89.179.245.232).

Cuối cùng, lưu ý rằng bản gốc PREROUTING/ DNATquy tắc của -i ppp0bạn không hoạt động, bởi vì quy tắc không bao giờ khớp với các gói đến từ các máy khách LAN (vì chúng không vào bộ định tuyến qua ppp0giao diện). Có thể làm cho nó hoạt động bằng cách thêm PREROUTINGquy tắc thứ hai chỉ cho các máy khách LAN nội bộ, nhưng nó sẽ không phù hợp (IMO) và vẫn cần phải tham chiếu rõ ràng đến địa chỉ IP bên ngoài.

Bây giờ, ngay cả sau khi đã đưa ra một giải pháp "kẹp tóc NAT" (hoặc "NAT loopback" hoặc "NAT Reflection" hoặc bất cứ điều gì người ta thích gọi nó) một cách chi tiết, tôi vẫn tin rằng một giải pháp DNS tách đôi - -với các máy khách bên ngoài phân giải IP bên ngoài và các máy khách bên trong phân giải IP bên trong --- sẽ là con đường được khuyến khích hơn. Tại sao? Bởi vì nhiều người hiểu cách DNS hoạt động hơn là hiểu cách NAT hoạt động và một phần lớn trong việc xây dựng các hệ thống tốt là chọn sử dụng các bộ phận có thể bảo trì. Thiết lập DNS có nhiều khả năng được hiểu và do đó được duy trì chính xác, hơn là thiết lập NAT phức tạp (tất nhiên là IMO).


Điều này hoạt động hoàn hảo, cảm ơn bạn rất nhiều! Tôi đồng ý rằng thiết lập DNS tốt hơn, nhưng bạn không thể chuyển tiếp các cổng khác nhau trên cùng một IP bên ngoài tới các máy khác nhau trên mạng LAN với nó. Dù sao, tôi là người duy nhất sẽ duy trì thiết lập này, vì vậy nó vẫn ổn.
Whitequark

Tôi rất vui khi nghe điều này làm việc cho bạn!
Steven Thứ Hai

"IMO" là gì? Tổ chức Khí tượng Quốc tế www.imo.net?
Jonathan Komar

@ macmadness86 IMO == Theo ý kiến ​​của tôi
Steven Thứ Hai ngày

3

Một giải pháp phổ biến là trỏ máy chủ nội bộ của bạn vào máy chủ DNS cục bộ trả về địa chỉ "nội bộ" chính xác cho các tên máy chủ này.

Một giải pháp khác - và chúng tôi đang sử dụng điều này khi tôi làm việc trên tường lửa của Cisco - là viết lại phản hồi DNS trên tường lửa tương ứng với các địa chỉ này. Tôi không nghĩ có những công cụ cho Linux thực hiện việc này ngay bây giờ.

Bạn sẽ có thể định cấu hình định tuyến trên cổng để thực hiện đúng. Bạn có thể cần phải định cấu hình các máy chủ để nhận biết địa chỉ IP được ánh xạ bên ngoài của chúng (ví dụ: bằng cách gán nó cho giao diện giả). Với cấu hình này, giao tiếp từ một hệ thống nội bộ này đến một hệ thống nội bộ khác - sử dụng địa chỉ "bên ngoài" - sẽ đi qua bộ định tuyến.


Hừm. Vì vậy, bạn có đề xuất thêm IP bên ngoài vào giao diện của máy chủ và sau đó định cấu hình bộ định tuyến để nó sẽ chuyển tiếp tất cả các gói đến IP bên ngoài đến từ bên trong mạng LAN đến máy chủ đó không? Thật thú vị, tôi sẽ kiểm tra nó sớm thôi.
Whitequark

Bạn có thể đề nghị cấu hình? Tôi đã thử điều này: ip rule add to 89.179.245.232 dev br-lan table 10; ip route add 89.179.245.232 via 192.168.2.10 dev br-lan table 10và nó không hoạt động.
Whitequark

Có gì trong bảng định tuyến 10? Trên các máy chủ nội bộ, bạn có thể muốn chúng có cả địa chỉ 192.168.xx (để liên lạc cục bộ) và địa chỉ công cộng (dưới dạng bí danh) trên giao diện chính của chúng.
larsks

2

Những gì bạn đang yêu cầu được gọi NAT Loopbackvà yêu cầu bạn thêm quy tắc SNAT để các gói có nguồn gốc từ mạng LAN của bạn đến Máy chủ của bạn sẽ quay trở lại qua bộ định tuyến:

-A POSTROUTING -p tcp -s 192.168.2.0/24 -d 192.168.2.10 -m multiport --dports 22,25,80,443 -j SNAT --to-source 89.179.245.232

Đáng buồn thay, điều đó không làm việc. Ban đầu tôi đã bỏ lỡ -i ppp0tùy chọn trong quy tắc của mình trong câu hỏi, vì điều đó đã được xử lý bởi chuỗi khác; quy tắc này sẽ ngăn việc định tuyến các gói đến từ LAN (và nếu tôi kích hoạt nó, các gói sẽ đi từ nguồn sai và sẽ bị từ chối).
Whitequark

Bạn đã thử chưa? Nó sẽ chỉ ảnh hưởng đến các gói từ mạng LAN của bạn đến IP máy chủ của bạn trên các cổng rất cụ thể đó.
Cuộc bao vây

Vâng, tôi đã làm. (Và tôi cũng đã cố gắng thay đổi quy tắc đầu tiên). Ví dụ: đào gửi một gói đến 192.168.2.1 # 53 và sau đó nhận được phản hồi không mong muốn từ 192.168.2.10 # 53, có hoặc không có quy tắc của bạn.
Whitequark

0

larsks bình luận về việc lưu trữ một phiên bản nội bộ của không gian tên \ nói chung là cách tôi đã xử lý vấn đề này trong quá khứ. Tất nhiên, bạn cần một máy chủ DNS trong nội bộ để thực hiện việc này.


Vâng, tôi đã viết rằng tôi đang sử dụng dnsmasq. Bất kỳ ý tưởng về việc thiết lập thay thế tự động?
Whitequark

Tôi không biết gì về OpenWRT và Kamikaze, nhưng dựa trên những gì tôi đang đọc - nếu bạn thêm phần sau vào /etc/dnsmasq.conf "cname = ext-hostname.domain.com, int-hostname.domain.com"
CurtM

Chà, theo như tôi có thể xác định, dnsmasq cnamekhông hỗ trợ mặt nạ, và do đó không thể áp dụng cho tôi do số lượng tên miền phụ.
Whitequark

0

Tôi đã đưa ra giải pháp sau đây để cho phép mạng khách của mình kết nối với các cổng được chuyển tiếp từ mạng wan của tôi sang mạng lan. Tập lệnh này được đặt trong phần "Mạng -> Tường lửa -> Quy tắc tùy chỉnh" của tôi:

# lookup the public IP (DDNS resolves to this)
wanip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')

# Guest network to LAN
# srcname is the guest network name, this needs to match for iptables
srcname=guest
# CIDR notation of guest and lan networks
srcnet=192.168.15.0/24
tgtnet=192.168.10.0/24
# router (openwrt) IP on lan network
tgtrouter=192.168.10.1
# host on lan network where ports are normally forwarded
tgthost=192.168.10.5
# ports to forward as a list or range
tcpports=8080,9090
udpports=12345

prechain=prerouting_${srcname}_rule
postchain=postrouting_${srcname}_rule

# reset the tables to prevent duplicate rules
iptables -t nat -F ${prechain}
iptables -t nat -F ${postchain}

iptables -t nat -A ${prechain} -s ${srcnet} -d ${wanip}/32 -p tcp -m tcp -m multiport --dports ${tcpports} -m comment --comment "${srcname} NAT reflection TCP DNAT" -j DNAT --to-destination ${tgthost}
iptables -t nat -A ${postchain} -s ${srcnet} -d ${tgthost}/32 -p tcp -m tcp -m multiport --dports ${tcpports} -m comment --comment "${srcname} NAT reflection TCP SNAT" -j SNAT --to-source ${tgtrouter}
iptables -t nat -A ${prechain} -s ${srcnet} -d ${wanip}/32 -p udp -m udp -m multiport --dports ${udpports} -m comment --comment "${srcname} NAT reflection UDP DNAT" -j DNAT --to-destination ${tgthost}
iptables -t nat -A ${postchain} -s ${srcnet} -d ${tgthost}/32 -p udp -m udp -m multiport --dports ${udpports} -m comment --comment "${srcname} NAT reflection UDP SNAT" -j SNAT --to-source ${tgtrouter}

Để hỗ trợ khởi động lại, tôi cần chạy đoạn mã sau từ dòng lệnh ssh trên openwrt (nếu không, tôi tin rằng có một điều kiện cuộc đua trong đó một số quy tắc đã được thêm vào và sau đó bị xóa trong quá trình khởi động lại):

uci set firewall.@include[0].reload="1"
uci commit firewall

Phản xạ NAT được thiết lập cho các kết nối trong mạng LAN với chính nó, nhưng không phải với các mạng khác nếu bạn đã tạo nhiều giao diện để cách ly lưu lượng. Tôi đã thử cấu hình quy tắc chuyển tiếp từ giao diện web, nhưng điều đó sẽ gửi tất cả lưu lượng truy cập đến một cổng từ mạng khách đến máy chủ LAN đó. Ở trên chỉ chặn các yêu cầu đối với IP IP thay vì tất cả lưu lượng mạng.

Một DNS nội bộ có thể được sử dụng thay thế cho điều này, nhưng chỉ khi tất cả các cổng chuyển tiếp chỉ đi đến một máy chủ duy nhất. Nếu bạn có nhiều máy chủ nơi bạn chuyển tiếp các cổng khác nhau, bạn có thể lặp lại quy tắc cho các cổng khác nhau đến các tgthostcổng và cổng IP khác nhau .


Trong hạt nhân hiện tại có conntrackmô-đun phù hợp. Và tất cả những gì bạn cần để giải quyết vấn đề là sử dụng quy tắc duy nhất như thế:iptables -t nat -A POSTROUTING --dst <lan-net> ! --src <lan-gw-ip> -m conntrack --ctstate DNAT --ctorigdst <wan-gw-ip> -j MASQUERADE
Anton Danilov

@AntonDanilov tốt đẹp, tôi thích điều đó. Các quy tắc tôi đã sử dụng dựa trên các quy tắc NAT phản ánh đã có trong OpenWRT cho các kết nối từ cùng một mạng con. Không chắc chắn nếu họ có bất kỳ lý do nào khác cho điều đó ngoài việc có thể được viết trước khi conntrack có sẵn.
BMitch
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.