ฉันใช้ iptables เพื่อทำเครื่องหมายแพ็คเก็ตสำหรับผู้ใช้ vpn และทำการแยกอุโมงค์ ผู้ใช้ vpn มีช่องสัญญาณผ่านอินเตอร์เฟส tun0 และผู้ใช้รายอื่นสามารถเข้าถึงอินเทอร์เน็ตได้โดยตรง ทุกอย่างทำงานได้ตามที่คาดหวัง แต่ฉันมีปัญหากับกฎข้อหนึ่งปฏิเสธคือฉันไม่เข้าใจว่ากฎนั้นทำอะไรและไวยากรณ์ ตอนนี้ฉันต้องการเปิดพอร์ตผ่านการเชื่อมต่อ VPN ฉันสามารถทำได้เมื่อฉันลบกฎ OUTPUT REJECT ล่าสุดออกจากนั้นก็ใช้งานได้ดี ฉันควรเพิ่มกฎใดไว้ก่อนกฎการปฏิเสธเพื่ออนุญาตให้พอร์ตทำงานและยังคงกฎการปฏิเสธไว้ได้
export INTERFACE="tun0"
export VPNUSER="vpn"
export LOCALIP="192.168.1.28"
export NETIF="eth0"
# flushes all the iptables rules, if you have other rules to use then add them into the script
iptables -F -t nat
iptables -F -t mangle
iptables -F -t filter
# mark packets from $VPNUSER
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT ! --dest $LOCALIP -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT --dest $LOCALIP -p udp --dport 53 -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT --dest $LOCALIP -p tcp --dport 53 -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT ! --src $LOCALIP -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -j CONNMARK --save-mark
# allow responses
iptables -A INPUT -i $INTERFACE -m conntrack --ctstate ESTABLISHED -j ACCEPT
# allow open TCP port 47657
iptables -A INPUT i $INTERFACE -p tcp --dport 47657 -j ACCEPT
# block everything incoming on $INTERFACE to prevent accidental exposing of ports
iptables -A INPUT -i $INTERFACE -j REJECT
# let $VPNUSER access lo and $INTERFACE
iptables -A OUTPUT -o lo -m owner --uid-owner $VPNUSER -j ACCEPT
iptables -A OUTPUT -o $INTERFACE -m owner --uid-owner $VPNUSER -j ACCEPT
# all packets on $INTERFACE needs to be masqueraded
iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE
# reject connections from predator IP going over $NETIF
iptables -A OUTPUT ! --src $LOCALIP -o $NETIF -j REJECT
ปัญหาเกิดขึ้นกับบรรทัดสุดท้าย:
iptables -A OUTPUT ! --src $LOCALIP -o $NETIF -j REJECT
1) ฉันไม่เข้าใจว่าบรรทัดนี้ทำอะไรและไวยากรณ์
2) ถ้าฉันลบบรรทัดสุดท้ายนี้พอร์ต 47657 จะเปิดและใช้งานอยู่ หากรวมบรรทัดข้างต้นไว้พอร์ตจะถูกปิด ฉันควรใส่กฎอะไรก่อนกฎ OUTPUT REJECT เพื่อให้พอร์ต 47657 เปิดเท่านั้น
ขอบคุณมาก!