在詳述端口轉(zhuǎn)發(fā)之前,先講一下我日前遇到的一件事情。本人是搞測(cè)試的,有一廠家拿了一個(gè)服務(wù)器軟件叫我測(cè)試?;趙in2k的,端口號(hào)為881,服務(wù)器直接連接外部網(wǎng)絡(luò),客戶端通過服器ip來(lái)訪問,而他們沒有基于linux的服務(wù)器軟件,照他們意思就必須將服務(wù)器換成windows的。作為一個(gè)linux愛好者,我想大家明白這種痛苦。我翻了一下資料,發(fā)現(xiàn)iptables的端口轉(zhuǎn)發(fā)功能可以解決,折騰了一下午,終于完成任務(wù)。下面將我的方法講一下:思想:利用端口轉(zhuǎn)發(fā),當(dāng)服務(wù)器接收到881端口請(qǐng)求以后,將其轉(zhuǎn)到 10.10.2.200:881上,10.10.2.200再將數(shù)據(jù)返回給請(qǐng)求連接
Eth0:連接ADSL,即ppp0接口
Eth1:連接內(nèi)部網(wǎng)絡(luò),ip為10.10.1.1
10.10.2.200為win2k服務(wù)器,其端口881提供網(wǎng)絡(luò)服務(wù)。
iptbles腳本:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 881 -j DNAT --to-destination 10.10.2.200:881 ;將881請(qǐng)求發(fā)至10.10.2.00:881端口
iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -d 10.10.2.200 -p tcp -m tcp --dport 881 -j SNAT --to-source 10.10.1.1 ;返回a.b.b.d時(shí)數(shù)據(jù)源來(lái)自同一子網(wǎng),就將其源地址更改為10.10.1.1,從eth0發(fā)出,并在連接跟蹤表中查出a.b.c.d 從ppp0進(jìn)來(lái)的,又由ppp0將此數(shù)據(jù)發(fā)出。
當(dāng)然不要忘了加一條允許881端口訪問的語(yǔ)句。 iptables –A INPUT –p tcp –dport 881 –i ppp0 –j ACCEPT
可不可把服務(wù)器放在局域內(nèi),用端口轉(zhuǎn)發(fā)來(lái)實(shí)現(xiàn)呢?答案當(dāng)然是肯定的,既然能把881端口轉(zhuǎn)發(fā),那么21,80這些個(gè)端口更不在話,而且很多服務(wù)器軟件都可以自定義端口,那就在得玩了,只要有合適的端口,即使給局域網(wǎng)每一個(gè)用戶開一個(gè)ftp服務(wù)器也是可的。你想要實(shí)現(xiàn)什么服務(wù)都可以,當(dāng)然是基于端口轉(zhuǎn)發(fā)的。
局域網(wǎng)內(nèi)10.10.2.101是win2k,提供www服務(wù),端口為800
通過服務(wù)器http://serverip:800 進(jìn)行訪問。
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 800 -j DNAT --to-destination 10.10.2.101:800
iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -d 10.10.2.101 -p tcp -m tcp --dport 800 -j SNAT --to-source 10.10.1.1
iptables –A INPUT –p tcp –dport 800 –i ppp0 –j ACCEPT
由于是基于端口轉(zhuǎn)發(fā)實(shí)現(xiàn)的,所以服務(wù)器上只需裝個(gè)iptables來(lái)轉(zhuǎn)發(fā)數(shù)據(jù)就行了,一切服務(wù)由內(nèi)部服務(wù)器完成,這樣的話,我 linux服務(wù)器才真正的算是個(gè)防火墻。
二.IPTABLES防火墻使用經(jīng)驗(yàn)一談
最近架設(shè)了一臺(tái)LINUX的小型服務(wù)器 因?yàn)樾枰袻INUX的機(jī)子作為軟路由器來(lái)使用 所以把使用的一些經(jīng)驗(yàn)談一下。
iptables的功能十分的強(qiáng)大 例如IP轉(zhuǎn)發(fā)和偽裝 防御DoS,掃描和嗅探試的攻擊等等 在這里就不闡述了
我的系統(tǒng)環(huán)境: redhat 7.2, adsl 2m, 8139fast 網(wǎng)卡
1:linux如何所以軟路由功能:
說到這里 大家可能會(huì)想 只要在/etc/rc.d/rc.local加上cat 1 > /proc/sys/net/ipv4/ip_forward就可以了 讓linux具 ip_forward的功能 但你會(huì)發(fā)現(xiàn) 就算這樣設(shè)置你局域網(wǎng)內(nèi)的其他電腦還是不能共享上網(wǎng) 這是為什么 因?yàn)楫?dāng)你只有一個(gè)公網(wǎng)的ip 候 你就必須用到iptables的IP偽裝功能 把IP的偽裝成你公網(wǎng)的IP 那怎么實(shí)現(xiàn)呢 你可以這樣 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 這樣就可以把你所以出去的IP地址偽裝成ppp0的IP地址(因?yàn)槲?ADSL 如有不同可以修改)
2:我不想開放我的端口 但我要在我的電腦上啟用http服務(wù) 并對(duì)外服務(wù):
因?yàn)槟悴幌腴_放除了80以外的端口 你可以這樣 iptables –P INPUT –j DROP 我們用-P來(lái)攔截全部的通信
然后在來(lái)允許哪些端口可以被使用你可以這樣寫:
iptables –A INPUT –p tcp –dport 80 –j ACCEPT
你可以適當(dāng)?shù)陌凑者@樣的格式來(lái)添加自己想開放的端口 當(dāng)然如果你覺得這樣不是很好的管理你也可以新建一個(gè)iptables表 你可以樣做
iptables –N test (新建一個(gè)test表) iptables –A test DROP iptables –A test –p tcp –dport 80 –j ACCEPT(允許80端口被訪問) iptables –A INPUT –j test iptables –A OUTPUT –j test iptables –A FORWARD –j test(這3條的意思指讓INPUT OUTPUT FORWARD都按照test的設(shè)置)
3我想在我內(nèi)網(wǎng)的電腦上架設(shè)ftp服務(wù) 我該怎么做:
這就又要用到iptables 的又一個(gè)強(qiáng)大的功能端口映射了
你可以這樣iptables -t nat -A PREROUTING -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.0.6:21
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.6 -p tcp -m tcp -- dport 25-j SNAT --to-source 192.168.0.1
上面2句話的意思是把服務(wù)器的25端口映射到192.168.0.6這臺(tái)電腦上
4:我不想讓人家可以PING到我
這大概是做防火墻用到最多的一種了 你可以在iptables寫這句話 iptables -A INPUT -p icmp --icmp-type echo-request -i ppp0 -j DROP 如果你前面是新建了一個(gè)新的test表 那也可以這樣寫iptables -A test -p icmp --icmp-type echo-request -i ppp0 -j DROP
這句話就是不允許人家PING我 因?yàn)閜ing用到的是icmp協(xié)議 因?yàn)閕cmp沒有端口可言 所以也不需要指定端口了好了 這就是iptables的幾種比較基本的用法
這里在介紹幾iptbales常用的一些命令
iptables –F 清空所有的iptables的規(guī)則設(shè)置
/sbin/iptables-save > iptables – save 把你的規(guī)則保存下來(lái) 因?yàn)槟闼性O(shè)置的規(guī)則再重新啟動(dòng)后都不會(huì)被保存 所以你必來(lái)寫一個(gè)腳本來(lái)讓他開機(jī)運(yùn)行 所以你就可以用這命令來(lái)保存你的規(guī)則 然后讓他開機(jī)自動(dòng)運(yùn)行就可以了。


