인터넷에 연결되어 있지 않다고 가정할 때 모든 HTTP 요청을 로컬 웹 서버로 리디렉션하는 방법
예
- 웹 서버 @IP 192.168.1.1, Apache 실행
- @IP 192.168.1.X의 클라이언트는 XXXX:80-443으로 HTTP 요청을 하며 항상 인터넷에 연결되어 있지 않으므로 이 모든 트래픽은 192.168.1.1:80으로 직접 리디렉션되어야 합니다.
이 작업을 수행하려면 iptables를 사용해야 합니다. 도움을 주셔서 감사합니다 :)
답변1
이것은 에서 가져온 예입니다.http://www.andybev.com/index.php/Using_iptables_and_PHP_to_create_a_captive_portal. 이것이 바로 당신이 원하는 것입니다:
IPTABLES=/sbin/iptables
# Create internet chain
# This is used to authenticate users who have already signed up
$IPTABLES -N internet -t mangle
# First send all traffic via newly created internet chain
# At the prerouting NAT stage this will DNAT them to the local
# webserver for them to signup if they aren't authorised
# Packets for unauthorised users are marked for dropping later
$IPTABLES -t mangle -A PREROUTING -j internet
$IPTABLES -t mangle -A internet -j MARK --set-mark 99
# Redirects web requests from Unauthorised users to internet webserver
$IPTABLES -t nat -A PREROUTING -m mark --mark 99 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1
# Now that we've got to the forward filter, drop all packets
# marked 99 - these are unknown users. We can't drop them earlier
# as there's no filter table
$IPTABLES -t filter -A FORWARD -m mark --mark 99 -j DROP
# Do the same for the INPUT chain to stop people accessing the web through Squid
$IPTABLES -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
$IPTABLES -t filter -A INPUT -p udp --dport 53 -j ACCEPT
$IPTABLES -t filter -A INPUT -m mark --mark 99 -j DROP