対象のLinuxサーバがゲートウェイ(ルーター)として運用している場合で、プライベートネットワークに接続されたホストが外部にアクセスするサービスを制限したいとします。この場合、ゲートウェイとなるホストにおいて、ルーティングを行うNATの処理でアクセス制限を行います。今回は、NAT処理を行うNATポリシーにアクセス制限を設定する方法について解説します。
プライベートネットワークに接続されたホストがNATで外部に出ていく際のアクセス制限
最初に、お題となるネットワーク環境について解説します。
以下のホストbase0はホームネットワークに接続されており、インターネットに接続しているルータ(ホームルーター)を介して、インターネットにアクセスすることができます。
一方で、管理ネットワークに接続しているホストbase1~baseNは、ホストbase0をゲートウェイ(ルーター)として機能させることで、「base1~N→base0 → ホームルーター → インターネット」の経路でインターネットに接続することができます。base0をルーターとして機能させる設定についてはコチラをご覧ください。

さて、ここでホストbase1~Nがインターネットにアクセスするサービスを制限するとしたら、どうするのが良いでしょうか?
(1) ゲートウェイとなるホストのoutboundでアクセス制限を行ってもうまくいかなかった..
管理ネットワークに接続されたホストbase1~Nがインターネットに出て行く経路において、ゲートウェイとなるホストのネットワークインターフェースbr1を通過します。従って、br1のoutboundをアクセス制限すれば、ホストbase1~Nがインターネットにアクセスする制限を設定することができる、思ったのですが…

具体的な操作方法を記述します。上記の図の例では、インターフェースbr1のoutboundにアクセス制限を設定するために、ダイレクトルールを使って、ssh(ポート22)とhttps(ポート443)だけを許可し、それ以外のアクセスを拒否しています。ホストbase0における設定方法は以下のようになります。
# firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -o br1 -p tcp --dport 22 -j ACCEPT
success
# firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -o br1 -p tcp --dport 443 -j ACCEPT
success
# firewall-cmd --direct --add-rule ipv4 filter OUTPUT 100 -o br1 -m state --state RELATED,ESTABLISHED -j ACCEPT
success
# firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1000 -o br1 -j DROP
success
この設定によって、ホストbase0からホームネットワークへのoutboundのアクセス制限は予想した通りになりましたが、base1からbase0でNATしてホームネットワークに接続するアクセスは、まったく制限がかかりませんでした(笑)。作戦失敗。。。
上記では仮想ブリッジbr1に対してアクセス制限を行っていますが、仮想ブリッジのスレーブとなっているネットワークインターフェースenp0s21f0u2c2に対して同じアクセス制限をしましたが、同様にまったく制限がかかりませんでした。
(2) NAT処理を定義するNATポリシーのほうにアクセス制限を設定する
(1)の作戦が失敗したので、次の作戦です。
ホストbase0は、管理ネットワークからホームネットワークへのNAT処理を、NATポリシー「natPolicy」で定義しています(設定の詳細はコチラ)。NATポリシーにもアクセス制限は設定が可能で、最初の設定では「target=ACCESS」(デフォルトで全て許可)としていました。これはNATポリシーに対してinboundのアクセス制限です。
今回は、「target=DROP」(デフォルトで全て拒否)とした上で、許可するサービスにsshとhttpsを追加するように変更します。

設定方法は以下の通りです。
# firewall-cmd --permanent --policy=natPolicy --set-target DROP
success
# firewall-cmd --permanent --policy=natPolicy --add-service=ssh
success
#firewall-cmd --permanent --policy=natPolicy --add-service=https
success
# firewall-cmd --reload
NATポリシーの設定では「–permanent」を指定しないならないので、最後に「firewall-cmd --reload」を実行してライタイムにも反映しています。
この設定では、想定通りのアクセス制限ができるようになりました。
firewalldのアクセス制限はやってみないと分からないことが多い..
私が未熟なせいもありますが、firewalldのアクセス制限は、想像通りにいかないことも多くて、やってみないと分からないことが多かったです。もしかしたら、ここで紹介した方法も、どこかで指定が間違っているのかもしれませんので、もっと良い方法が分かったら教えてください。
広告主へのリンク
オイラが今回のテストに使っているのは、高価なサーバではなくて、安価なミニPC MINISFORUM GK41 というマシンです。LANポートが2つ付いているので、PXEブートのテストにも便利です。



MINISFORUM
GK41
Amazonで見る楽天市場で見るYahoo!ショッピングで見る
更に、このMINISFORUM GK41のUSBポートに以下のUSB-LAN変換アダプタを付けて、LANポートを合計3つにして運用しています。



QUUGE
S-6001W91
Amazonで見る楽天市場で見るYahoo!ショッピングで見る
https://static.affiliate.rakuten.co.jp/widget/html/mw_dynamic_view.html?rakuten_design=slide&rakuten_affiliateId=0ea62065.34400275.0ea62066.204f04c0&rakuten_items=ranking&rakuten_genreId=211368&rakuten_size=728×200&rakuten_pattern=H1C&rakuten_target=_blank&rakuten_theme=gray&rakuten_border=on&rakuten_auto_mode=on&rakuten_genre_title=off&rakuten_pointbackId=a24042739060_3Z56RH_BDM8Z6_2HOM_BS629&rakuten_no_link=off&rakuten_no_afl=off&rakuten_no_logo=off&rakuten_undispGenre=off&rakuten_wmode=off&rakuten_noScrollButton=off&rakuten_bgColor=FFFFFF&rakuten_txtColor=1D54A7&rakuten_captionColor=000000&rakuten_moverColor=C00000&rakuten_recommend=off&rakuten_service_flag=ichiba&rakuten_adNetworkId=a8Net&rakuten_adNetworkUrl=https%3A%2F%2Frpx.a8.net%2Fsvt%2Fejp%3Fa8mat%3D3Z56RH%2BBDM8Z6%2B2HOM%2BBS629%26rakuten%3Dy%26a8ejpredirect%3D&rakuten_searchKeyword=&rakuten_disableLogo=&rakuten_moverItembgColor=&rakuten_moverCaptionColor=&rakuten_slideSpeed=250&rakuten_moreInfoColor=red&rakuten_subTxtColor=&rakuten_loadingImage=auto&rakuten_imageDisplay=auto&rakuten_txtDisplay=auto&rakuten_captionDisplay=auto&rakuten_moreInfoDisplay=auto&rakuten_txtRow=auto&rakuten_captionRow=auto&rakuten_auto_interval=6000&rakuten_imageSize=auto&rakuten_slideCell=auto&rakuten_slideDirection=auto&rakuten_order=0,1,2,3&rakuten_loadingTimeout=0&rakuten_mediaId=20011816&rakuten_measurementId=-_ver–new_18_-&rakuten_pointSiteId=&rakuten_isAdvanced=false&rakuten_isIE=false&rakuten_deviceType=PC&rakuten_itemAmount=20&rakuten_tLogFrequency=10&rakuten_timestamp=1737877302318&rakuten_optout=off&rakuten_deeplink=on&rakuten_pUrl=https%3A%2F%2Frunningdog.mond.jp%2Fblog%2F2025%2F01%2F26%2F%25e7%258a%25ac%25e3%2581%25a7%25e3%2582%2582%25e5%2588%2586%25e3%2581%258b%25e3%2582%258blinux%25e3%2583%258d%25e3%2583%2583%25e3%2583%2588%25e3%2583%25af%25e3%2583%25bc%25e3%2582%25af%25e8%25a8%25ad%25e5%25ae%259a-10-outbound%2F&rakuten_version=20230106&rakuten_datatype=json
このブログにおける関連リンク
犬でも分かるLinuxネットワーク
・犬でも分かるLinuxネットワーク設定(1): nmcliコマンドの使い方
・犬でも分かるLinuxネットワーク設定(2): ボンディング(bonding)
・犬でも分かるLinuxネットワーク設定(3): 仮想ブリッジ
・犬でも分かるLinuxネットワーク設定(4): ボンディング+仮想ブリッジ
・犬でも分かるLinuxネットワーク設定(5):定義ファイルの修正
・犬でも分かるLinuxネットワーク設定(6): ルーティングとNAT
・犬でも分かるLinuxネットワーク設定(7):firewalldによるアクセス制限
・犬でも分かるLinuxネットワーク設定(8):VLAN
・犬でも分かるLinuxネットワーク設定(9):IPエイリアス
・犬でも分かるLinuxネットワーク設定(10):outboundのアクセス制限
・犬でも分かるLinuxネットワーク設定(11):NATポリシーにアクセス制限を設定する


コメント