我在 Ubuntu 下正確配置 iptables 時遇到一個小問題。但在此之前,讓我先描述一下網路配置:
我使用的 xDSL 線路以數據機+路由器+DHCP 結尾,服務於 192.168.1.0/24 子網路。我的筆記型電腦和 PC 連接到該網路並分別取得位址 192.168.1.6 和 192.168.1.3。在 PC 上,我有執行 VBox 的 Ubuntu 和 2 個虛擬機器(都是 Ubuntu)。 PC 上的 vboxnet0 介面分配的 IP 為 10.10.10.1,各個虛擬機器獲得 10.10.10.10 和 10.10.10.11。 VM1 運行 Apache Web 伺服器以進行測試。
現在,在我的 PC (192.168.1.3) 上,我可以透過在瀏覽器中輸入位址來存取位於 10.10.10.10 的 VM1 Apache 託管網站。那裡沒有問題。
但是,我希望能夠透過在瀏覽器的網址列中輸入相同的 10.10.10.10,從我的筆記型電腦 (192.168.1.6) 造訪相同的網站。但這是行不通的。由於某些原因我無法連接網路。看來 192.168.1.x 網路上的 IP 位址是未知的。如果有一種方法可以透過 iptables 以簡單的方式配置它,那將是一個很好的開始。
現在,如果該步驟可行,我還希望能夠配置更複雜的設定。使用 192.168.1.3 位址和正確的連接埠位址,我希望能夠將特定的服務請求轉送到正確的虛擬機器實例。例如,192.168.1.3:80 應前往 VM1 並取得 Apache 託管網站。 192.168.1.3:4000(例如),應該轉到 VM2 並在那裡託管 SFTP 服務。簡而言之,我想在 PC 上執行目標連接埠特定路由,以允許連接到 192.168.1.x 網路的電腦和在 10.10.10.x 網路中運行的虛擬機器之間進行雙向通訊。使用 iptables 是否有簡單的解決方案?
這是我現在編寫的一個範例,但無法使轉發正常工作。我確信這裡有很多錯誤 - 這是我在 iptables 上度過的第一天。
clear
# cleaning Firewall Rules , change ACCEPT to DROP if you want to shield
# the server, then you open ports as you need
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# Accepts all established inbound connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# opening INPUT ports (22,80,8080)
iptables -A INPUT --protocol tcp --dport 22 -j ACCEPT && echo "rule input 22 ok"
iptables -A INPUT --protocol tcp --dport 80 -j ACCEPT && echo "rule input 80 ok"
iptables -A INPUT --protocol tcp --dport 443 -j ACCEPT && echo "rule input 443 ok"
iptables -A INPUT --protocol tcp --dport 8080 -j ACCEPT && echo "rule input 8080 ok"
#allow Loopback and networks
iptables -A INPUT -i lo -j ACCEPT && echo "rule 7 ok"
#Accept any input from 10.10.10.0 network in vboxnet0 interface
iptables -A INPUT -s 10.10.10.0/24 -i vboxnet0 -j ACCEPT && echo "rule 8 ok"
#enable Port forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# Opening PREROUTING - Filtering : this make the port forwarding trick.
# Forward as many ports you want to certain machines of the network to provide services such web server, ftp server, etc...
iptables -t nat -A PREROUTING -p tcp -i eth1 -d 192.168.1.0/24 --dport 8080 -j DNAT --to 10.10.10.10:80 && echo "rule 9 ok"
#iptables -t nat -A PREROUTING -p tcp -i eth1 -d xxx.xxx.xxx.xxx --dport 53 -j DNAT --to 10.10.10.14:53 && echo "rule 10 ok"
#iptables -t nat -A PREROUTING -p udp -i eth1 -d xxx.xxx.xxx.xxx --dport 53 -j DNAT --to 10.10.10.14:53 && echo "rule 11 ok"
#iptables -t nat -A PREROUTING -p udp -i eth1 -d xxx.xxx.xxx.xxx --dport 21 -j DNAT --to 10.10.10.16:21 && echo "rule 12 ok"
#Opening FORWARD ports for network services on vlan
iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 80 -j ACCEPT && echo "rule 13 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 21 -j ACCEPT && echo "rule 14 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 68 -j ACCEPT && echo "rule 15 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 22 -j ACCEPT && echo "rule 16 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 53 -j ACCEPT && echo "Rule 17 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p udp --dport 53 -j ACCEPT && echo "Rule 18 ok"
# Opening POSTROUTING PROCESSES
# Netmasking is absolutelly necesary to protect vlan from attacks, only it hides their ip....
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth1 -j MASQUERADE && echo "rule 19 ok"
# Reject all other inbound - default deny unless explicitly allowed policy
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT
# test and display the rules if runs properly
iptables -L
感謝您的任何幫助
馬雷克
答案1
首先,您應該考慮在 VirtualBox 中使用橋接網路的更簡單設定。這實際上會將虛擬機器直接置於 LAN 上,因此它們將獲得 192.168.1.0/24 位址,並且可以直接從 LAN 上的其他電腦存取。
您的 DNAT 規則看起來是正確的,但我懷疑它在 FORWARD 鏈中被阻止。 NAT 封包仍然需要遍歷 FORWARD 鏈,因此需要在那裡接受它們,如下所示:
iptables --append FORWARD --in-interface eth1 --out-interface vboxnet0 --destination 10.10.10.10 --protocol tcp --dport 80 --jump ACCEPT
但是,我建議您在使 NAT 規則發揮作用時將 FORWARD 鏈預設為 ACCEPT。一旦 NAT 工作,就開始限制 FORWARD 鏈。