iptablesはネットワークファイアウォールを実現する(二)——SNATとDNAT

14130 ワード

個人ブログアドレス:http://www.pojun.tech/ようこそ
前言
前の記事では、Linuxカーネルのファイアウォールの基本的な概念と、4つの表5チェーンに関する知識を簡単に紹介しました.LINUXファイアウォールの紹介を参照してください.さらに,プロトコルとポートをフィルタリングできる単純なネットワークファイアウォールをLinux環境で構築する方法も紹介し,Linux実装ネットワークファイアウォール(一)を参照できる.実際の生産応用では、ファイアウォールの機能が複雑で、私たちが前に紹介した4表5チェーンやパケットの流れのように、実際の応用では重要な役割を果たしています.今日紹介するSNATとDNATは、ファイアウォールルールの構築におけるいくつかの重要な応用です.その中でDNATはLVSクラスタ応用においても重要な役割を果たしていることを後で述べる.
SNATとDNATとは
Network Address Translation(Network Address Translation)は、ネットワークアドレス変換とも呼ばれ、その名の通り、ネットワークデータの伝送中にネットワークアドレスを変換してネットワークデータ伝送の目的を達成することである.詳細については、(ネットワークアドレス変換–Wikipedia)を参照してください. SNAT(ソースアドレス変換)とDNAT(ターゲットアドレス変換)は、ファイアウォールにおけるNATの2つのアプリケーションです.前述したように、ファイアウォールには4つのテーブルがあり、1つのテーブルがnatテーブルであり、このnatテーブルはパケットアドレスを管理するために使用されます.
SNAT
  SNATは、ネットワーク伝送中にソースアドレスを変換するだけである.インターネットにアクセスする過程で、ネットワークはパケット形式で伝送され、パケットには宛先アドレスとソースアドレスが含まれていることはよく知られている.これにより、私たちが要求したサーバがデータを処理した後、データが戻ってくることを保証することができる.SNATは、パケット中のソースアドレスをターゲットアドレスが変換されました.変化し、ローカルエリアネットワーク内のホストのセキュリティも相対的に向上しました.
注記、図中のIPアドレスは筆者の実験環境のIPアドレスであり、理解を増やすため、ついでに以下の実験を行い、実際の生産ではIPアドレスが異なるはずである.
環境の説明
役をつとめる
システム環境
ホスト名
アドレス
機能の説明
WEBサーバ
CentOS 7
web
172.18.3.77
Webサービスの提供
Linuxファイアウォール
CentOS 7
iptables
172.18.2.77 192.168.2.77
ファイアウォール規則の定義
LANユーザー
CentOS 6
lan
192.168.2.66
インターネットにアクセス
  ローカルエリアネットワーク内のホストがインターネット上のサービスを要求する場合にのみ、ソースアドレス変換が発生し、次のデータフロープロセスと組み合わせて理解しやすい.
DNAT
  ローカルエリアネットワークの内部にWEBサービスがセットされているが、インターネットにアクセスしたい場合、どのように解決すればよいか.会社にとって、ipv 4アドレスが1つしかインターネットにリンクされていない可能性がある.  この場合、DNAT、すなわちターゲットアドレス変換に使用する必要がある.次のネットワークトポロジー図から、インターネット上のホストがローカルエリアネットワーク内部のネットワークサービスにアクセスするには、外部ネットワークアドレスを持つファイアウォールまたはルーティングを行います.
役をつとめる
システム環境
ホスト名
アドレス
機能の説明
インターネットユーザー
CentOS 7
web
172.18.3.77
ローカルエリアネットワーク内のWebサービスへのアクセス
Linuxファイアウォール
CentOS 7
iptables
172.18.2.77 192.168.2.77
ファイアウォール規則の定義
ローカルエリアネットワークWEBサービス
CentOS 6
lan
192.168.2.66
Webサービスの提供
ファイアウォールでNATルールを定義するにはどうすればいいですか?
  SNATとDNATに関する多くの概念が紹介されているが、ファイアウォールではNATルールをどのように定義すればよいのだろうか.  以前の文章では、NATテーブルが影響を及ぼすのはPREROUTINGチェーン、INPUTチェーン、OUTPUTチェーン、POSTRAOUTINGチェーンの4つのチェーンであることが知られている.POSTROOUTINGチェーンに定義すべきであり、DNATファイアウォールのフィルタ転送ルールはPREROUTINGチェーンに定義すべきであり、これによりネットワーク要求を転送することができる.
SNATの実験実装
じっけんかんきょう
ファイアウォールのフィルタリングルールをクリアし、SELinuxをオフにしてファイアウォールのルーティング転送機能をオンにし、ローカルエリアネットワーク内のユーザーがpingでインターネットサービスを利用できることを確保する.ネットワークテストを行う

#          
[root@iptables ~]#iptables -F 

#       
[root@iptables ~]#echo 1 > /proc/sys/net/ipv4/ip_forward

#         ping    
[root@lan ~]$ping 172.18.3.77
PING 172.18.3.77 (172.18.3.77) 56(84) bytes of data.
64 bytes from 172.18.3.77: icmp_seq=1 ttl=63 time=1.00 ms
64 bytes from 172.18.3.77: icmp_seq=2 ttl=63 time=1.52 ms


#              
[root@lan ~]$curl http://172.18.3.77
www.google.com



じっけんプロセス
まず192.168.2セグメントの要求に対してSNATアドレス変換を行い、変換後のソースアドレスは172.18.2.77になる
[root@iptables ~]#iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 172.18.2.77


#     nat       
[root@iptables ~]#iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 1 packets, 229 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 1 packets, 229 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 SNAT       all  --  *      *       192.168.2.0/24       0.0.0.0/0            to:172.18.2.77


ローカルエリアネットワークの内部からインターネットのサービスにアクセスするか、正常にアクセスできるか

[root@lan ~]$curl http://172.18.3.77
www.google.com

インターネットのホストで最近のアクセス記録を見ると、最近のアクセス情報が172.18.2.77からアクセスされたことがわかります.これは、ネットワークアドレス変換が発生したことを示しています.

[root@web ~]#tail -1 /var/log/httpd/access_log
172.18.2.77 - - [23/Oct/2017:15:46:35 +0800] "GET / HTTP/1.1" 200 15 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"


SNATのコマンドフォーマットをまとめます

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP

実験によるDNATの実現
じっけんかんきょう
SNAT実験で設定された各種フィルタリングルールをクリアする.インターネットのホストは、ファイアウォールホストにアクセスできるが、ローカルエリアネットワーク内のネットワークサービスにアクセスできず、ファイアウォールの外部ネットワークIPを通じてもアクセスできない.

#            
[root@web ~]#curl http://192.168.2.66
curl: (7) Failed to connect to 192.168.2.66: Network is unreachable

#         IP     
[root@web ~]#curl http://172.18.2.77
curl: (7) Failed connect to 172.18.2.77:80; Connection refused


#            
[root@web ~]#ping 172.18.2.77
PING 172.18.2.77 (172.18.2.77) 56(84) bytes of data.
64 bytes from 172.18.2.77: icmp_seq=1 ttl=64 time=0.857 ms
64 bytes from 172.18.2.77: icmp_seq=2 ttl=64 time=0.642 ms



じっけんプロセス
以前の議論によれば、natテーブルのPREROUTINGチェーンにポリシーを追加し、パブリックネットワークアドレス(172.18.2.77)にアクセスする要求をイントラネットワークアドレス(192.168.2.66)に転送する必要があります.

[root@iptables ~]#iptables -t nat -A PREROUTING -d 172.18.2.77 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.66:80

#           
[root@iptables ~]
#iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 7 packets, 1351 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            172.18.2.77          tcp dpt:80 to:192.168.2.66:80

Chain INPUT (policy ACCEPT 7 packets, 1351 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         


このとき,インターネットホストからネットワークIPを介してローカルエリアネットワーク内サービスにアクセスすると,異なる結果が見られる.


[root@web ~]#curl http://172.18.2.77
LAN SERVER


ローカルエリアネットワーク内のWebサーバのアクセスログを表示すると、外部ネットワークホストからアクセスされたレコードが表示されます.
[root@lan ~]$tail -1 /var/log/httpd/access_log 
172.18.3.77 - - [25/Sep/2017:07:34:18 +0800] "GET / HTTP/1.1" 200 11 "-" "curl/7.29.0"

これでDNATのファイアウォールポリシーが完了しました.
DNATのコマンドフォーマットをまとめます

iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]

上の配置と学習を経て、私たちは簡単なネットワークファイアウォールを構築しました.実際の生産では自分の実際の状況に応じてより詳細な設定を行うことができます.
資料の参考
本文の部分の構想と図示は以下のブログから参考して、ここで敬意を表します.
http://ximenfeibing.blog.51cto.com/8809812/1652136/