本文介紹如何使用iptables來實現NAT轉發,事實上就是將一台機器作為網關(gateway)來使用。我們假設充當網關的機器至少有網卡eth0和eth1,使用eth0表示連接到外網的網卡,使用eth1表示連接到內網交換機上的網卡,內部子網為10.0.0.0,通過NAT機制,內網中的機器可以通過網關機器訪問Internet,而不需要額外的公網IP。
本文中的配置值需要根據具體環境適當更改。
一、Gateway端
1. 給內網網卡配置靜態IP(此前確保另一張外網網卡eth0已經能夠正常訪問Internet。已經為eth1配置過內網靜態IP的可以跳過本步)
sudo ip addr add 10.0.0.11/24 dev eth1
這里假設eth1的IP為10.0.0.11,。
2. 配置NAT規則
sudo iptables -A FORWARD -o eth0 -i eth1 -s 10.0.0.0/24 -m conntrack --ctstate NEW -j ACCEPT sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -t nat -F POSTROUTING sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
第一條規則允許轉發初始網絡包,第二條規則允許轉發已經建立連接后的網絡包,第三條則設置NAT。
接下來需要保存iptables規則,確保每次重啟時能夠加載NAT規則:
2.1 保存iptables規則
sudo iptables-save | sudo tee /etc/iptables.sav
2.2 編輯/etc/rc.local文件,將下面的一行添加到“exit 0”之前:
iptables-restore < /etc/iptables.sav
這樣以后每次重啟機器時都會自動加載NAT相關的iptables規則。
3 啟用路由轉發,編輯/etc/sysctl.conf 文件,刪除起始的“#”,解除
#net.ipv4.ip_forward=1
的注釋。然后使其生效:
sudo sysctl -p
這樣我們就完成了網關一端的設置。
二、Client端
一旦網關機器設置完成,任何OS的客戶端都能夠通過連接到網關而訪問外部網絡。這里以Ubuntu Server作為client為例,假設client的eth0連接到網關eth1所在的內網10.0.0.0上,
1. 為eth0指派靜態IP(需與server端的eth1在同一網段,如果已經配置過則可以跳過本步),編輯/etc/network/interfaces文件:
auto eth0 iface eth0 inet static address 10.0.0.31 netmask 255.255.255.0 gateway 10.0.0.11 dns-nameservers YourDNSServer
因為我們的網關服務端並沒有充當DNS服務器,此處需要額外指定client的DNS服務器,通常從網絡服務提供商(ISP)那里獲得。
2. 接下來配置路由網關
sudo route add default gw 10.0.0.11 dev eth0
使網關配置生效,如果以前已經生成過/etc/resolv.conf文件中的nameserver字段,那么這時client應該已經能夠訪問外部網絡了,否則需要編輯/etc/resolv.conf,添加字段:
nameserver YourDNSServer
由於在/etc/network/interfaces文件中已經配置過dns-nameservers,所以重新啟動client機器時不會影響DNS配置。
此時client已經能夠通過網關機器訪問外網,如果不知道ISP的DNS服務器地址,可以使用OpenDNS作為替代。
三、高級Gateway配置
可以為gateway機器配置DHCP和DNS服務器功能,從而簡化客戶端機器的聯網配置,同時省卻為client配置DNS的過程;
1. 安裝dnsmasq
sudo aptitude install dnsmasq
2. 備份dnsmasq的配置文件以備參考
sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf-backup
3. 編輯dnsmasq的配置文件/etc/dnsmasq.conf,添加下面兩行:
interface=eth1 dhcp-range=10.0.0.100,10.0.0.250,72h
注意這是為gateway機器配置DHCP/DNS,interface字段需要設為該機器連接到內網的那個網卡,同時DHCP的IP池應該在我們之前配置的那個網段中。
4. 重啟dnsmasq服務
sudo /etc/init.d/dnsmasq restart
這樣client端就能夠獲取動態IP和自動解析域名了。