「インターネット共有」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
(リンクを修正)
 
(5人の利用者による、間の6版が非表示)
1行目: 1行目:
[[Category:ネットワーク]]
+
[[Category:ネットワーク共有]]
 
[[cs:Internet sharing]]
 
[[cs:Internet sharing]]
 
[[en:Internet sharing]]
 
[[en:Internet sharing]]
19行目: 19行目:
 
== 要件 ==
 
== 要件 ==
   
* サーバーとして機能するマシンにはネットワークデバイスを別に設定する必要があります。
+
サーバーとして機能するマシンにはネットワークデバイスを別に設定する必要があります。このネットワークデバイスにはインターネットアクセスにアクセスするマシンへの正常な [[Wikipedia:ja:データリンク層|w:データリンク層]] が必要です:
* ネットワークデバイスはインターネットにアクセスするマシンと接続します。一つ、または複数のマシンを使うことができます。複数のマシンとインターネットを共有するに[[Wikipedia:ja:スイッチングハブ|スイッチ]]が必要です。一つのマシで共有する場合は、[[Wikipedia:ja:イーサネット・ロスオーバー・ケーブル|クロスオーバーケーブル]]で十分です
+
* 複数のマシンインターネットを共有するため [[Wikipedia:ja:スイッチングハブ|スイッチ]] データリンク層を提供きま
  +
* ワイヤレスデバイスも同様に複数のマシンへ接続を共有できます。[[Wikipedia:ja:ソフトウェアアクセスポイント|ソフトウェアアクセスポイント]] を参照して下さい。
 
{{Note|片方のコンピュータにギガビットイーサネットカードを挿している場合、クロスオーバーケーブルはありません。通常のイーサネットケーブルで動作します。}}
+
* 1台のマシンのみと共有する場合は、[[Wikipedia:ja:イーサネット・クロスオーバー・ケーブル|クロスオーバーケーブル]] で十分です。2台のコンピュータイーサネットカードが [[w:Medium Dependent Interface#Auto_MDI-X|MDI-X]] 機能持つ場合、クロスオーバーケーブルは通常のイーサネットケーブルが使えます。rootで {{ic|ethtool ''interface'' <nowiki>|</nowiki> grep MDI}} を実行すると判別し易くなります。
   
 
== 設定 ==
 
== 設定 ==
28行目: 28行目:
 
このセクションでは、クライアントのコンピュータに接続するネットワークデバイスの名前は '''''net0'''''、インターネットに接続するネットワークデバイスの名前は '''''internet0''''' としています。
 
このセクションでは、クライアントのコンピュータに接続するネットワークデバイスの名前は '''''net0'''''、インターネットに接続するネットワークデバイスの名前は '''''internet0''''' としています。
   
{{Tip|[[Udev#固定デバイス名設定]]を使ってデバイスの名前は変更することができます。}}
+
{{Tip|[[Udev#固定デバイス名設定する]]を使ってデバイスの名前は変更することができます。}}
  +
  +
サーバーコンピュータには、最後の [[#クライアント PC に IP アドレスを割り当てる]] ステップを除くすべての設定がされています。
   
 
=== 固定 IP アドレス ===
 
=== 固定 IP アドレス ===
   
他のマシンに接続したインターフェイスに固定 IPv4 アドレスを割り当てます。アドレスの頭3バイトは他のインターフェイスのアドレスの頭3バイトと違っている必要があります。
+
サーバーコンピュータ上で、他のマシンに接続したインターフェイスに固定 IPv4 アドレスを割り当てます。他のインターフェイスのネットマスクが /24 より大きい場合を除き、アドレスの頭3バイトはインターフェイスのアドレスの頭3バイトと違っている必要があります。
 
# ip link set up dev net0
 
# ip link set up dev net0
# ip addr add 192.168.123.100/24 dev net0 # arbitrary address
+
# ip addr add 192.168.123.100/24 dev net0 # 任意のアドレス
   
起動時に固定 ip を割り当てたい場合、[[netctl]] を使います。
+
起動時に固定 ip を割り当てたい場合、[[ネットワークマネージャ]] を使います。
   
 
=== パケット転送の有効化 ===
 
=== パケット転送の有効化 ===
42行目: 44行目:
 
現在のパケット転送の設定をチェック:
 
現在のパケット転送の設定をチェック:
 
# sysctl -a | grep forward
 
# sysctl -a | grep forward
  +
  +
インターフェース毎に別々の IPv4/IPv6 オプションがあるように、デフォルト毎、インターフェース毎に転送を制御するオプションが存在することに注意して下さい。
   
 
次のコマンドを実行して一時的にパケット転送を有効化:
 
次のコマンドを実行して一時的にパケット転送を有効化:
47行目: 51行目:
   
 
{{Tip|特定のインターフェイスでのみパケット転送を有効にしたい場合は {{ic|1=sysctl net.ipv4.conf.''interface_name''.forwarding=1}} を使ってください。}}
 
{{Tip|特定のインターフェイスでのみパケット転送を有効にしたい場合は {{ic|1=sysctl net.ipv4.conf.''interface_name''.forwarding=1}} を使ってください。}}
  +
  +
{{Warning|システムがネットワークインターフェースの制御に [[systemd-networkd]] を使っている場合、インターフェース毎の IPv4 設定は不可能です。すなわち、systemd のロジックはどのような転送設定も(全インターフェース用の)IPv4 のグローバル設定へ伝搬します。推奨される回避策は firewall を使って特定のインターフェースに対して転送を禁止することです。詳しくは {{man|5|systemd.network}} マニュアルページを参照して下さい。以前の systemd リリース 220/221 に導入されたカーネルの設定を優先する {{ic|1=IPForward=kernel}} セマンティクスはもはや適用されません。[https://github.com/poettering/systemd/commit/765afd5c4dbc71940d6dd6007ecc3eaa5a0b2aa1] [https://github.com/systemd/systemd/blob/a2088fd025deb90839c909829e27eece40f7fce4/NEWS]}}
   
 
再起動した後も設定が残るようにするには {{ic|/etc/sysctl.d/30-ipforward.conf}} を編集:
 
再起動した後も設定が残るようにするには {{ic|/etc/sysctl.d/30-ipforward.conf}} を編集:
56行目: 62行目:
   
 
設定した後は、再起動してから転送が有効になっているか確認するのを推奨します。
 
設定した後は、再起動してから転送が有効になっているか確認するのを推奨します。
 
{{Note|[[systemd-networkd]] はバージョン 220/221 から新しいフォワーディングセマンティクスを導入しています [https://github.com/systemd/systemd/blob/a2088fd025deb90839c909829e27eece40f7fce4/NEWS]。systemd-networkd を使ってネットワークインターフェイスを制御している場合、デフォルトで、systemd-networkd が {{ic|net.*.ip_forward}} の設定を上書きして、転送をオフにしてしまいます。systemd-networkd で上記の設定を使うには systemd-networkd のインターフェイス設定ファイルで {{ic|1=IPForward=kernel}} と設定する必要があります (詳しくは {{ic|man 5 systemd.network}} を参照)。}}
 
   
 
=== NAT の有効化 ===
 
=== NAT の有効化 ===
  +
==== iptables を使う ====
 
 
[[公式リポジトリ]]から {{Pkg|iptables}} パッケージを[[インストール]]してください。iptables を使って NAT を有効化:
 
[[公式リポジトリ]]から {{Pkg|iptables}} パッケージを[[インストール]]してください。iptables を使って NAT を有効化:
   
70行目: 74行目:
   
 
詳細は [[iptables]] の記事を読んで下さい (特に、ルールの保存と、起動時に自動的にルールを適用させる方法の項)。iptables については[[シンプルなステートフルファイアウォール]]のページでも詳しい解説をしています。
 
詳細は [[iptables]] の記事を読んで下さい (特に、ルールの保存と、起動時に自動的にルールを適用させる方法の項)。iptables については[[シンプルなステートフルファイアウォール]]のページでも詳しい解説をしています。
  +
  +
==== nftables を使う ====
  +
{{Pkg|nftables}} を [[インストール]] して下さい。[[nftables]] で NAT を有効にするには、新規/既存のテーブルに prerouting と postrouting チェインを作成する必要があります(両方のチェインが空の場合でも必要):
  +
  +
# nft add table ip nat
  +
# nft add chain ip nat prerouting { type nat hook prerouting priority 0 \; }
  +
# nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
  +
  +
{{Note|IPv6 を使いたい場合、{{ic|ip}} を {{ic|ip6}} で置き換える必要があります。}}
  +
その後、{{ic|internet0}} 用に {{ic|net0}} アドレスをマスカレードする必要があります:
  +
# nft add rule nat postrouting oifname internet0 masquerade
  +
  +
転送に対しさらにいくつかの firewall による制限を追加できます ( [[Nftables#シンプルな IPv4/IPv6 ファイアウォール]] で設定されているような、フィルターテーブルが存在することが前提です):
  +
  +
# nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop}
  +
# nft add rule filter forward ct state related,established accept
  +
# nft add rule filter forward iifname net0 oifname internet0 accept
  +
  +
nftables における NAT の詳細は [https://wiki.nftables.org/wiki-nftables/index.php/Performing_Network_Address_Translation_(NAT) nftables Wiki] を見て下さい。変更を永続化するには [[nftables]] に従って下さい。
  +
  +
==== firewalld を使う ====
  +
  +
{{Pkg|firewalld}} パッケージを [[インストール]] します。[[firewalld]] は、[[nftables]] または [[iptables]] に依存するファイアウォールデーモンです。まず、ネットワークインターフェイスの firewalld ゾーンを変更します。
  +
  +
# firewall-cmd --zone=external --change-interface=internet0 --permanent
  +
# firewall-cmd --zone=internal --change-interface=net0 --permanent
  +
  +
次に、新しいポリシーを追加して、内部ゾーンと外部ゾーンの間でトラフィックが流れるようにします。
  +
  +
# firewall-cmd --permanent --new-policy int2ext
  +
# firewall-cmd --permanent --policy int2ext --add-ingress-zone internal
  +
# firewall-cmd --permanent --policy int2ext --add-egress-zone external
  +
# firewall-cmd --permanent --policy int2ext --set-target ACCEPT
  +
# firewall-cmd --reload
  +
  +
{{Tip|1=firewalld コンセプトページ [https://firewalld.org/documentation/concepts.html] の {{ic|1=Firewall Rules}} セクションに示されているように、{{ic|1=ACCEPT}} よりも厳密なポリシールールを使用できます。
  +
  +
たとえば、{{ic|192.168.2.0/24}} 内のノードのみがインターネットにアクセスできるようにするには、次のようにします。
  +
  +
{{ic|1=firewall-cmd --permanent --policy int2ext --add-rich-rule='rule family=ipv4 source address=192.168.2.0/24 accept'}}
  +
後でルールを再ロードすることを忘れないでください。
  +
{{ic|1=firewall-cmd --reload}}
  +
}}
   
 
=== クライアント PC に IP アドレスを割り当てる ===
 
=== クライアント PC に IP アドレスを割り当てる ===
   
定期的に、複数のマシンで、設定したマシンのインターネット共有を使う場合、[[Wikipedia:ja:Dynamic Host Configuration Protocol|dhcp サーバー]]をインストールすると良いでしょう。
+
定期的に、複数のマシンで、設定したマシンのインターネット共有を使う場合、[[dhcpd]] や [[dnsmasq]] のような [[Wikipedia:ja:Dynamic Host Configuration Protocol|dhcp サーバー]]をインストールすると良いでしょう。その後、各クライアント PC で DHCP クライアント(例えば [[dhcpcd]])を設定してください
   
  +
{{Style|This is not an iptables guide. Expanding the chain with {{ic|iptables -I}} might skip other important rules; if you need to script an ON/OFF switch for this, use custom chain with a jump placed carefully in the INPUT chain.}}
[[dhcpd]] の wiki 記事を読んで dhcp サーバーを追加することができます。その後、クライアント pc に [[dhcpcd]] クライアントをインストールしてください。
 
   
  +
DHCP サーバでは UDP ポート 67 への着信を許可する必要があります。DNS リクエストのために UDP/TCP ポート 53 への着信も許可する必要があります。
特に定期的に使うというわけではないのであれば、手動でクライアントに ip を追加する方法もあります。
 
  +
# iptables -I INPUT -p udp --dport 67 -i net0 -j ACCEPT
  +
# iptables -I INPUT -p udp --dport 53 -s 192.168.123.0/24 -j ACCEPT
  +
# iptables -I INPUT -p tcp --dport 53 -s 192.168.123.0/24 -j ACCEPT
  +
  +
特に定期的に使うというわけではないのであれば、手動でクライアントに IP を追加する方法もあります。
   
 
==== 手動で IP を追加 ====
 
==== 手動で IP を追加 ====
   
  +
{{Style|Duplicates [[Network configuration#Static IP address]].}}
dhcp を使わない場合、クライアント pc で、ip アドレスとデフォルトルートを追加:
 
  +
# ip addr add 192.168.123.201/24 dev eth0 # arbitrary address, first three blocks must match the address from above
 
  +
DHCP を使う代わりに、クライアント PC で、IP アドレスとデフォルトルートを追加:
  +
# ip addr add 192.168.123.201/24 dev eth0 # 任意のアドレス、最初の3ブロックは前述のアドレスと一致している必要があります
 
# ip link set up dev eth0
 
# ip link set up dev eth0
# ip route add default via 192.168.123.100 dev eth0 # same address as in the beginning
+
# ip route add default via 192.168.123.100 dev eth0 # 最初と同じアドレス
   
 
全てのクライアントで DNS サーバーを設定してください。詳しくは [[resolv.conf]] を参照。
 
全てのクライアントで DNS サーバーを設定してください。詳しくは [[resolv.conf]] を参照。
93行目: 147行目:
   
 
PC に接続することはできながら、データを送信することはできない場合 (例えば、クライアント PC がサーバー PC に DHCP リクエストを送った場合、サーバー PC はリクエストを受け取ってクライアントに IP を返すが、クライアントがそれを受け取れずに、タイムアウトしてしまう等)、[https://bbs.archlinux.org/viewtopic.php?pid=1093208 干渉する] [[Iptables]] ルールが設定されていないか確認してください。
 
PC に接続することはできながら、データを送信することはできない場合 (例えば、クライアント PC がサーバー PC に DHCP リクエストを送った場合、サーバー PC はリクエストを受け取ってクライアントに IP を返すが、クライアントがそれを受け取れずに、タイムアウトしてしまう等)、[https://bbs.archlinux.org/viewtopic.php?pid=1093208 干渉する] [[Iptables]] ルールが設定されていないか確認してください。
  +
  +
=== クライアントがインターネットにアクセスできない、または接続できない ===
  +
  +
以下のような症状。クライアントがホストに ping を打つと {{ic|host is down}} となる、LAN 外のデバイス(NAT で転送されるはず)に ping を打つと {{ic|no route to host}} となる、DHCP オファーがブリッジを通らない、などです。
  +
  +
[[docker]] がこれらの問題を引き起こす可能性があることが知られています。{{ic|docker.service}} と {{ic|docker.socket}} を [[停止]] するだけでこの問題は解決します。
  +
  +
[https://github.com/moby/moby/issues/43719 docker github issue]
   
 
== 参照 ==
 
== 参照 ==
* [http://xyne.archlinux.ca/notes/network/dhcp_with_dns.html Xyne's guide and scripts for launching a subnet with DHCP and DNS]
+
* [https://xyne.archlinux.ca/notes/network/dhcp_with_dns.html Xyne's guide and scripts for launching a subnet with DHCP and DNS]
  +
* [[NetworkManager]] でインターネット共有を設定できます

2023年12月28日 (木) 12:59時点における最新版

関連記事

この記事ではあるマシンと他のマシンでインターネット接続を共有する方法を解説します。

要件

サーバーとして機能するマシンにはネットワークデバイスを別に設定する必要があります。このネットワークデバイスにはインターネットアクセスにアクセスするマシンへの正常な w:データリンク層 が必要です:

  • 複数のマシンにインターネットを共有するために スイッチ がデータリンク層を提供できます
  • ワイヤレスデバイスも同様に複数のマシンへ接続を共有できます。ソフトウェアアクセスポイント を参照して下さい。
  • 1台のマシンのみと共有する場合は、クロスオーバーケーブル で十分です。2台のコンピュータのイーサネットカードが MDI-X 機能を持つ場合、クロスオーバーケーブルは不要で通常のイーサネットケーブルが使えます。rootで ethtool interface | grep MDI を実行すると判別し易くなります。

設定

このセクションでは、クライアントのコンピュータに接続するネットワークデバイスの名前は net0、インターネットに接続するネットワークデバイスの名前は internet0 としています。

ヒント: Udev#固定デバイス名を設定するを使ってデバイスの名前は変更することができます。

サーバーコンピュータには、最後の #クライアント PC に IP アドレスを割り当てる ステップを除くすべての設定がされています。

固定 IP アドレス

サーバーコンピュータ上で、他のマシンに接続したインターフェイスに固定 IPv4 アドレスを割り当てます。他のインターフェイスのネットマスクが /24 より大きい場合を除き、アドレスの頭3バイトは両インターフェイスのアドレスの頭3バイトと違っている必要があります。

# ip link set up dev net0
# ip addr add 192.168.123.100/24 dev net0 # 任意のアドレス

起動時に固定 ip を割り当てたい場合、ネットワークマネージャ を使います。

パケット転送の有効化

現在のパケット転送の設定をチェック:

# sysctl -a | grep forward

インターフェース毎に別々の IPv4/IPv6 オプションがあるように、デフォルト毎、インターフェース毎に転送を制御するオプションが存在することに注意して下さい。

次のコマンドを実行して一時的にパケット転送を有効化:

# sysctl net.ipv4.ip_forward=1
ヒント: 特定のインターフェイスでのみパケット転送を有効にしたい場合は sysctl net.ipv4.conf.interface_name.forwarding=1 を使ってください。
警告: システムがネットワークインターフェースの制御に systemd-networkd を使っている場合、インターフェース毎の IPv4 設定は不可能です。すなわち、systemd のロジックはどのような転送設定も(全インターフェース用の)IPv4 のグローバル設定へ伝搬します。推奨される回避策は firewall を使って特定のインターフェースに対して転送を禁止することです。詳しくは systemd.network(5) マニュアルページを参照して下さい。以前の systemd リリース 220/221 に導入されたカーネルの設定を優先する IPForward=kernel セマンティクスはもはや適用されません。[1] [2]

再起動した後も設定が残るようにするには /etc/sysctl.d/30-ipforward.conf を編集:

/etc/sysctl.d/30-ipforward.conf
net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1

設定した後は、再起動してから転送が有効になっているか確認するのを推奨します。

NAT の有効化

iptables を使う

公式リポジトリから iptables パッケージをインストールしてください。iptables を使って NAT を有効化:

# iptables -t nat -A POSTROUTING -o internet0 -j MASQUERADE
# iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i net0 -o internet0 -j ACCEPT
ノート: もちろん、上記は移動体通信でも機能します (ルーティング PC では通常 ppp0 になります)。

詳細は iptables の記事を読んで下さい (特に、ルールの保存と、起動時に自動的にルールを適用させる方法の項)。iptables についてはシンプルなステートフルファイアウォールのページでも詳しい解説をしています。

nftables を使う

nftablesインストール して下さい。nftables で NAT を有効にするには、新規/既存のテーブルに prerouting と postrouting チェインを作成する必要があります(両方のチェインが空の場合でも必要):

# nft add table ip nat
# nft add chain ip nat prerouting { type nat hook prerouting priority 0 \; }
# nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
ノート: IPv6 を使いたい場合、ipip6 で置き換える必要があります。

その後、internet0 用に net0 アドレスをマスカレードする必要があります:

# nft add rule nat postrouting oifname internet0 masquerade

転送に対しさらにいくつかの firewall による制限を追加できます ( Nftables#シンプルな IPv4/IPv6 ファイアウォール で設定されているような、フィルターテーブルが存在することが前提です):

# nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop}
# nft add rule filter forward ct state related,established accept
# nft add rule filter forward iifname net0 oifname internet0 accept

nftables における NAT の詳細は nftables Wiki を見て下さい。変更を永続化するには nftables に従って下さい。

firewalld を使う

firewalld パッケージを インストール します。firewalld は、nftables または iptables に依存するファイアウォールデーモンです。まず、ネットワークインターフェイスの firewalld ゾーンを変更します。

# firewall-cmd --zone=external --change-interface=internet0 --permanent
# firewall-cmd --zone=internal --change-interface=net0 --permanent

次に、新しいポリシーを追加して、内部ゾーンと外部ゾーンの間でトラフィックが流れるようにします。

# firewall-cmd --permanent --new-policy int2ext
# firewall-cmd --permanent --policy int2ext --add-ingress-zone internal
# firewall-cmd --permanent --policy int2ext --add-egress-zone external
# firewall-cmd --permanent --policy int2ext --set-target ACCEPT
# firewall-cmd --reload
ヒント: firewalld コンセプトページ [3]Firewall Rules セクションに示されているように、ACCEPT よりも厳密なポリシールールを使用できます。

たとえば、192.168.2.0/24 内のノードのみがインターネットにアクセスできるようにするには、次のようにします。

firewall-cmd --permanent --policy int2ext --add-rich-rule='rule family=ipv4 source address=192.168.2.0/24 accept' 後でルールを再ロードすることを忘れないでください。

firewall-cmd --reload

クライアント PC に IP アドレスを割り当てる

定期的に、複数のマシンで、設定したマシンのインターネット共有を使う場合、dhcpddnsmasq のような dhcp サーバーをインストールすると良いでしょう。その後、各クライアント PC で DHCP クライアント(例えば dhcpcd)を設定してください。

この記事あるいはセクションで使われている用語や表現には問題が存在します。
議論: This is not an iptables guide. Expanding the chain with iptables -I might skip other important rules; if you need to script an ON/OFF switch for this, use custom chain with a jump placed carefully in the INPUT chain. (議論: トーク:インターネット共有#)

DHCP サーバでは UDP ポート 67 への着信を許可する必要があります。DNS リクエストのために UDP/TCP ポート 53 への着信も許可する必要があります。

# iptables -I INPUT -p udp --dport 67 -i net0 -j ACCEPT
# iptables -I INPUT -p udp --dport 53 -s 192.168.123.0/24 -j ACCEPT
# iptables -I INPUT -p tcp --dport 53 -s 192.168.123.0/24 -j ACCEPT

特に定期的に使うというわけではないのであれば、手動でクライアントに IP を追加する方法もあります。

手動で IP を追加

この記事あるいはセクションで使われている用語や表現には問題が存在します。

DHCP を使う代わりに、クライアント PC で、IP アドレスとデフォルトルートを追加:

# ip addr add 192.168.123.201/24 dev eth0  # 任意のアドレス、最初の3ブロックは前述のアドレスと一致している必要があります
# ip link set up dev eth0
# ip route add default via 192.168.123.100 dev eth0   # 最初と同じアドレス

全てのクライアントで DNS サーバーを設定してください。詳しくは resolv.conf を参照。

これでクライアント PC はインターネットに接続されるはずです。

トラブルシューティング

PC に接続することはできながら、データを送信することはできない場合 (例えば、クライアント PC がサーバー PC に DHCP リクエストを送った場合、サーバー PC はリクエストを受け取ってクライアントに IP を返すが、クライアントがそれを受け取れずに、タイムアウトしてしまう等)、干渉する Iptables ルールが設定されていないか確認してください。

クライアントがインターネットにアクセスできない、または接続できない

以下のような症状。クライアントがホストに ping を打つと host is down となる、LAN 外のデバイス(NAT で転送されるはず)に ping を打つと no route to host となる、DHCP オファーがブリッジを通らない、などです。

docker がこれらの問題を引き起こす可能性があることが知られています。docker.servicedocker.socket停止 するだけでこの問題は解決します。

docker github issue

参照