nftablesでNATを実現
「トライしたかったnftablesの基本(その1)」の続編。今回はNATの超基本であり、内容的には、「今さらながらiptables基本(その2)」と同じである。
参考サイト
ネットワークトポロジー
下記環境にて実現。
左側がNAT内側、右側がNAT外側である。
設定
NAT
$ sudo nft create table ip nat_filter
$ sudo nft create chain ip nat_filter dst_nat {type nat hook prerouting priority dstnat \;}
$ sudo nft create chain ip nat_filter src_nat {type nat hook postrouting priority srcnat \;}
$ sudo nft add rule ip nat_filter src_nat oif enp0s8 masquerade
- ”nat_filter”というテーブル作成
- ”nat_filter”テーブル内に次のNATチェーンを作成
- ”dst_nat”というPreRoutingチェーン
- ”src_nat”というPostRoutingチェーン
- ”src_nat”チェーン内に、NAT(masquerade)外側I/F”enp0s8”としたルールを作成
フィルター
上記NAT設定のみの場合、NAT外側からNAT内側へのアクセスができてしまうので、それを防ぐ設定が必要となる。
$ sudo nft create chain ip nat_filter filter_1 {type filter hook forward priority 0 \; policy drop \;}
$ sudo nft add rule ip nat_filter filter_1 iif enp0s3 oif enp0s8 accept
$ sudo nft add rule ip nat_filter filter_1 ct state related,established accept
- ”nat_filter”テーブル内に、”filter_1”というフィルターチェーン(デフォルトDrop(破棄))を作成
- ”filter_1”内に次のルールを作成
- NAT内側(enp0s3)からNAT外側(enp0s8)へはAccept(許可)
- セッションを保ったものなど(”related”,”established”)はAccept(許可)(NAT外側からNAT内側)
最終的な設定
$ sudo nft -a list ruleset
table ip nat_filter { # handle 1
chain dst_nat { # handle 1
type nat hook prerouting priority dstnat; policy accept;
}
chain src_nat { # handle 2
type nat hook postrouting priority srcnat; policy accept;
oif "enp0s8" masquerade # handle 5
}
chain filter_1 { # handle 6
type filter hook forward priority filter; policy drop;
iif "enp0s3" oif "enp0s8" accept # handle 7
ct state established,related accept # handle 10
}
}
検証
netcat(nc)およびpingによる検証である。
コマンド実行
Client(192.168.10.10)
Server(172.16.0.21)
解説
- Server(IP address: 172.16.0.21)でTCPポート1234で待受
- Client(IP address: 192.168.10.10)から同ポートへTCPアクセス
- Clientでテキスト”From Inside”を送信
- Serverで同内容を受信
- Serverでテキスト”From Outside”を送信
- Clientで同内容を受信
- ClientでTCPセッションクローズ(Ctrl-C入力)
- ServerでClientへpingするが疎通なし
ネットワークキャプチャデータ
上記の状況をWiresharkで取得したもの。いずれも期待値どおりである。
Client
- 青枠:Client(IP address: 192.168.10.10)からServer(IP address: 172.16.0.21)への通信
- 赤枠:Serverへのテキスト”From Inside”の送信
- 赤枠:Serverからのテキスト”From Outside”の受信
Server
- 青枠:Client(NATで変換されたIP address: 172.16.0.1)からServer(IP address: 172.16.0.21)への通信
- 赤枠:Clientからのテキスト”From Inside”の受信
- 赤枠:Clientへのテキスト”From Outside”の送信
- 青枠:Clientへのping応答なし
おわりに
その3では、ebtables相当を実現予定。