这个问题是我在 提出的serverfault.com
。它被关闭为题外话,建议在这里提问,在superuser
。操作系统是FreeBSD 13.0
。
我需要建立的设置很简单。用人性化、简单的语言来描述设置如下。
- 我的笔记本电脑通过以太网电缆连接到 ISP。
- 我希望它(我的膝盖)能够传输 WiFi 信号,充当其他设备的 WiFi 路由器。所以我的笔记本电脑将成为 AP 或路由器,随便你怎么称呼。
我想要的结果是我和我的客人可以通过我的笔记本电脑使用互联网。
我按照一些论坛和 FreeBSD 手册操作过,但我的手机仍然无法上网。虽然我可以用笔记本电脑 ping 通它。
dhcpd
我的想法是在网络接口上使用wlan0
。之后,我被教导不要重新发明自行车,而是使用NAT
。在 FreeBSDpf
术语中,它将类似于(取自论坛):。nat on re0 inet from ! (re0) to any -> (re0)
因此,我希望从电缆到 ISP 的所有内容都转换为。我的卑微想法是,某些设备连接到 AP,获取子网的 IP !re0
,然后流量通过路由到电缆连接。re0
re0
wlan0
NAT
re0
现在手机有 IP 了,可以 ping 手机,但是手机上不了网。
我将根据要求更新有关我的实际设置的信息。
请问,如果有人有一些可行的配置,或者分步指南,关于如何让一个简单的事情变得生动...如何让我的笔记本电脑充当典型的 WiFi 路由器?
更新
这是我的 pf 配置。如前所述,我有DHCP
一个在 上运行的服务wlan0
。外部接口 ,re0
配置了静态地址。
# The name of our network interface as seen in `ifconfig`
ext_if="re0"
usb_if="ue0"
wlan_if="wlan0"
all_ifs = "{" $ext_if $usb_if $wlan_if "}"
# Macros to define the set of TCP and UDP ports to open.
# Add additional ports or ranges separated by commas.
# UDP 60000-60010 is mosh control http://mosh.mit.edu/
tcp_services = "{ssh, http, https}"
udp_services = "{60000:60010}"
# If you block all ICMP requests you will break things like path MTU
# discovery. These macros define allowed ICMP types. The additional
# ICMPv6 types are for neighbor discovery (RFC 4861)
icmp_types = "{echoreq, unreach}"
icmp6_types="{echoreq, unreach, 133, 134, 135, 136, 137}"
# Modulate the initial sequence number of TCP packets.
# Broken operating systems sometimes don't randomize this number,
# making it guessable.
tcp_state="flags S/SA keep state"
udp_state="keep state"
# send RST
set block-policy return
# Exempt the loopback interface to prevent services utilizing the
# local loop from being blocked accidentally.
set skip on lo0
# all incoming traffic on external interface is normalized and fragmented
# packets are reassembled.
scrub in on $all_ifs all fragment reassemble
# set a default deny policy.
block in log all
# This is a desktop so be permissive in allowing outgoing connections.
pass out quick modulate state
# Enable antispoofing on the external interface
antispoof for $all_ifs
# block packets that fail a reverse path check. we look up the routing
# table, check to make sure that the outbound is the same as the source
# it came in on. if not, it is probably source address spoofed.
block in from urpf-failed to any
# drop broadcast requests quietly.
block in quick on $all_ifs from any to 255.255.255.255
# Allow the services defined in the macros at the top of the file
pass in on $all_ifs inet proto tcp from any to any port $tcp_services $tcp_state
pass in on $all_ifs inet6 proto tcp from any to any port $tcp_services $tcp_state
pass in on $all_ifs inet proto udp from any to any port $udp_services $udp_state
pass in on $all_ifs inet6 proto udp from any to any port $udp_services $udp_state
# Allow ICMP
pass inet proto icmp all icmp-type $icmp_types keep state
pass inet6 proto icmp6 all icmp6-type $icmp6_types keep state
# forward packets from wlan0 to re0(cable)
nat on $ext_if inet from ! ($ext_if) to any -> ($ext_if)
说实话,上面的内容是我从某个 FreeBSD 论坛复制粘贴过来的。通过上述设置,我可以 ping 通我的手机,但仅此而已。
更新
我已经整理pf.conf
好了
...
nat on $ext_if from $int_network to any -> $ext_if
pass out all
pass in all
...
尽管如此,接口tcpdump
上pflog0
没有任何活动。我不知道有什么简单的方法来测试从发出的网络数据包流量$int_if
。内部网络获得了分配的地址,但应该发往default
网关的数据包却在某个地方丢失了。
更新
tcpdump
在“内部网络”接口上显示,此接口的网关192.168.0.1
正在请求到默认网关的路由。默认网关位于不同的网络上,并且没有将路由添加到路由表中。因此,手机只是继续向default
(有线)网关广播。
dhcpd.conf
我对DNS
的网络进行了更改ISP
,网关(路由器)是192.168.0.1
,其余部分与文件一样。
该命令route add -net <ISP gateway> <192.168.0.1>
起了作用。
为自己标记为半封闭
更新
由于我的 LAN 的特性,WI-FI 加密狗可以随时拔出,所以我不得不添加一些脚本来devd.conf
动态添加/删除从内部网络默认网关到 ISP 默认网关的路由。
只需将两个脚本(rtwn0_up.sh
和rtwn0_down.sh
)放入即可/usr/local/sbin/
。当网络接口处于 UP/DOWN 状态时,通知(调用这些脚本)的可能操作是:
# rtwn0.conf
# /etc/usr/local/devd/
1 notify 100 {
2 match "system" "IFNET"
3 match "subsystem" "rtwn0" # name of the interface for my WI-FI dongle
4 match "type" "LINK_UP"
5 media-type "802.11"
6 action "/usr/local/sbin/rtwn0_up.sh"
7 };
8
9 notify 100 {
10 match "system" "IFNET"
11 match "subsystem" "rtwn0" # name of the interface for my WI-FI dongle
12 match "type" "LINK_DOWN"
13 media-type "802.11"
14 action "/usr/local/sbin/rtwn0_down.sh"
15 };
我搜索了 SO 网站,没有找到类似的问题。不得不承认,阅读FreeBSD
有关有用服务的文档可以节省我很多时间。我才刚刚开始熟悉devd
。但即使在这一点上,我也觉得这是将所有脚本负担集中在一个地方的好方法。
答案1
设置的 NAT 部分归结为
/etc/rc.conf:
ifconfig_re0="..."
ifconfig_wlan0="..."
gateway_enable="YES"
pf_enable="YES"
/etc/pf.conf:
ext_if="re0"
int_if="wlan0"
nat on $ext_if from $int_if:network to any -> ($ext_if)
pass from { lo0, $int_if:network } to any keep state
您必须在其上添加 DHCP。