iptables防火牆詳解(二)

--
基於狀態的iptables
如果按照tcp/ip來劃分連接狀態,有11種之多(課後可以自己去讀一下相關知識)
但iptables裏只有4種狀態;ESTABLISHED、NEW、RELATED及INVALID
這兩個分類是兩個不相干的定義。例如在TCP/IP標準描述下UDP及ICMP數據包是沒有連接狀態的,但在state模塊的描述下,任何數據包都有連接狀態。
    1、ESTABLISHED
    (1)與TCP數據包的關係:首先在防火牆主機上執行SSH Client,並且對網絡上的SSH服務器提出服務請求,而這時送出的第一個數據包就是服務請求的數據包,如果這個數據包能夠成功的穿越防火牆,那麼接下來SSH Server與SSH Client之間的所有SSH數據包的狀態都會是ESTABLISHED。
    (2)與UDP數據包的關係:假設我們在防火牆主機上用firefox應用程序來瀏覽網頁(通過域名方式),而瀏覽網頁的動作需要DNS服務器的幫助才能完成,因此firefox會送出一個UDP數據包給DNS Server,以請求名稱解析服務,如果這個數據包能夠成功的穿越防火牆,那麼接下來DNS Server與firefox之間的所有數據包的狀態都會是ESTABLISHED。
    (3)與ICMP數據包的關係:假設我們在防火牆主機ping指令來檢測網絡上的其他主機時,ping指令所送出的第一個ICMP數據包如果能夠成功的穿越防火牆,那麼接下來剛纔ping的那個主機與防火牆主機之間的所有ICMP數據包的狀態都會是ESTABLISHED。
    由以上的解釋可知,只要第一個數據包能夠成功的穿越防火牆,那麼之後的所有數據包(包含反向的所有數據包)狀態都會是ESTABLISHED。
    2、NEW
    首先我們知道,NEW與協議無關,其所指的是每一條連接中的第一個數據包,假如我們使用SSH client連接SSH server時,這條連接中的第一個數據包的狀態就是NEW。
    3、RELATED
    RELATED狀態的數據包是指被動產生的數據包。而且這個連接是不屬於現在任何連接的。RELATED狀態的數據包與協議無關,只要迴應回來的數據包是因爲本機送出一個數據包導致另一個連接的產生,而這一條新連接上的所有數據包都是屬於RELATED狀態的數據包。
    4、INVALID
    INVALID狀態是指狀態不明的數據包,也就是不屬於以上三種狀態的封包。凡是屬於INVALID狀態的數據包都視爲惡意的數據包,因此所有INVALID狀態的數據包都應丟棄掉,匹配INVALID狀態的數據包的方法如下:
    iptables -A INPUT -p all -m state INVALID -j DROP
    我們應將INVALID狀態的數據包放在第一條。

					|
			隨機		|     80  web
			--------- |--》		
		client			|       server		
		    《--------- |--
			隨機		|     80	
					|
client訪問server過去
第一個數據包(new狀態),如果拒絕,那麼後續包都會被拒絕(因爲後面來的都會是第一個,都爲new狀態)
第一個數據包如果允許過去,那麼後續包的狀態爲established

server返回給client
返回的所有包都爲established

例1:
有下面兩臺機
		172.16.25.2		172.16.25.3
		 client			  server		

172.16.25.2是可以ssh訪問172.16.25.3,也可以elinks訪問172.16.25.3

1,在172.16.25.3上
iptables -P INPUT DROP
iptables -P OUTPUT DROP
這裏就把雙鏈都關掉,172.16.25.2任何訪問都過不來了
2,
按以前的做法
在172.16.25.3上允許別人ssh進來
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
在172.16.25.3上允許別人elinks進來
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

或者把上面四條合下面兩條
iptables -A INPUT -p tcp -m multiport  --dport 22,80 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport  --sport 22,80 -j ACCEPT

把上面的兩條再換成
iptables -A INPUT -p tcp -m multiport  --dport 22,80 -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state established -j ACCEPT
(後面一句可以翻譯成tcp協議的連接只要你進得來,你就回得去)
(無論他是用哪個隨機端口訪問進來的;因爲只要能進來,那麼後續的包都屬於ESTABLISHED狀態)

有些服務器,可能希望你ping不通他,但是他可以ping通你
方法一:
在服務器上把/proc/sys/net/ipv4/icmp_echo_ignore_all的值改爲1
臨時修改
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
永久修改
# vim /etc/sysctl.conf	--加上下面一句
net.ipv4.icmp_echo_ignore_all = 1
# sysctl -p	--使用此命令讓其生效

通過iptables的狀態來實現
有下面兩臺機
172.16.25.2		172.16.25.3

實現172.16.25.3這個IP能ping通所有人.但所有人不能ping通172.16.25.3

					|
		        --------------》|  ------->
		  client		|  server		
	     	 172.16.25.2		|  172.16.25.3
		          <-------------|  <--------   

				   NEW	   ESTABLISHED
			INPUT	   拒絕	  允許
			OUTPUT	  允許	  允許

1,在172.16.25.3上
iptables -P INPUT DROP
iptables -P OUTPUT DROP
這裏就把雙鏈都關掉,172.16.25.9任何訪問都過不來了
2,在172.16.25.3上
iptables -A INPUT -p icmp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED -j ACCEPT
--重點是INPUT那條不能允許NEW狀態的;
--注意第二步的第二條(也就是output這條),如果只寫了NEW狀態,那麼172.16.25.3ping所有人,都只能通第一個包;加上ESTABLISHED狀態,所有包都能通			
例3:
有一個服務器,搭建了http,ftp(主動和被動都要支持,被動端口爲3000-3005)兩個服務(需要開放給所有人訪問),還要開放ssh和ping(但只開放給一個管理ip訪問,比如此IP爲172.16.25.X),其它任何進來的訪問都拒絕
但此服務器要出去訪問別的任何服務,自己的防火牆都要允許

需求一個一個的寫
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT

iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT

iptables -A INPUT -p tcp --dport 3000:3005 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000:3005 -j ACCEPT 

iptables -A INPUT -p tcp --dport 22 -s 172.16.25.X -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -d 172.16.25.X -j ACCEPT

iptables -A INPUT -p icmp -s 172.16.25.X -j ACCEPT
iptables -A OUTPUT -p icmp -d 172.16.25.X -j ACCEPT

iptables -A OUTPUT -p all -m state --state new,established,related -j ACCEPT
iptables -A INPUT -p all -m state --state established,related -j ACCEPT
把上面的綜合起來
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptable -A INPUT -p tcp -m multiport --dport 80,21,20,3000,3001,3002,3003,3004,3005 -j ACCEPT
iptable -A INPUT -p tcp --dport 22 -s 172.16.25.X -j ACCEPT
iptable -A INPUT -p icmp  -s 172.16.25.X -j ACCEPT
iptables -A INPUT -p all -m state --state  established,related -j ACCEPT
iptables -A OUTPUT -p all -m state --state new,established,related -j ACCEPT

=======================================================================================
知識補充:路由
什麼是交換,什麼是路由,什麼是路由表?
交換是指同網絡訪問(兩臺機器連在同一個交換機上,配置同網段的不同ip就可以直接通迅)
路由就是跨網絡訪問(路徑選擇)
路由表是記錄路由信息的表(可以單路由表,也可以多路由表)
			因特網   ---》  物聯網(互聯網+)
  (無數個網絡組成,所以從一個網絡到另一個網絡,中間可能還要經過很多個網絡,必需要走路由)

我們現在討論的是單路由表,你在linux下用route -n查看
# route -n
Kernel IP routing table
Destination     Gateway         Genmask        Flags Metric Ref Use Iface
0.0.0.0         172.16.25.254   0.0.0.0        UG    0      0       0 br0
169.254.0.0     0.0.0.0         255.255.0.0    U     1010   0       0 br0
172.16.25.0     0.0.0.0         255.255.255.0  U     0      0       0 br0
192.168.100.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr1
192.168.101.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr2
192.168.100.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr0

問題1:按上面的路由表來看,如果我ping一個公網IP(如ping 14.215.177.38),應該怎麼走?
答案:
我在本機訪問一個IP,先看目標ip是否爲本地ip,如果是,則直接訪問本地;如果不是,則找路由表裏是否有你訪問的網段,有的話則從這個路由條目後面指定的網卡出去;
如果路由表裏沒有你訪問的網段,則會找默認路由(也就是網關);
如果網關也沒有的話,則會報錯網絡不可達。

問題2:爲什麼route -n能看到這幾條路由(不同機器可能還不一樣)
答案:因爲我對應的網卡有相關網段的ip,所以就會有對應的默認路由(比如我的機器br0網卡ip爲172.16.25.1/24,所以我默認就會有172.16.25.0     0.0.0.0         255.255.255.0   U     0      0        0 br0 這一條路由)

問題3:如何加網關和刪除網關,加網關有什麼要求?
route add default gw  x.x.x.x	--臨時加網關,馬上生效
route del default gw  x.x.x.x 	--臨時刪網關,馬上生效

永久加網關的方法
在網卡配置文件裏/etc/sysconfig/network-scripts/ifcfg-br0
加一句GATEWAY=x.x.x.x;然後重啓network服務生效

加網關只能加你已經有的路由網段裏的一個IP纔行(ping不通此IP都可以)
加網關不需要指定子網掩碼(因爲是已有的一個網段的ip,所以掩碼已經確認了)

問題4:如果你有br0:0這種子接口配置文件,那麼每個文件裏都要寫一個網關嗎?
準確來說:一個路由表上可以加多個網關,但只有一個生效(從上往下找,上面的優先生效;rhel6上面的網關不管通不通,都不會找下面的網關;centos7測試結果爲上面的網關不能通,則自動找下面的網關;上面的網關可以通,則只會找上面的網關)。
但一臺linux是可以做多路由表的,一個路由表一個有效網關,多路由表就是多個網關了。

# route -n
Kernel IP routing table
Destination     Gateway         Genmask        Flags Metric Ref Use Iface
0.0.0.0         172.16.25.150   0.0.0.0        UG    0      0       0 br0
0.0.0.0         172.16.25.254   0.0.0.0        UG    0      0       0 br0
169.254.0.0     0.0.0.0         255.255.0.0    U     1010   0       0 br0
172.16.25.0     0.0.0.0         255.255.255.0  U     0      0       0 br0
192.168.100.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr1
192.168.101.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr2
192.168.100.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr0

問題5:我一臺linux上如果有雙物理網卡,請問可不可以兩個網卡配置同網段的不同IP呢?
假設我的	eth0 172.16.25.5/24		
	    eth1 172.16.25.6/24	

172.16.25.0     0.0.0.0         255.255.255.0   U     0      0     0  eth0
172.16.25.0     0.0.0.0         255.255.255.0   U     0      0     0  eth1

如果兩個網卡同網段,則會有下面兩條路由
172.16.25.0        0.0.0.0         255.255.255.0   U     0    0    0 eth0
172.16.25.0        0.0.0.0         255.255.255.0   U     0    0    0 eth1

它會實現從兩張網卡進來的包,卻從一張網卡出去,問題就產生了。
實驗:
步驟一:
一個虛擬機,開兩個網卡,都爲橋接網絡,配置兩個IP,如下
# ip addr |grep eth 
2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:41:e4:22 brd ff:ff:ff:ff:ff:ff
    inet 172.16.25.5/24 brd 172.16.21.255 scope global br0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:39:c0:e6 brd ff:ff:ff:ff:ff:ff
    inet 172.16.25.6/24 brd 172.16.21.255 scope global eth1
步驟二:
在另一臺機器(我這裏爲宿主機,ip爲172.16.25.1),分別ping上面兩個ip,得到結果爲兩個人的MAC都爲第一個網卡的
# ip neigh |grep -E "^172.16.25.5 |^172.16.25.6 "
172.16.25.5 dev br0 lladdr 52:54:00:41:e4:22 REACHABLE
172.16.25.6 dev br0 lladdr 52:54:00:41:e4:22 REACHABLE
步驟三:
在虛擬機上ifconfig eth1 down關閉172.16.25.6的網卡,宿主機仍然可以ping通172.16.25.6
結論:在linux上,宿主機ping 172.16.25.6,虛擬機172.16.25.5這個網卡也能收到arp請求,並且會幫172.16.25.6迴應(這是由linux默認的內核參數所決定的)
--按arp協議的原理,找誰誰纔會迴應mac地址(找張三,只能張三迴應;找李四,只能李四迴應)。而上面的實驗情況可以比喻成(張三,李四同一臺機器,就是一家人,找張三,張三回,找李四,也張三回)
步驟四:
# vim /etc/sysctl.conf		--加上
net.ipv4.conf.eth0.arp_ignore = 1		
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.eth1.arp_ignore = 1		
net.ipv4.conf.eth1.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

# sysctl -p   --用此命令讓其生效

這幾個參數的目的就是把上面的一家人(張三又迴應張三也迴應李四)的情況變成了原本的arp情況(張三隻能回張三,李四隻能回李四)
最終的效果的是宿主機只能ping通172.16.25.5了,ping不通172.16.25.6了(這就對了,因爲一臺機器雙網卡同網段會路由衝突)

靜態路由
如下圖的實驗:
IP分配如下(掩碼假設全爲24位),做實驗的話使用iptables -F把所有的防火牆規則清空
1.1.1.0/24網段用default來模擬
2.2.2.0/24網段用default1來模擬
3.3.3.0/24網段用default2來模擬
4.4.4.0/24網段用default3來模擬

VM1		  VM2		  	VM3		      VM4
		 eth1(default1)	   eth0(default1)	 eth1(default3)
    	          2.2.2.2   《--》  2.2.2.3    4.4.4.4  
	
		 ip_forward	   ip_forward

eth0 (default)	 eth0(default)	   eth1(default2)	 eth1(default2)
1.1.1.1	 --》	  1.1.1.2	      3.3.3.3 	《--》   3.3.3.4

sip:1.1.1.1    dip:4.4.4.4
返回
sip:4.4.4.4    dip:1.1.1.1

步驟一:
從1.1.1.1 ping 1.1.1.2
在宿主機上ping 1.1.1.2,能通

步驟二:
ping 2.2.2.2 不能通
解決方法:
在vm1上加網關
route add default gw 1.1.1.2

步驟三:
在宿主機加了一個網關指向1.1.1.2的基礎上,我再繼續在宿主機上ping 2.2.2.3 不能通 
解決方法:
在vm3上加網關指向2.2.2.2
route add default gw 2.2.2.2
還要在VM2上打開ip_forward,打開方法有兩種
1,# echo 1 > /proc/sys/net/ipv4/ip_forward	--馬上生效,但重啓後就不生效了
2,# vim /etc/sysctl.conf	
net.ipv4.ip_forward = 1		--改爲1
# sysctl -p			--保存後,使用此命令讓它永久生效

步驟四:
繼續ping 3.3.3.3	不通
解決:再在VM2上route add default gw 2.2.2.3

步驟五:
繼續ping 3.3.3.4    不通
解決:在VM3上打開ip_forward
還要在VM4上route add default gw 3.3.3.3

步驟六
繼續ping 4.4.4.4  不通
解決:如果在VM3上加一個網關指向3.3.3.4,其實是有問題的,因爲VM3上這樣就有兩個網關了。如果你不使用多路由表的做法,這兩個網關只能有一個網關有效。
所以加網關的方式不可行,只能在VM3加路由
route add -net 4.4.4.0 netmask 255.255.255.0 dev eth1

上面終於從1.1.1.1ping到4.4.4.4

那麼如果還有5網段,6網段,7網段,甚至更多(類似因特網),全部靠指網關來通迅不現實。實際的做法就是使用路由協議(rip,ospf,bgp等)來做,這就是動態路由了。
如果我把上面的所有網關和ip_forward去掉,然後手動加上路由(也就是說四臺機都有四個網段的路由),那麼就只能ping通到2.2.2.2,ping2.2.2.3就不通了
linux下可以安裝類似zebra這樣的軟路由軟件,可以把linux模擬成一臺cisco路由器來進行配置。

=============================================================================================
準備三臺虛擬機做實驗(把iptables都先關閉);
--注意:這裏我沒有用宿主機模擬中間的機器(因爲用宿主機有多個子接口的情況下,在做firewalld測試的時候會有不穩定的情況;而且宿主機打開firewalld,那麼就會默認拒絕vnc等,帶來不方便)
    A			      B			   C

  內網(虛擬機)		雙網卡機器(虛擬機)	外網(虛擬機)
			
192.168.100.128 --》 192.168.100.2  eth0	
  
			 ip_forward		

	               172.16.25.2    eth1   《-172.16.25.3
--注意:模擬上面的環境時,宿主機可以模擬中間的雙網卡網關,但不能模擬內網或外網其中一臺(原因是宿主機本來就是與虛擬的所有網段是直通的,你如果把它做爲內網,則它會直接連接外網而不會走中間的網關)
--所以兩種模擬方法:1,宿主機模擬網關,兩臺虛擬機分別模擬內外網;2,不要宿主機,三臺虛擬機來模擬,中間的雙網卡網關使用一臺雙網關的虛擬機模擬,另兩臺用單網卡來模擬

把gateway加上路由功能
# echo "1" > /proc/sys/net/ipv4/ip_forward   --臨時生效
# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
# sysctl -p    --改完後使用此命令,使之修改永久生效

路由功能加了後,網關都指向了gateway這臺物理機,那麼  兩個網段的這兩臺機就能互相ping通

例一:禁止內網192.168.100.128和外網172.16.25.2互ping
iptables -A FORWARD -p icmp -s 192.168.100.128 -j DROP
或者
iptables -A FORWARD -p icmp -s 172.16.25.3 -j DROP

例二:禁止內網192.168.100.128上外網的172.16.25.3這個網站
iptables -A FORWARD -p tcp --dport 80 -s 192.168.100.128 -d 172.16.25.3 -j DROP

===================================================================
問題:這裏我們模擬內外網的訪問,網關互指,中間雙網卡機器打開ip_forward,但實際的網絡訪問環境中,外網客戶會把網關指向你公司的網關嗎?
張三			         李四		王五

  內網用戶			 雙網卡機器		外網服務器
			  (其實就是模擬一個路由器)
192.168.100.128    ---->  192.168.100.2   eth0	
	       	   網關指向	
			 	 打開ip_forward			

	        	      172.16.25.2    eth1      172.16.25.3

				 NAT (network address translation)
把上圖先去掉外網上的網關(因爲實際情況下,別人公司的外網服務器不可能把網關指向你),去掉這個網關後,內外網就不能通了,要靠做NAT才能通

不做NAT的過程:
SIP:192.168.100.128		DIP:172.16.25.3
到達中間路由器,通過路由表裏的路由去找外網
SIP:192.168.100.128		DIP:172.16.25.3
到達外網服務器目的地,然後返回
SIP:172.16.25.3			DIP:192.168.100.128
結果:回不來,因爲目標是一個內網ip地址(這個ip地址每個人在家裏都可以用)

做NAT的過程
SIP:192.168.100.128		DIP:172.16.25.3
到達中間路由器,需要做SNAT
SIP:172.16.25.2			DIP:172.16.25.3
到達外網服務器,然後返回
SIP:172.16.25.3			DIP:172.16.25.2
回到中間路由器,會自動(自動的意思表示你不用寫這個規則)做DNAT
SIP:172.16.25.3			DIP:192.168.100.128

張三		李四			王五
發信人:張三	發信人:李四		發信人:王五	
收信人:王五 --->收信人:王五  -----------> 收信人:李四
			   		   |
		發信人:王五		   |
	 <-----	收信人:張三  <---------------|	
解決方法:在中間網關機器上寫規則
實現內網可以上外網的web
iptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth1 -j SNAT --to-source 172.16.25.2
實現內網可以ping外網
iptables -t nat -A POSTROUTING -p icmp -o eth1 -j SNAT --to-source 172.16.25.2

下面這條不寫協議,也就表示所有內網上外網的都會做SNAT成172.16.25.1這個IP地址
iptables -t nat -A POSTROUTING  -o eth1 -j SNAT --to-source 172.16.25.2

iptables -t nat -A POSTROUTING  -o eth1 -j MASQUERADE	--這條命令和上條命令實現的效果是一樣的,但區別在於MASQUERADE可以動態SNAT成你的公網IP(用於公網IP不固定的情況,比如家用的ADSL拔號上網)

做了SNAT後,並且可以172.16.25.3的/var/log/httpd/access_log裏驗證得到:在你做NAT之前,靠雙網關互指訪問網站,它的訪問日誌裏全是你內網的IP。而做了NAT之後,日誌裏是你公網的IP。

centos7下的做法(這個做法經測試可能不太穩定,如果我中間的機器用宿主機模塊,並且br0有子接口的時候,這樣做有些時候不能成功。所以可以換成三臺虛擬機做就沒發現這個問題)
# firewall-cmd --add-masquerade		(不用指從哪個網卡出了)  
# firewall-cmd --remove-masquerade
================================================================
DNAT  目的地址轉換
	也就是外網是客戶端,要訪問我們內網的服務器,客戶端只是訪問外網IP,內網裏不同的服務器不同的IP,可以使用DNAT把不同的請求轉換到不同的內網服務器

  內網web服務器			     雙網卡機器		     外網客戶
			  (其實就是模擬一個路由器)
192.168.100.128    ---->  192.168.100.2   eth0	
	       	   網關指向	
			 	 打開ip_forward			

	        	      172.16.25.2    eth1             172.16.25.3				

SIP:172.16.25.3	  	  DIP:172.16.25.2
到達雙網卡網關,要做DNAT
SIP:172.16.25.3	  	  DIP:192.168.100.128
到達web服務器,返回
SIP:192.168.100.128 	  DIP:172.16.25.3
通過web服務器網關192.168.100.1回到雙網卡網關機器,自動SNAT回去
SIP:172.16.25.2  	  DIP:172.16.25.3

# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.128
centos7的dnat寫法
# firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.100.128	--tcp的80端口,全部dnat給192.168.100.128這個ip

測試方法:在外網客戶端上elinks -dump 172.16.25.2測試
=================================================================
NPT 網絡端口轉換
(DNPT)
			客戶端	172.16.25.2
			 |
      			 |
			web	172.16.25.3
默認情況web是監聽80端口,如果我把web改成監聽8080.那麼客戶端在elinks 172.16.25.3時就訪問不到,除非elinks 172.16.25.3:8080

在web服務器上寫上一條端口轉換的iptables規則,把訪問80的轉成8080.然後客戶端再去elinks 172.16.25.3不用寫端口也可以訪問成功
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
--注意:前面的snat,dnat,npt寫的--to-source,--to-destination,--to-port全部可以簡寫成--to就好了;只要做寫nat規則,就需要打開ip_forward(npt不需要打開)
centos7下端口80轉成8080
# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
success
dnat和dnpt合起來
# firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.100.128:toport=8080

=================================================================
題目1:
現在我的172.16.13.250(網段爲172.16.13.0/24)是通過公司路由器172.16.13.254可以實際上外網的
請問,我一個kvm的isolated網段(假設爲default1,也就是virbr1這個網卡)的虛擬機192.168.100.128如何才能通過NAT上外網

kvm虛擬機		     宿主機	                    公司路由器  	 公司外網IP
		      virbr1      	br0	   			
192.168.100.128 --》 192.168.100.1   172.16.13.250 -->  172.16.13.254  113.87.160.58

elinks www.qq.com

DNS指向114.114.114.114
dns包的過程
SIP:192.168.100.128	DIP:114.114.114.114
通過網關192.168.100.1到達宿主機,做SNAT
SIP:172.16.13.250  	DIP:114.114.114.114
通過網關172.16.254.254到達公司路由器,做SNAT
SIP:113.87.160.58	DIP:114.114.114.114
到達DNS服務器,解析成功後,返回結果
SIP:114.114.114.114	DIP:113.87.160.58
回到公司路由器,自動DNAT
SIP:114.114.114.114	DIP:172.16.13.250
回到宿主機,自動DNAT
SIP:114.114.114.114	DIP:192.168.100.128	   

總結:
滿足四個條件,這個hostonly虛擬機就可以上外網
1,虛擬機網關指向宿主機的同網段IP(我這個例子裏是指向192.168.100.1)
2,DNS指向公網DNS服務器(我這裏是指向114.114.114.114);這裏DNS也可以指向192.168.100.1,但是要在宿主機上多做一條DNAT,把udp的53端口目標地址DNAT成114.114.114.114
3,宿主機打開ip_forward(因爲寫NAT規則都需要這個要求)
4,宿主機上寫一條SNAT把虛擬機上網的所有數據包SNAT成宿主機上外網的IP(我這裏爲172.16.13.250)
iptables -t nat -A POSTROUTING -o br0 -j SNAT --to-source 172.16.13.250
或者
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE

題目2:
要求:寫出這個電信用戶訪問到雙線web服務器時並返回的IP變化過程(只寫源IP,目標IP,和做SNAT還是DNAT等)
你覺得架構會不會有問題?
192.168.100.100				       192.168.2.100
		電信用戶        網通用戶
		  | 		  |	
192.168.100.1	  |		  | 	       192.168.2.1
    	電信用戶家裏路由器  網通用戶家裏路由器 	
51.1.2.3	  |		 |		61.1.2.3
		  |www.abc.com	 | 				
		  | 	  	 |
71.1.2.3          |		  |		81.1.2.3
	     公司電信路由器   公司網通路由器
10.1.1.1	  |	          |		172.16.21.1
		  |		 |
		  |		 | 
10.1.1.100     eth0 雙線web服務器 eth1		172.16.21.100

這裏應該有智能DNS(DNS服務器會通過SIP是電信還是網通,來智能的解析同一個網站的DIP;在此例中,電信用戶會被解析訪問71.1.2.3,網通用戶會被解析訪問81.1.2.3)

sip:192.168.100.100	dip:71.1.2.3 
通過網關192.168.100.1到達電信用戶家裏路由器,做SNAT
sip:51.1.2.3		dip:71.1.2.3 
通過公網路由到達公司電信路由器,做DNAT
sip:51.1.2.3		dip:10.1.1.100
到達雙線web服務器,返回
sip:10.1.1.100		dip:51.1.2.3
通過網關10.1.1.1返回給公司電信路由器,自動SNAT
sip:71.1.2.3 		dip:51.1.2.3
通過公網路由回到電信用戶家裏路由器,自動DNAT
sip:71.1.2.3 		dip:192.168.100.100


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章